Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_SpawnProtectionComponent.c
Go to the documentation of this file.
1[EntityEditorProps(category: "GameScripted/GameMode", description: "Spawn protection component for gamemode.", color: "0 0 255 255")]
5
6class SCR_SpawnProtectionComponent : SCR_BaseGameModeComponent
7{
8 [Attribute(defvalue: "0.1", desc: "How long should be player protected?")]
9 protected float m_fProtectionTime;
10
11 [Attribute(defvalue: "1", desc: "Should be protection disabled if player shoots?")]
12 protected bool m_bDisableOnAttack;
13
14 [Attribute(defvalue: "0", desc: "Allow player spawnpoints?")]
15 protected bool m_bAllowPlayerSpawnpoints;
16
17 protected ref map<int, IEntity> m_mSpawnedCharacters;
18
19 //------------------------------------------------------------------------------------------------
25 override bool PreparePlayerEntity_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnHandlerComponent handlerComponent, SCR_SpawnData data, IEntity entity)
26 {
27 #ifdef _ENABLE_RESPAWN_LOGS
28 PrintFormat("%1::PreparePlayerEntity_S(playerId: %2, entity: %3)", Type().ToString(),
29 requestComponent.GetPlayerId(), entity);
30 #endif
31
32 SCR_PlayerController controller = SCR_PlayerController.Cast(requestComponent.GetPlayerController());
33
34 // Check for radio respawns
35 if (!m_bAllowPlayerSpawnpoints)
36 {
38 if (spawnData)
39 {
40 // If not allowed on player spawns, skip
41 if (SCR_PlayerRadioSpawnPoint.Cast(spawnData.GetSpawnPoint()))
42 return true;
43 }
44 }
45
46 SCR_DamageManagerComponent damageManager = SCR_DamageManagerComponent.Cast(entity.FindComponent(SCR_DamageManagerComponent));
47 if (!damageManager)
48 return true;
49
50 #ifdef _ENABLE_RESPAWN_LOGS
51 PrintFormat(" %1::EnableDamageHandling(false, playerId: %2, entity: %3)", Type().ToString(),
52 requestComponent.GetPlayerId(), entity);
53 #endif
54
55 // Disable damage handling
56 damageManager.EnableDamageHandling(false);
57
58 // TODO: Check also for and grenade throw
59 if (m_bDisableOnAttack)
60 {
61 EventHandlerManagerComponent eventHandlerManager = EventHandlerManagerComponent.Cast(entity.FindComponent(EventHandlerManagerComponent));
62 if (eventHandlerManager)
63 eventHandlerManager.RegisterScriptHandler("OnAmmoCountChanged", entity, OnPlayerAmmoChangeCallback);
64
65 SCR_MeleeComponent meleeComp = SCR_MeleeComponent.Cast(entity.FindComponent(SCR_MeleeComponent));
66 if (meleeComp)
68 }
69
70 if (!m_mSpawnedCharacters)
71 m_mSpawnedCharacters = new map<int, IEntity>();
72
73 m_mSpawnedCharacters.Set(requestComponent.GetPlayerId(), entity);
74
75 return true;
76 }
77
78 //------------------------------------------------------------------------------------------------
79 override void OnPlayerDisconnected(int playerId, KickCauseCode cause, int timeout)
80 {
81 if (!m_mSpawnedCharacters || m_mSpawnedCharacters.IsEmpty())
82 return;
83
84 IEntity character = m_mSpawnedCharacters.Get(playerId);
85 if (!character)
86 return;
87
88 m_mSpawnedCharacters.Remove(playerId);
89 DisablePlayerProtection(character);
90 }
91
92 //------------------------------------------------------------------------------------------------
93 override void OnPlayerSpawnFinalize_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnHandlerComponent handlerComponent, SCR_SpawnData data, IEntity entity)
94 {
95 //Using protection time parameter as delay for CallLater, DisablePlayerProtection is called to disable protection on specific entity
96 GetGame().GetCallqueue().CallLater(DisablePlayerProtection, m_fProtectionTime * 1000, false, entity);
97 }
98
99 //------------------------------------------------------------------------------------------------
100 override void OnSpawnPlayerEntityFailure_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnHandlerComponent handlerComponent, IEntity entity, SCR_SpawnData data, SCR_ESpawnResult reason)
101 {
102 if (m_mSpawnedCharacters && !m_mSpawnedCharacters.IsEmpty())
103 m_mSpawnedCharacters.Remove(requestComponent.GetPlayerId());
104
106 }
107
108 //------------------------------------------------------------------------------------------------
115 protected void OnPlayerAmmoChangeCallback(BaseWeaponComponent currentWeapon, BaseMuzzleComponent currentMuzzle, BaseMagazineComponent magazine, int ammoCount, bool isChambered)
116 {
117 if (!currentWeapon)
118 return;
119
120 //Get weapon entity to which is component assigned
121 IEntity weaponEntity = currentWeapon.GetOwner();
122 if (!weaponEntity)
123 return;
124
125 //Get parent of weapon, and check if it is character or not.
126 IEntity parent = weaponEntity.GetParent();
127 if (parent && parent.IsInherited(ChimeraCharacter))
129 }
130
131 //------------------------------------------------------------------------------------------------
132 protected void DisablePlayerProtection(IEntity playerEntity)
133 {
134 ChimeraCharacter character = ChimeraCharacter.Cast(playerEntity);
135 if (!character)
136 return;
137
138 if (m_mSpawnedCharacters && !m_mSpawnedCharacters.IsEmpty())
139 {
140 int playerId = GetGame().GetPlayerManager().GetPlayerIdFromControlledEntity(character);
141 m_mSpawnedCharacters.Remove(playerId);
142 }
143
144 SCR_DamageManagerComponent damageManager = character.GetDamageManager();
145 if (!damageManager || damageManager.IsDamageHandlingEnabled())
146 return;
147
148 damageManager.EnableDamageHandling(true);
149
150 #ifdef _ENABLE_RESPAWN_LOGS
151 PrintFormat(" %1::EnableDamageHandling(true, playerId: %2, entity: %3)", Type().ToString(),
152 GetGame().GetPlayerManager().GetPlayerIdFromControlledEntity(character), character);
153 #endif
154
155 if (!m_bDisableOnAttack)
156 return;
157
158 EventHandlerManagerComponent eventHandlerManager = EventHandlerManagerComponent.Cast(character.FindComponent(EventHandlerManagerComponent));
159 if (eventHandlerManager)
160 eventHandlerManager.RemoveScriptHandler("OnAmmoCountChanged", character, OnPlayerAmmoChangeCallback);
161
162 SCR_MeleeComponent meleeComp = SCR_MeleeComponent.Cast(character.FindComponent(SCR_MeleeComponent));
163 if (meleeComp)
165 }
166}
ArmaReforgerScripted GetGame()
Definition game.c:1398
void SCR_BaseGameModeComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
bool PreparePlayerEntity_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnHandlerComponent handlerComponent, SCR_SpawnData data, IEntity entity)
enum SCR_ECompassType EntityEditorProps(category:"GameScripted/Gadgets", description:"Compass", color:"0 0 255 255")
Prefab data class for compass component.
SCR_ESpawnResult
Get all prefabs that have the spawner data
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
override void OnSpawnPlayerEntityFailure_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnHandlerComponent handlerComponent, IEntity entity, SCR_SpawnData data, SCR_ESpawnResult reason)
override void OnPlayerSpawnFinalize_S(SCR_SpawnRequestComponent requestComponent, SCR_SpawnHandlerComponent handlerComponent, SCR_SpawnData data, IEntity entity)
void DisablePlayerProtection(IEntity playerEntity)
void OnPlayerAmmoChangeCallback(BaseWeaponComponent currentWeapon, BaseMuzzleComponent currentMuzzle, BaseMagazineComponent magazine, int ammoCount, bool isChambered)
int Type
proto external Managed FindComponent(typename typeName)
proto external IEntity GetParent()
OnMeleePerformedInvoker GetOnMeleePerformed()
Definition Types.c:486
proto void PrintFormat(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL, LogLevel level=LogLevel.NORMAL)
SCR_FieldOfViewSettings Attribute
override void OnPlayerDisconnected(int playerId, KickCauseCode cause, int timeout)
proto external string ToString()
Plain C++ pointer, no weak pointers, no memory management.