Events.c
class WeaponEventBaseclass WeaponEventMechanismclass WeaponEventTriggerclass WeaponEventTriggerToJamclass WeaponEventTriggerAutoStartclass WeaponEventTriggerAutoEndclass WeaponEventLoad1Bulletclass WeaponEventContinuousLoadBulletStartclass WeaponEventContinuousLoadBulletEndclass WeaponEventUnjamclass WeaponEventAttachMagazineclass WeaponEventUnjammingFailedTimeoutclass WeaponEventUnjammingTimeoutclass WeaponEventDetachMagazineclass WeaponEventSwapMagazineclass WeaponEventHumanCommandActionFinishedclass WeaponEventHumanCommandActionAbortedclass WeaponEventReloadTimeoutclass WeaponEventDryFireTimeoutclass WeaponEventSetNextMuzzleModeclass WeaponEventAnimationclass WeaponEventAnimAttachmentHideclass WeaponEventAnimAttachmentShowclass WeaponEventAnimBulletEjectclass WeaponEventCylinderRotateclass WeaponEventAnimBulletHideclass WeaponEventAnimBulletHide2class WeaponEventAnimBulletInChamberclass WeaponEventAnimBulletInMagazineclass WeaponEventAnimBulletShowclass WeaponEventAnimBulletShow2class WeaponEventAnimCanUnjamEndclass WeaponEventAnimCanUnjamStartclass WeaponEventAnimCockedclass WeaponEventAnimMagazineAttachedclass WeaponEventAnimMagazineDetachedclass WeaponEventAnimMagazineHideclass WeaponEventAnimMagazineShowclass WeaponEventAnimSliderOpenclass WeaponEventAnimUnjammedclass WeaponEventAnimHammerUncockedclass WeaponEventAnimHammerCockedenum WeaponEventIDfunc WeaponEventFactory()func WeaponAnimEventFactory()func CreateWeaponEventFromContext()
/**@enum WeaponEventID
* @brief identifier for events.
* mainly for rpc purposes
**/
enum WeaponEventID
{
UNKNOWN,
MECHANISM,
TRIGGER,
TRIGGER_JAM,
TRIGGER_AUTO_START,
TRIGGER_AUTO_END,
LOAD1_BULLET,
CONTINUOUS_LOADBULLET_START,
CONTINUOUS_LOADBULLET_END,
UNJAM,
ATTACH_MAGAZINE,
UNJAMMING_FAILED_TIMEOUT,
UNJAMMING_TIMEOUT,
DETACH_MAGAZINE,
SWAP_MAGAZINE,
HUMANCOMMAND_ACTION_FINISHED,
HUMANCOMMAND_ACTION_ABORTED,
RELOAD_TIMEOUT,
DRY_FIRE_TIMEOUT,
SET_NEXT_MUZZLE_MODE,
ANIMATION_EVENT,
};
/**@class WeaponEventBase
* @brief represents event that triggers transition from state to state
**/
class WeaponEventBase
{
int m_eventID;
DayZPlayer m_player;
Magazine m_magazine;
void WeaponEventBase (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = 0; m_player = p; m_magazine = m; }
/// returns id from enum WeaponEventID
WeaponEventID GetEventID () { return m_eventID; }
/// returns animation event from anim engine, @see WeaponEvents
WeaponEvents GetAnimEvent () { return -1; }
/// returns eventID in upper 16 bits and AnimEvent in lower 16 bits
int GetPackedType ()
{
int animEvent = GetAnimEvent() & 0x0000ffff;
int evShl = m_eventID << 16;
return evShl | animEvent;
}
void ReadFromContext (ParamsReadContext ctx) { }
void WriteToContext (ParamsWriteContext ctx)
{
int packedType = GetPackedType();
ctx.Write(packedType);
ctx.Write(m_player);
ctx.Write(m_magazine);
}
string DumpToString ()
{
string res = "{ WpnEv id=" + typename.EnumToString(WeaponEventID, GetEventID());
res = res + " pl=" + Object.GetDebugName(m_player);
res = res + " mag=" + Object.GetDebugName(m_magazine);
res = res + " }";
return res;
}
};
/**@brief signalize mechanism manipulation
**/
class WeaponEventMechanism extends WeaponEventBase
{
void WeaponEventMechanism (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.MECHANISM; }
};
/**@brief event when trigger pressed
**/
class WeaponEventTrigger extends WeaponEventBase
{
void WeaponEventTrigger (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.TRIGGER; }
};
/**@brief event when trigger pressed
**/
class WeaponEventTriggerToJam extends WeaponEventBase
{
void WeaponEventTriggerToJam (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.TRIGGER_JAM; }
};
/**@brief event when trigger pressed
**/
class WeaponEventTriggerAutoStart extends WeaponEventBase
{
void WeaponEventTriggerAutoStart (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.TRIGGER_AUTO_START; }
};
/**@brief event when trigger pressed
**/
class WeaponEventTriggerAutoEnd extends WeaponEventBase
{
void WeaponEventTriggerAutoEnd (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.TRIGGER_AUTO_END; }
};
/**@brief event when user wants to load 1 bullet
**/
class WeaponEventLoad1Bullet extends WeaponEventBase
{
void WeaponEventLoad1Bullet (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.LOAD1_BULLET; }
};
/**@brief event when user wants to load N bullets
**/
class WeaponEventContinuousLoadBulletStart extends WeaponEventBase
{
void WeaponEventContinuousLoadBulletStart (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.CONTINUOUS_LOADBULLET_START; }
};
/**@brief event when user wants to end loading of bullets
**/
class WeaponEventContinuousLoadBulletEnd extends WeaponEventBase
{
void WeaponEventContinuousLoadBulletEnd (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.CONTINUOUS_LOADBULLET_END; }
};
/**@brief event when user wants to unjam weapon
**/
class WeaponEventUnjam extends WeaponEventBase
{
void WeaponEventUnjam (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.UNJAM; }
};
/**@brief event when user wants to attach magazine
**/
class WeaponEventAttachMagazine extends WeaponEventBase
{
void WeaponEventAttachMagazine (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.ATTACH_MAGAZINE; }
};
/**@brief triggered when unjamming timer expires
**/
class WeaponEventUnjammingFailedTimeout extends WeaponEventBase
{
void WeaponEventUnjammingFailedTimeout (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.UNJAMMING_FAILED_TIMEOUT; }
};
/**@brief triggered when unjamming failed timer expires
**/
class WeaponEventUnjammingTimeout extends WeaponEventBase
{
void WeaponEventUnjammingTimeout (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.UNJAMMING_TIMEOUT; }
};
/**@brief event when user wants to detach magazine
* @param dst \p inventory location where the magazine will be stored
**/
class WeaponEventDetachMagazine extends WeaponEventBase
{
ref InventoryLocation m_dst;
void WeaponEventDetachMagazine (DayZPlayer p = NULL, Magazine m = NULL, InventoryLocation il = NULL) { m_eventID = WeaponEventID.DETACH_MAGAZINE; m_dst = il; }
override void ReadFromContext (ParamsReadContext ctx)
{
m_dst = new InventoryLocation;
super.ReadFromContext(ctx);
m_dst.ReadFromContext(ctx);
}
override void WriteToContext (ParamsWriteContext ctx)
{
super.WriteToContext(ctx);
m_dst.WriteToContext(ctx);
}
};
/**@brief event when user wants to swap magazine
**/
class WeaponEventSwapMagazine extends WeaponEventBase
{
ref InventoryLocation m_dst;
void WeaponEventSwapMagazine (DayZPlayer p = NULL, Magazine m = NULL, InventoryLocation il = NULL){ m_eventID = WeaponEventID.SWAP_MAGAZINE;m_dst = il; }
override void ReadFromContext (ParamsReadContext ctx)
{
super.ReadFromContext(ctx);
m_dst = new InventoryLocation;
m_dst.ReadFromContext(ctx);
}
override void WriteToContext (ParamsWriteContext ctx)
{
super.WriteToContext(ctx);
m_dst.WriteToContext(ctx);
}
};
/**@brief triggered when animation action finishes
**/
class WeaponEventHumanCommandActionFinished extends WeaponEventBase
{
void WeaponEventHumanCommandActionFinished (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.HUMANCOMMAND_ACTION_FINISHED; }
};
/**@brief triggered when animation action aborts
**/
class WeaponEventHumanCommandActionAborted extends WeaponEventBase
{
void WeaponEventHumanCommandActionAborted (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.HUMANCOMMAND_ACTION_ABORTED; }
};
/**@brief triggered when reload timer expires
**/
class WeaponEventReloadTimeout extends WeaponEventBase
{
void WeaponEventReloadTimeout (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.RELOAD_TIMEOUT; }
};
/**@brief triggered when dry fire timer expires
**/
class WeaponEventDryFireTimeout extends WeaponEventBase
{
void WeaponEventDryFireTimeout (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.DRY_FIRE_TIMEOUT; }
};
/**@brief triggered when dry fire timer expires
**/
class WeaponEventSetNextMuzzleMode extends WeaponEventBase
{
void WeaponEventSetNextMuzzleMode (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.SET_NEXT_MUZZLE_MODE; }
};
class WeaponEventAnimation extends WeaponEventBase
{
WeaponEvents m_type; /// animation event from Human.WeaponEvents
void WeaponEventAnimation (DayZPlayer p = NULL, Magazine m = NULL) { m_eventID = WeaponEventID.ANIMATION_EVENT; }
override int GetAnimEvent () { return m_type; }
};
/// creates weapon fsm events
WeaponEventBase WeaponEventFactory (WeaponEventID id, int aetype, DayZPlayer p = NULL, Magazine m = NULL)
{
switch (id)
{
case WeaponEventID.UNKNOWN: return null;
case WeaponEventID.MECHANISM: return new WeaponEventMechanism(p, m);
case WeaponEventID.TRIGGER: return new WeaponEventTrigger(p, m);
case WeaponEventID.TRIGGER_JAM: return new WeaponEventTriggerToJam(p, m);
case WeaponEventID.LOAD1_BULLET: return new WeaponEventLoad1Bullet(p, m);
case WeaponEventID.CONTINUOUS_LOADBULLET_START: return new WeaponEventContinuousLoadBulletStart(p, m);
case WeaponEventID.CONTINUOUS_LOADBULLET_END: return new WeaponEventContinuousLoadBulletEnd(p, m);
case WeaponEventID.UNJAM: return new WeaponEventUnjam(p, m);
case WeaponEventID.ATTACH_MAGAZINE: return new WeaponEventAttachMagazine(p, m);
case WeaponEventID.UNJAMMING_FAILED_TIMEOUT: return new WeaponEventUnjammingFailedTimeout(p, m);
case WeaponEventID.UNJAMMING_TIMEOUT: return new WeaponEventUnjammingTimeout(p, m);
case WeaponEventID.DETACH_MAGAZINE: return new WeaponEventDetachMagazine(p, m);
case WeaponEventID.SWAP_MAGAZINE: return new WeaponEventSwapMagazine(p, m);
case WeaponEventID.HUMANCOMMAND_ACTION_FINISHED: return new WeaponEventHumanCommandActionFinished(p, m);
case WeaponEventID.HUMANCOMMAND_ACTION_ABORTED: return new WeaponEventHumanCommandActionAborted(p, m);
case WeaponEventID.RELOAD_TIMEOUT: return new WeaponEventReloadTimeout(p, m);
case WeaponEventID.DRY_FIRE_TIMEOUT: return new WeaponEventDryFireTimeout(p, m);
case WeaponEventID.SET_NEXT_MUZZLE_MODE: return new WeaponEventSetNextMuzzleMode(p, m);
case WeaponEventID.ANIMATION_EVENT: return WeaponAnimEventFactory(aetype, p, m);
}
return NULL;
}
/// creates animation system events
WeaponEventBase WeaponAnimEventFactory (WeaponEvents type, DayZPlayer p = NULL, Magazine m = NULL)
{
switch (type)
{
case WeaponEvents.ATTACHMENT_HIDE: return new WeaponEventAnimAttachmentHide(p, m);
case WeaponEvents.ATTACHMENT_SHOW: return new WeaponEventAnimAttachmentShow(p, m);
case WeaponEvents.BULLET_EJECT: return new WeaponEventAnimBulletEject(p, m);
case WeaponEvents.BULLET_HIDE: return new WeaponEventAnimBulletHide(p, m);
case WeaponEvents.BULLET_HIDE2: return new WeaponEventAnimBulletHide2(p, m);
case WeaponEvents.BULLET_IN_CHAMBER: return new WeaponEventAnimBulletInChamber(p, m);
case WeaponEvents.BULLET_IN_MAGAZINE: return new WeaponEventAnimBulletInMagazine(p, m);
case WeaponEvents.BULLET_SHOW: return new WeaponEventAnimBulletShow(p, m);
case WeaponEvents.BULLET_SHOW2: return new WeaponEventAnimBulletShow2(p, m);
case WeaponEvents.CANUNJAM_END: return new WeaponEventAnimCanUnjamEnd(p, m);
case WeaponEvents.CANUNJAM_START: return new WeaponEventAnimCanUnjamStart(p, m);
case WeaponEvents.COCKED: return new WeaponEventAnimCocked(p, m);
case WeaponEvents.MAGAZINE_ATTACHED: return new WeaponEventAnimMagazineAttached(p, m);
case WeaponEvents.MAGAZINE_DETACHED: return new WeaponEventAnimMagazineDetached(p, m);
case WeaponEvents.MAGAZINE_HIDE: return new WeaponEventAnimMagazineHide(p, m);
case WeaponEvents.MAGAZINE_SHOW: return new WeaponEventAnimMagazineShow(p, m);
case WeaponEvents.SLIDER_OPEN: return new WeaponEventAnimSliderOpen(p, m);
case WeaponEvents.UNJAMMED: return new WeaponEventAnimUnjammed(p, m);
case WeaponEvents.HAMMER_UNCOCKED: return new WeaponEventAnimHammerUncocked(p, m);
case WeaponEvents.HAMMER_COCKED: return new WeaponEventAnimHammerCocked(p, m);
case WeaponEvents.CYLINDER_ROTATE: return new WeaponEventCylinderRotate(p, m);
//case WeaponEvents.: return new WeaponEventAnim(p, m);
}
return NULL;
}
WeaponEventBase CreateWeaponEventFromContext (ParamsReadContext ctx)
{
int packedType;
ctx.Read(packedType);
DayZPlayer player;
ctx.Read(player);
Magazine magazine;
ctx.Read(magazine);
WeaponEventID eventID = packedType >> 16;
WeaponEvents animEvent = packedType & 0x0000ffff;
WeaponEventBase b = WeaponEventFactory(eventID, animEvent, player, magazine);
b.ReadFromContext(ctx);
return b;
}
class WeaponEventAnimAttachmentHide extends WeaponEventAnimation
{
void WeaponEventAnimAttachmentHide (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.ATTACHMENT_HIDE; }
};
class WeaponEventAnimAttachmentShow extends WeaponEventAnimation
{
void WeaponEventAnimAttachmentShow (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.ATTACHMENT_SHOW; }
};
class WeaponEventAnimBulletEject extends WeaponEventAnimation
{
void WeaponEventAnimBulletEject (DayZPlayer p = NULL, Magazine m = NULL)
{
m_type = WeaponEvents.BULLET_EJECT;
// Particles for ejecting bullet casings
PlayerBase player = PlayerBase.Cast(p);
if (player)
{
ItemBase weapon = player.GetItemInHands();
if (weapon && weapon.GetOverheatingValue() > 0)
{
Weapon_Base weapon_base = Weapon_Base.Cast(weapon);
ItemBase suppressor;
if (weapon_base)
suppressor = weapon_base.GetAttachedSuppressor();
ItemBase.PlayBulletCasingEjectParticles(weapon, "", weapon, suppressor, "CfgWeapons" );
}
}
}
};
class WeaponEventCylinderRotate extends WeaponEventAnimation
{
void WeaponEventCylinderRotate (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.CYLINDER_ROTATE; }
};
class WeaponEventAnimBulletHide extends WeaponEventAnimation
{
void WeaponEventAnimBulletHide (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.BULLET_HIDE; }
};
class WeaponEventAnimBulletHide2 extends WeaponEventAnimation
{
void WeaponEventAnimBulletHide2 (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.BULLET_HIDE2; }
};
class WeaponEventAnimBulletInChamber extends WeaponEventAnimation
{
void WeaponEventAnimBulletInChamber (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.BULLET_IN_CHAMBER; }
};
class WeaponEventAnimBulletInMagazine extends WeaponEventAnimation
{
void WeaponEventAnimBulletInMagazine (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.BULLET_IN_MAGAZINE; }
};
class WeaponEventAnimBulletShow extends WeaponEventAnimation
{
void WeaponEventAnimBulletShow (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.BULLET_SHOW; }
};
class WeaponEventAnimBulletShow2 extends WeaponEventAnimation
{
void WeaponEventAnimBulletShow2 (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.BULLET_SHOW2; }
};
class WeaponEventAnimCanUnjamEnd extends WeaponEventAnimation
{
void WeaponEventAnimCanUnjamEnd (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.CANUNJAM_END; }
};
class WeaponEventAnimCanUnjamStart extends WeaponEventAnimation
{
void WeaponEventAnimCanUnjamStart (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.CANUNJAM_START; }
};
class WeaponEventAnimCocked extends WeaponEventAnimation
{
void WeaponEventAnimCocked (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.COCKED; }
};
class WeaponEventAnimMagazineAttached extends WeaponEventAnimation
{
void WeaponEventAnimMagazineAttached (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.MAGAZINE_ATTACHED; }
};
class WeaponEventAnimMagazineDetached extends WeaponEventAnimation
{
void WeaponEventAnimMagazineDetached (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.MAGAZINE_DETACHED; }
};
class WeaponEventAnimMagazineHide extends WeaponEventAnimation
{
void WeaponEventAnimMagazineHide (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.MAGAZINE_HIDE; }
};
class WeaponEventAnimMagazineShow extends WeaponEventAnimation
{
void WeaponEventAnimMagazineShow (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.MAGAZINE_SHOW; }
};
class WeaponEventAnimSliderOpen extends WeaponEventAnimation
{
void WeaponEventAnimSliderOpen (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.SLIDER_OPEN; }
};
class WeaponEventAnimUnjammed extends WeaponEventAnimation
{
void WeaponEventAnimUnjammed (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.UNJAMMED; }
};
class WeaponEventAnimHammerUncocked extends WeaponEventAnimation
{
void WeaponEventAnimHammerUncocked (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.HAMMER_UNCOCKED; }
};
class WeaponEventAnimHammerCocked extends WeaponEventAnimation
{
void WeaponEventAnimHammerCocked (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.HAMMER_COCKED; }
};
/*
class WeaponEventAnim extends WeaponEventAnimation
{
void WeaponEventAnim (DayZPlayer p = NULL, Magazine m = NULL) { m_type = WeaponEvents.; }
};
*/