Hand_Guards.c
class HandGuardBaseclass HandGuardAndclass HandGuardNotclass HandGuardOrclass HandGuardHasItemInEventclass HandGuardHasWeaponInEventclass HandGuardIsSameItemInHandsclass HandGuardHasDestroyedItemInHandsclass HandGuardHasItemInHandsclass HandGuardHasRoomForItemclass HandGuardCanMoveclass HandGuardCanSwapclass HandGuardCanForceSwapclass HandGuardInstantForceSwap
///@{ guards
/**@class HandGuardBase
* @brief represents guard on a transition from state to state
**/
class HandGuardBase
{
/**@fn GuardCondition
* @brief enable or disable transition based on condition
* @note Item is guaranteed to exist on remote client due to replication relationships
* @note The guard is a boolean operation executed first and which can prevent the transition from firing by returning false
* @return true if transition is allowed
**/
bool GuardCondition(HandEventBase e) { return true; }
};
class HandGuardAnd extends HandGuardBase
{
ref HandGuardBase m_arg0;
ref HandGuardBase m_arg1;
void HandGuardAnd(HandGuardBase arg0 = null, HandGuardBase arg1 = null) { m_arg0 = arg0; m_arg1 = arg1; }
override bool GuardCondition(HandEventBase e)
{
bool result = m_arg0.GuardCondition(e) && m_arg1.GuardCondition(e);
#ifdef ENABLE_LOGGING
if ( LogManager.IsInventoryHFSMLogEnable() )
{
Debug.InventoryHFSMLog("GuardCondition result: " + result + " - " + m_arg0.Type() + " && " + m_arg1.Type(), "HandGuardAnd" , "n/a", "GuardCondition", e.m_Player.ToString() );
}
#endif
return result;
}
};
class HandGuardNot extends HandGuardBase
{
ref HandGuardBase m_arg0;
void HandGuardNot(HandGuardBase arg0 = null) { m_arg0 = arg0; }
override bool GuardCondition(HandEventBase e)
{
bool result = !m_arg0.GuardCondition(e);
#ifdef ENABLE_LOGGING
if ( LogManager.IsInventoryHFSMLogEnable() )
{
Debug.InventoryHFSMLog("GuardCondition result: " + result + " - " + m_arg0.Type(), "HandGuardNot" , "n/a", "GuardCondition", e.m_Player.ToString() );
}
#endif
return result;
}
};
class HandGuardOr extends HandGuardBase
{
ref HandGuardBase m_arg0;
ref HandGuardBase m_arg1;
void HandGuardOr(HandGuardBase arg0 = null, HandGuardBase arg1 = null) { m_arg0 = arg0; m_arg1 = arg1; }
override bool GuardCondition(HandEventBase e)
{
bool result = m_arg0.GuardCondition(e) || m_arg1.GuardCondition(e);
#ifdef ENABLE_LOGGING
if ( LogManager.IsInventoryHFSMLogEnable() )
{
Debug.InventoryHFSMLog("GuardCondition result: " + result + " - " + m_arg0.Type() + " || " + m_arg1.Type(), "HandGuardOr" , "n/a", "GuardCondition", e.m_Player.ToString() );
}
#endif
return result;
}
};
class HandGuardHasItemInEvent extends HandGuardBase
{
protected Man m_Player;
void HandGuardHasItemInEvent(Man p = null) { m_Player = p; }
override bool GuardCondition(HandEventBase e)
{
EntityAI eai = e.GetSrcEntity();
if (eai != NULL /* && CanTakeInHands*/)
{
#ifdef ENABLE_LOGGING
if ( LogManager.IsInventoryHFSMLogEnable() )
{
Debug.InventoryHFSMLog("GuardCondition result: true - " + eai, "HandGuardHasItemInEvent" , "n/a", "GuardCondition", m_Player.ToString() );
}
#endif
return true;
}
#ifdef ENABLE_LOGGING
if ( LogManager.IsInventoryHFSMLogEnable() )
{
Debug.InventoryHFSMLog("GuardCondition result: false - " + eai, "HandGuardHasItemInEvent" , "n/a", "GuardCondition", m_Player.ToString() );
}
#endif
return false;
}
};
class HandGuardHasWeaponInEvent extends HandGuardHasItemInEvent
{
void HandGuardHasWeapoonInEvent (Man p = null) { }
override bool GuardCondition(HandEventBase e)
{
EntityAI eai = e.GetSrcEntity();
bool result = false;
if (eai)
{
if (eai.IsWeapon())
{
result = true;
}
}
#ifdef ENABLE_LOGGING
if ( LogManager.IsInventoryHFSMLogEnable() )
{
Debug.InventoryHFSMLog("GuardCondition result: " + result,"HandGuardHasWeaponInEvent", "n/a", "GuardCondition", e.m_Player.ToString() );
}
#endif
return result;
}
};
class HandGuardIsSameItemInHands extends HandGuardBase
{
protected Man m_Player;
void HandGuardIsSameItemInHands(Man p = null) { m_Player = p; }
override bool GuardCondition(HandEventBase e)
{
bool result = false;
if (e.GetSrcEntity() == m_Player.GetEntityInHands())
{
result = true;
}
#ifdef ENABLE_LOGGING
if ( LogManager.IsInventoryHFSMLogEnable() )
{
Debug.InventoryHFSMLog("GuardCondition result: " + result + " - srcItem = " + e.GetSrcEntity() + " hnd= " + m_Player.GetEntityInHands(), "HandGuardIsSameItemInHands" , "n/a", "GuardCondition", e.m_Player.ToString() );
}
#endif
return result;
}
};
class HandGuardHasDestroyedItemInHands extends HandGuardBase
{
protected Man m_Player;
void HandGuardHasDestroyedItemInHands(Man p = null) { m_Player = p; }
override bool GuardCondition(HandEventBase e)
{
EntityAI hnd = m_Player.GetEntityInHands();
if (e.GetSrcEntity())
{
if (e.GetSrcEntity() == hnd)
{
#ifdef ENABLE_LOGGING
if ( LogManager.IsInventoryHFSMLogEnable() )
{
Debug.InventoryHFSMLog("GuardCondition result: true - has same entity in hands " + hnd, "HandGuardHasDestroyedItemInHands" , "n/a", "GuardCondition", m_Player.ToString() );
}
#endif
return true;
}
if (hnd == null)
{
#ifdef ENABLE_LOGGING
if ( LogManager.IsInventoryHFSMLogEnable() )
{
Debug.InventoryHFSMLog("GuardCondition result: true - hands already empty", "HandGuardHasDestroyedItemInHands" , "n/a", "GuardCondition", m_Player.ToString() );
}
#endif
return true;
}
}
else
{
#ifdef ENABLE_LOGGING
if ( LogManager.IsInventoryHFSMLogEnable() )
{
Debug.InventoryHFSMLog("GuardCondition result: true - hands already empty and item destroyed", "HandGuardHasDestroyedItemInHands" , "n/a", "GuardCondition", m_Player.ToString() );
}
#endif
return true;
}
#ifdef ENABLE_LOGGING
if ( LogManager.IsInventoryHFSMLogEnable() )
{
Debug.InventoryHFSMLog("GuardCondition result: false - destroyed entity not in hands", "HandGuardHasDestroyedItemInHands" , "n/a", "GuardCondition", m_Player.ToString() );
}
#endif
return false;
}
};
class HandGuardHasItemInHands extends HandGuardBase
{
protected Man m_Player;
void HandGuardHasItemInHands(Man p = null) { m_Player = p; }
override bool GuardCondition(HandEventBase e)
{
bool result = false;
if (m_Player.GetEntityInHands())
{
result = true;
}
#ifdef ENABLE_LOGGING
if ( LogManager.IsInventoryHFSMLogEnable() )
{
Debug.InventoryHFSMLog("GuardCondition result: " + result + " - " + m_Player.GetEntityInHands(), "HandGuardHasItemInHands" , "n/a", "GuardCondition", m_Player.ToString() );
}
#endif
return result;
}
};
//! TODO(kumarjac): This guard is unused but it has a fault and doesn't conform with maximimal/minimal checks on "Juncture"/"Remote"
class HandGuardHasRoomForItem extends HandGuardBase
{
protected Man m_Player;
void HandGuardHasRoomForItem(Man p = null) { m_Player = p; }
override bool GuardCondition(HandEventBase e)
{
if (e.GetDst() && e.GetDst().IsValid())
{
if ( !g_Game.IsDedicatedServer())
{
if (m_Player)
m_Player.GetHumanInventory().ClearInventoryReservationEx(e.GetDst().GetItem(),e.GetDst());
}
if (!GameInventory.LocationTestAddEntity(e.GetDst(), false, true, true, true, true, false))
{
#ifdef ENABLE_LOGGING
if ( LogManager.IsInventoryHFSMLogEnable() )
{
Debug.InventoryHFSMLog("GuardCondition result: false - no room at dst=" + InventoryLocation.DumpToStringNullSafe(e.GetDst()), "HandGuardHasRoomForItem" , "n/a", "GuardCondition", m_Player.ToString() );
}
#endif
//if (LogManager.IsInventoryHFSMLogEnable()) hndDebugPrint("[hndfsm] HandGuardHasRoomForItem - no room at dst=" + InventoryLocation.DumpToStringNullSafe(e.GetDst()));
//Error("[hndfsm] HandGuardHasRoomForItem - no room at dst=" + InventoryLocation.DumpToStringNullSafe(e.GetDst()));
return false;
}
if ( !g_Game.IsDedicatedServer())
{
if (m_Player)
m_Player.GetHumanInventory().AddInventoryReservationEx(e.GetDst().GetItem(), e.GetDst(), GameInventory.c_InventoryReservationTimeoutShortMS);
}
#ifdef ENABLE_LOGGING
if ( LogManager.IsInventoryHFSMLogEnable() )
{
Debug.InventoryHFSMLog("GuardCondition result: true", "HandGuardHasRoomForItem" , "n/a", "GuardCondition", m_Player.ToString() );
}
#endif
return true;
}
#ifdef ENABLE_LOGGING
if ( LogManager.IsInventoryHFSMLogEnable() )
{
Debug.InventoryHFSMLog("GuardCondition result: false - e.m_Dst is null", "HandGuardHasRoomForItem" , "n/a", "GuardCondition", m_Player.ToString() );
}
#endif
return false;
}
};
class HandGuardCanMove extends HandGuardBase
{
protected Man m_Player;
void HandGuardCanMove(Man p = null) { m_Player = p; }
override bool GuardCondition(HandEventBase e)
{
HandEventMoveTo es = HandEventMoveTo.Cast(e);
bool result = e.m_IsJuncture || e.m_IsRemote;
if (result == false)
{
result = GameInventory.LocationCanMoveEntity(es.GetSrc(), es.GetDst());
}
#ifdef ENABLE_LOGGING
if ( LogManager.IsInventoryHFSMLogEnable() )
{
Debug.InventoryHFSMLog("GuardCondition result: " + result, "HandGuardCanMove" , "n/a", "GuardCondition", m_Player.ToString() );
}
#endif
return result;
}
};
class HandGuardCanSwap extends HandGuardBase
{
protected Man m_Player;
void HandGuardCanSwap(Man p = NULL) { m_Player = p; }
override bool GuardCondition(HandEventBase e)
{
HandEventSwap es = HandEventSwap.Cast(e);
bool result = e.m_IsJuncture || e.m_IsRemote;
if (result == false)
{
result = GameInventory.CanSwapEntitiesEx(es.GetSrc().GetItem(), es.m_Src2.GetItem());
}
#ifdef ENABLE_LOGGING
if ( LogManager.IsInventoryHFSMLogEnable() )
{
Debug.InventoryHFSMLog("GuardCondition result: " + result, "HandGuardCanSwap" , "n/a", "GuardCondition", m_Player.ToString() );
}
#endif
//if (LogManager.IsInventoryHFSMLogEnable()) hndDebugPrint("[hndfsm] HandGuardCanSwap guard - cannot swap");
return result;
}
};
class HandGuardCanForceSwap extends HandGuardBase
{
protected Man m_Player;
void HandGuardCanForceSwap(Man p = NULL) { m_Player = p; }
override bool GuardCondition(HandEventBase e)
{
HandEventForceSwap es = HandEventForceSwap.Cast(e);
bool result = e.m_IsJuncture || e.m_IsRemote;
if (result == false)
{
result = GameInventory.CanSwapEntitiesEx(es.GetSrc().GetItem(), es.m_Src2.GetItem());
if (result == false && es.m_Dst2)
{
result = GameInventory.CanForceSwapEntitiesEx(es.GetSrc().GetItem(), es.m_Dst, es.m_Src2.GetItem(), es.m_Dst2);
}
}
#ifdef ENABLE_LOGGING
if ( LogManager.IsInventoryHFSMLogEnable() )
{
Debug.InventoryHFSMLog("GuardCondition result: " + result, "HandGuardCanForceSwap" , "n/a", "GuardCondition", m_Player.ToString() );
}
#endif
return result;
}
};
class HandGuardInstantForceSwap extends HandGuardBase
{
protected Man m_Player;
void HandGuardInstantForceSwap(Man p = NULL) { m_Player = p; }
override bool GuardCondition(HandEventBase e)
{
HandEventForceSwap es = HandEventForceSwap.Cast(e);
InventoryLocation src1 = es.m_Src;
InventoryLocation dst2 = es.m_Dst2;
bool result = false;
if (src1.GetType() == InventoryLocationType.CARGO && dst2.GetType() == InventoryLocationType.CARGO)
{
if (src1.GetParent() == dst2.GetParent())
{
result = true;
}
}
#ifdef ENABLE_LOGGING
if (LogManager.IsInventoryHFSMLogEnable())
{
Debug.InventoryHFSMLog("GuardCondition result: " + result, "HandGuardInstantForceSwap" , "n/a", "GuardCondition", m_Player.ToString() );
}
#endif
return result;
}
};
///@} guards