forked from UNLOZE/sm-plugins
entWatch4: Streamline code + Intermission change.
Block 'Press', 'Touch' and 'Pickup' during intermission.
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
|
||||
/* BOOLS */
|
||||
bool g_bLate;
|
||||
bool g_bIntermission;
|
||||
|
||||
/* ARRAYS */
|
||||
ArrayList g_hArray_Items;
|
||||
@@ -49,11 +50,11 @@ public Plugin myinfo =
|
||||
public APLRes AskPluginLoad2(Handle hMyself, bool bLate, char[] sError, int errorSize)
|
||||
{
|
||||
g_bLate = bLate;
|
||||
|
||||
|
||||
CreateNative("EW_GetItemCount", Native_GetItemCount);
|
||||
CreateNative("EW_GetItemArray", Native_GetItemArray);
|
||||
CreateNative("EW_SetItemArray", Native_SetItemArray);
|
||||
|
||||
|
||||
RegPluginLibrary("entWatch-core");
|
||||
return APLRes_Success;
|
||||
}
|
||||
@@ -68,23 +69,24 @@ public void OnPluginStart()
|
||||
g_hFwd_OnClientItemPickup = CreateGlobalForward("EW_OnClientItemPickup", ET_Ignore, Param_Array, Param_Cell, Param_Cell);
|
||||
g_hFwd_OnClientItemActivate = CreateGlobalForward("EW_OnClientItemActivate", ET_Ignore, Param_Array, Param_Cell, Param_Cell);
|
||||
g_hFwd_OnClientItemDisconnect = CreateGlobalForward("EW_OnClientItemDisconnect", ET_Ignore, Param_Array, Param_Cell, Param_Cell);
|
||||
|
||||
|
||||
g_hFwd_OnClientItemCanPickup = CreateGlobalForward("EW_OnClientItemCanPickup", ET_Hook, Param_Array, Param_Cell, Param_Cell);
|
||||
g_hFwd_OnClientItemCanActivate = CreateGlobalForward("EW_OnClientItemCanActivate", ET_Hook, Param_Array, Param_Cell, Param_Cell);
|
||||
|
||||
g_hArray_Items = new ArrayList(512);
|
||||
g_hArray_Config = new ArrayList(512);
|
||||
|
||||
|
||||
HookEvent("player_death", OnClientDeath);
|
||||
HookEvent("round_start", OnRoundStart);
|
||||
|
||||
HookEvent("round_end", OnRoundEnd);
|
||||
|
||||
if (g_bLate)
|
||||
{
|
||||
for (int client = 1; client <= MaxClients; client++)
|
||||
{
|
||||
if (!IsClientInGame(client) || IsFakeClient(client))
|
||||
continue;
|
||||
|
||||
|
||||
SDKHook(client, SDKHook_WeaponEquipPost, OnWeaponPickup);
|
||||
SDKHook(client, SDKHook_WeaponDropPost, OnWeaponDrop);
|
||||
SDKHook(client, SDKHook_WeaponCanUse, OnWeaponTouch);
|
||||
@@ -99,25 +101,25 @@ public void OnMapStart()
|
||||
{
|
||||
g_hArray_Items.Clear();
|
||||
g_hArray_Config.Clear();
|
||||
|
||||
|
||||
char sCurrentMap[128];
|
||||
GetCurrentMap(sCurrentMap, sizeof(sCurrentMap));
|
||||
String_ToLower(sCurrentMap, sCurrentMap, sizeof(sCurrentMap));
|
||||
|
||||
|
||||
char sFilePathDefault[PLATFORM_MAX_PATH];
|
||||
char sFilePathOverride[PLATFORM_MAX_PATH];
|
||||
|
||||
|
||||
BuildPath(Path_SM, sFilePathDefault, sizeof(sFilePathDefault), "configs/entwatch/%s.cfg", sCurrentMap);
|
||||
BuildPath(Path_SM, sFilePathOverride, sizeof(sFilePathOverride), "configs/entwatch/%s.override.cfg", sCurrentMap);
|
||||
|
||||
|
||||
KeyValues hConfig = new KeyValues("items");
|
||||
|
||||
|
||||
if (FileExists(sFilePathOverride))
|
||||
{
|
||||
if (!hConfig.ImportFromFile(sFilePathOverride))
|
||||
{
|
||||
LogMessage("Unable to load config \"%s\"!", sFilePathOverride);
|
||||
|
||||
|
||||
delete hConfig;
|
||||
return;
|
||||
}
|
||||
@@ -128,13 +130,13 @@ public void OnMapStart()
|
||||
if (!hConfig.ImportFromFile(sFilePathDefault))
|
||||
{
|
||||
LogMessage("Unable to load config \"%s\"!", sFilePathDefault);
|
||||
|
||||
|
||||
delete hConfig;
|
||||
return;
|
||||
}
|
||||
else LogMessage("Loaded config \"%s\"", sFilePathDefault);
|
||||
}
|
||||
|
||||
|
||||
if (hConfig.GotoFirstSubKey())
|
||||
{
|
||||
do
|
||||
@@ -144,7 +146,7 @@ public void OnMapStart()
|
||||
hConfig.GetString("short", itemArray[item_short], sizeof(itemArray[item_short]));
|
||||
hConfig.GetString("color", itemArray[item_color], sizeof(itemArray[item_color]));
|
||||
hConfig.GetString("filter", itemArray[item_filter], sizeof(itemArray[item_filter]));
|
||||
|
||||
|
||||
itemArray[item_weaponid] = hConfig.GetNum("weaponid");
|
||||
itemArray[item_buttonid] = hConfig.GetNum("buttonid");
|
||||
itemArray[item_triggerid] = hConfig.GetNum("triggerid");
|
||||
@@ -152,12 +154,12 @@ public void OnMapStart()
|
||||
itemArray[item_mode] = hConfig.GetNum("mode");
|
||||
itemArray[item_maxuses] = hConfig.GetNum("maxuses");
|
||||
itemArray[item_cooldown] = hConfig.GetNum("cooldown");
|
||||
|
||||
|
||||
g_hArray_Config.PushArray(itemArray, sizeof(itemArray));
|
||||
}
|
||||
}
|
||||
while (hConfig.GotoNextKey());
|
||||
}
|
||||
|
||||
|
||||
delete hConfig;
|
||||
return;
|
||||
}
|
||||
@@ -167,17 +169,18 @@ public void OnMapStart()
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
public void OnRoundStart(Event hEvent, const char[] sEvent, bool bDontBroadcast)
|
||||
{
|
||||
g_bIntermission = false;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
public void OnRoundEnd(Event hEvent, const char[] sEvent, bool bDontBroadcast)
|
||||
{
|
||||
g_bIntermission = true;
|
||||
|
||||
if (g_hArray_Items.Length)
|
||||
{
|
||||
for (int index; index < g_hArray_Items.Length; index++)
|
||||
{
|
||||
any itemArray[items];
|
||||
g_hArray_Items.GetArray(index, itemArray, sizeof(itemArray));
|
||||
|
||||
if (itemArray[item_owned] && itemArray[item_owner] >= 0)
|
||||
g_hArray_Items.Erase(index);
|
||||
}
|
||||
}
|
||||
g_hArray_Items.Clear();
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
@@ -202,19 +205,19 @@ public void OnEntitySpawned(int entity)
|
||||
{
|
||||
any itemArray[items];
|
||||
g_hArray_Items.GetArray(index, itemArray, sizeof(itemArray));
|
||||
|
||||
|
||||
if (RegisterItem(itemArray, entity))
|
||||
{
|
||||
g_hArray_Items.SetArray(index, itemArray, sizeof(itemArray));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for (int index; index < g_hArray_Config.Length; index++)
|
||||
{
|
||||
any itemArray[items];
|
||||
g_hArray_Config.GetArray(index, itemArray, sizeof(itemArray));
|
||||
|
||||
|
||||
if (RegisterItem(itemArray, entity))
|
||||
{
|
||||
g_hArray_Items.PushArray(itemArray, sizeof(itemArray));
|
||||
@@ -245,7 +248,7 @@ stock bool RegisterItem(any[] itemArray, int entity)
|
||||
(itemArray[item_weapon] && Entity_GetParent(entity) == itemArray[item_weapon])))
|
||||
{
|
||||
SDKHook(entity, SDKHook_Use, OnButtonPress);
|
||||
|
||||
|
||||
itemArray[item_button] = entity;
|
||||
return true;
|
||||
}
|
||||
@@ -258,7 +261,7 @@ stock bool RegisterItem(any[] itemArray, int entity)
|
||||
SDKHook(entity, SDKHook_StartTouch, OnTriggerTouch);
|
||||
SDKHook(entity, SDKHook_EndTouch, OnTriggerTouch);
|
||||
SDKHook(entity, SDKHook_Touch, OnTriggerTouch);
|
||||
|
||||
|
||||
itemArray[item_trigger] = entity;
|
||||
return true;
|
||||
}
|
||||
@@ -278,25 +281,25 @@ public void OnEntityDestroyed(int entity)
|
||||
{
|
||||
any itemArray[items];
|
||||
g_hArray_Items.GetArray(index, itemArray, sizeof(itemArray));
|
||||
|
||||
|
||||
if (itemArray[item_weapon] && itemArray[item_weapon] == entity)
|
||||
{
|
||||
g_hArray_Items.Erase(index);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (itemArray[item_button] && itemArray[item_button] == entity)
|
||||
{
|
||||
itemArray[item_button] = INVALID_ENT_REFERENCE;
|
||||
|
||||
|
||||
g_hArray_Items.SetArray(index, itemArray, sizeof(itemArray));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (itemArray[item_trigger] && itemArray[item_trigger] == entity)
|
||||
{
|
||||
itemArray[item_trigger] = INVALID_ENT_REFERENCE;
|
||||
|
||||
|
||||
g_hArray_Items.SetArray(index, itemArray, sizeof(itemArray));
|
||||
return;
|
||||
}
|
||||
@@ -328,18 +331,18 @@ public void OnClientDisconnect(int client)
|
||||
{
|
||||
any itemArray[items];
|
||||
g_hArray_Items.GetArray(index, itemArray, sizeof(itemArray));
|
||||
|
||||
|
||||
if (itemArray[item_owned] && itemArray[item_owner] == client)
|
||||
{
|
||||
itemArray[item_owner] = INVALID_ENT_REFERENCE;
|
||||
itemArray[item_owned] = false;
|
||||
|
||||
|
||||
Call_StartForward(g_hFwd_OnClientItemDisconnect);
|
||||
Call_PushArray(itemArray, sizeof(itemArray));
|
||||
Call_PushCell(client);
|
||||
Call_PushCell(index);
|
||||
Call_Finish();
|
||||
|
||||
|
||||
g_hArray_Items.SetArray(index, itemArray, sizeof(itemArray));
|
||||
}
|
||||
}
|
||||
@@ -352,25 +355,25 @@ public void OnClientDisconnect(int client)
|
||||
public void OnClientDeath(Event hEvent, const char[] sEvent, bool bDontBroadcast)
|
||||
{
|
||||
int client = GetClientOfUserId(hEvent.GetInt("userid"));
|
||||
|
||||
|
||||
if (Client_IsValid(client) && !IsFakeClient(client) && g_hArray_Items.Length)
|
||||
{
|
||||
for (int index; index < g_hArray_Items.Length; index++)
|
||||
{
|
||||
any itemArray[items];
|
||||
g_hArray_Items.GetArray(index, itemArray, sizeof(itemArray));
|
||||
|
||||
|
||||
if (itemArray[item_owned] && itemArray[item_owner] == client)
|
||||
{
|
||||
itemArray[item_owner] = INVALID_ENT_REFERENCE;
|
||||
itemArray[item_owned] = false;
|
||||
|
||||
|
||||
Call_StartForward(g_hFwd_OnClientItemDeath);
|
||||
Call_PushArray(itemArray, sizeof(itemArray));
|
||||
Call_PushCell(client);
|
||||
Call_PushCell(index);
|
||||
Call_Finish();
|
||||
|
||||
|
||||
g_hArray_Items.SetArray(index, itemArray, sizeof(itemArray));
|
||||
}
|
||||
}
|
||||
@@ -388,18 +391,18 @@ public Action OnWeaponPickup(int client, int weapon)
|
||||
{
|
||||
any itemArray[items];
|
||||
g_hArray_Items.GetArray(index, itemArray, sizeof(itemArray));
|
||||
|
||||
|
||||
if (itemArray[item_weapon] && itemArray[item_weapon] == weapon)
|
||||
{
|
||||
itemArray[item_owner] = client;
|
||||
itemArray[item_owned] = true;
|
||||
|
||||
|
||||
Call_StartForward(g_hFwd_OnClientItemPickup);
|
||||
Call_PushArray(itemArray, sizeof(itemArray));
|
||||
Call_PushCell(client);
|
||||
Call_PushCell(index);
|
||||
Call_Finish();
|
||||
|
||||
|
||||
g_hArray_Items.SetArray(index, itemArray, sizeof(itemArray));
|
||||
return;
|
||||
}
|
||||
@@ -418,18 +421,18 @@ public Action OnWeaponDrop(int client, int weapon)
|
||||
{
|
||||
any itemArray[items];
|
||||
g_hArray_Items.GetArray(index, itemArray, sizeof(itemArray));
|
||||
|
||||
|
||||
if (itemArray[item_weapon] && itemArray[item_weapon] == weapon)
|
||||
{
|
||||
itemArray[item_owner] = INVALID_ENT_REFERENCE;
|
||||
itemArray[item_owned] = false;
|
||||
|
||||
|
||||
Call_StartForward(g_hFwd_OnClientItemDrop);
|
||||
Call_PushArray(itemArray, sizeof(itemArray));
|
||||
Call_PushCell(client);
|
||||
Call_PushCell(index);
|
||||
Call_Finish();
|
||||
|
||||
|
||||
g_hArray_Items.SetArray(index, itemArray, sizeof(itemArray));
|
||||
return;
|
||||
}
|
||||
@@ -447,81 +450,82 @@ public Action OnButtonPress(int button, int client)
|
||||
if (HasEntProp(button, Prop_Data, "m_bLocked") &&
|
||||
GetEntProp(button, Prop_Data, "m_bLocked"))
|
||||
return Plugin_Handled;
|
||||
|
||||
|
||||
for (int index; index < g_hArray_Items.Length; index++)
|
||||
{
|
||||
any itemArray[items];
|
||||
g_hArray_Items.GetArray(index, itemArray, sizeof(itemArray));
|
||||
|
||||
if (itemArray[item_button] && itemArray[item_button] == button)
|
||||
|
||||
if (itemArray[item_button] && itemArray[item_button] == button &&
|
||||
itemArray[item_owned] && itemArray[item_owner] == client)
|
||||
{
|
||||
if (itemArray[item_owned] && itemArray[item_owner] == client)
|
||||
if (g_bIntermission)
|
||||
return Plugin_Handled;
|
||||
|
||||
Action aResult;
|
||||
Call_StartForward(g_hFwd_OnClientItemCanActivate);
|
||||
Call_PushArray(itemArray, sizeof(itemArray));
|
||||
Call_PushCell(client);
|
||||
Call_PushCell(index);
|
||||
Call_Finish(aResult);
|
||||
|
||||
if ((aResult == Plugin_Continue) || (aResult == Plugin_Changed))
|
||||
{
|
||||
Action aResult;
|
||||
Call_StartForward(g_hFwd_OnClientItemCanActivate);
|
||||
switch(itemArray[item_mode])
|
||||
{
|
||||
case(1):
|
||||
{
|
||||
if (itemArray[item_nextuse] < RoundToCeil(GetEngineTime()))
|
||||
{
|
||||
itemArray[item_nextuse] = RoundToCeil(GetEngineTime()) + itemArray[item_cooldown];
|
||||
}
|
||||
else return Plugin_Handled;
|
||||
}
|
||||
case(2):
|
||||
{
|
||||
if (itemArray[item_uses] < itemArray[item_maxuses])
|
||||
{
|
||||
itemArray[item_uses]++;
|
||||
}
|
||||
else return Plugin_Handled;
|
||||
}
|
||||
case(3):
|
||||
{
|
||||
if (itemArray[item_nextuse] < RoundToCeil(GetEngineTime()) && itemArray[item_uses] < itemArray[item_maxuses])
|
||||
{
|
||||
itemArray[item_nextuse] = RoundToCeil(GetEngineTime()) + itemArray[item_cooldown];
|
||||
itemArray[item_uses]++;
|
||||
}
|
||||
else return Plugin_Handled;
|
||||
}
|
||||
case(4):
|
||||
{
|
||||
if (itemArray[item_nextuse] < RoundToCeil(GetEngineTime()))
|
||||
{
|
||||
itemArray[item_uses]++;
|
||||
|
||||
if (itemArray[item_uses] >= itemArray[item_maxuses])
|
||||
{
|
||||
itemArray[item_nextuse] = RoundToCeil(GetEngineTime()) + itemArray[item_cooldown];
|
||||
itemArray[item_uses] = 0;
|
||||
}
|
||||
}
|
||||
else return Plugin_Handled;
|
||||
}
|
||||
}
|
||||
|
||||
if (itemArray[item_filter][0])
|
||||
Entity_SetName(client, itemArray[item_filter]);
|
||||
|
||||
Call_StartForward(g_hFwd_OnClientItemActivate);
|
||||
Call_PushArray(itemArray, sizeof(itemArray));
|
||||
Call_PushCell(client);
|
||||
Call_PushCell(index);
|
||||
Call_Finish(aResult);
|
||||
|
||||
if ((aResult == Plugin_Continue) || (aResult == Plugin_Changed))
|
||||
{
|
||||
switch(itemArray[item_mode])
|
||||
{
|
||||
case(1):
|
||||
{
|
||||
if (itemArray[item_nextuse] < RoundToCeil(GetEngineTime()))
|
||||
{
|
||||
itemArray[item_nextuse] = RoundToCeil(GetEngineTime()) + itemArray[item_cooldown];
|
||||
}
|
||||
else return Plugin_Handled;
|
||||
}
|
||||
case(2):
|
||||
{
|
||||
if (itemArray[item_uses] < itemArray[item_maxuses])
|
||||
{
|
||||
itemArray[item_uses]++;
|
||||
}
|
||||
else return Plugin_Handled;
|
||||
}
|
||||
case(3):
|
||||
{
|
||||
if (itemArray[item_nextuse] < RoundToCeil(GetEngineTime()) && itemArray[item_uses] < itemArray[item_maxuses])
|
||||
{
|
||||
itemArray[item_nextuse] = RoundToCeil(GetEngineTime()) + itemArray[item_cooldown];
|
||||
itemArray[item_uses]++;
|
||||
}
|
||||
else return Plugin_Handled;
|
||||
}
|
||||
case(4):
|
||||
{
|
||||
if (itemArray[item_nextuse] < RoundToCeil(GetEngineTime()))
|
||||
{
|
||||
itemArray[item_uses]++;
|
||||
|
||||
if (itemArray[item_uses] >= itemArray[item_maxuses])
|
||||
{
|
||||
itemArray[item_nextuse] = RoundToCeil(GetEngineTime()) + itemArray[item_cooldown];
|
||||
itemArray[item_uses] = 0;
|
||||
}
|
||||
}
|
||||
else return Plugin_Handled;
|
||||
}
|
||||
}
|
||||
|
||||
if (itemArray[item_filter][0])
|
||||
Entity_SetName(client, itemArray[item_filter]);
|
||||
|
||||
Call_StartForward(g_hFwd_OnClientItemActivate);
|
||||
Call_PushArray(itemArray, sizeof(itemArray));
|
||||
Call_PushCell(client);
|
||||
Call_PushCell(index);
|
||||
Call_Finish();
|
||||
}
|
||||
|
||||
g_hArray_Items.SetArray(index, itemArray, sizeof(itemArray));
|
||||
return aResult;
|
||||
Call_Finish();
|
||||
}
|
||||
|
||||
g_hArray_Items.SetArray(index, itemArray, sizeof(itemArray));
|
||||
return aResult;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -539,16 +543,19 @@ public Action OnTriggerTouch(int trigger, int client)
|
||||
{
|
||||
any itemArray[items];
|
||||
g_hArray_Items.GetArray(index, itemArray, sizeof(itemArray));
|
||||
|
||||
|
||||
if (itemArray[item_trigger] && itemArray[item_trigger] == trigger)
|
||||
{
|
||||
if (g_bIntermission)
|
||||
return Plugin_Handled;
|
||||
|
||||
Action aResult;
|
||||
Call_StartForward(g_hFwd_OnClientItemCanPickup);
|
||||
Call_PushArray(itemArray, sizeof(itemArray));
|
||||
Call_PushCell(client);
|
||||
Call_PushCell(index);
|
||||
Call_Finish(aResult);
|
||||
|
||||
|
||||
g_hArray_Items.SetArray(index, itemArray, sizeof(itemArray));
|
||||
return aResult;
|
||||
}
|
||||
@@ -568,16 +575,19 @@ public Action OnWeaponTouch(int client, int weapon)
|
||||
{
|
||||
any itemArray[items];
|
||||
g_hArray_Items.GetArray(index, itemArray, sizeof(itemArray));
|
||||
|
||||
|
||||
if (itemArray[item_weapon] && itemArray[item_weapon] == weapon)
|
||||
{
|
||||
if (g_bIntermission)
|
||||
return Plugin_Handled;
|
||||
|
||||
Action aResult;
|
||||
Call_StartForward(g_hFwd_OnClientItemCanPickup);
|
||||
Call_PushArray(itemArray, sizeof(itemArray));
|
||||
Call_PushCell(client);
|
||||
Call_PushCell(index);
|
||||
Call_Finish(aResult);
|
||||
|
||||
|
||||
g_hArray_Items.SetArray(index, itemArray, sizeof(itemArray));
|
||||
return aResult;
|
||||
}
|
||||
@@ -600,12 +610,12 @@ public int Native_GetItemCount(Handle hPlugin, int numParams)
|
||||
public int Native_GetItemArray(Handle hPlugin, int numParams)
|
||||
{
|
||||
any itemArray[items];
|
||||
|
||||
|
||||
int index = GetNativeCell(1);
|
||||
int size = GetNativeCell(3);
|
||||
|
||||
|
||||
g_hArray_Items.GetArray(index, itemArray, size);
|
||||
|
||||
|
||||
SetNativeArray(2, itemArray, size);
|
||||
}
|
||||
|
||||
@@ -615,11 +625,11 @@ public int Native_GetItemArray(Handle hPlugin, int numParams)
|
||||
public int Native_SetItemArray(Handle hPlugin, int numParams)
|
||||
{
|
||||
any itemArray[items];
|
||||
|
||||
|
||||
int index = GetNativeCell(1);
|
||||
int size = GetNativeCell(3);
|
||||
|
||||
|
||||
GetNativeArray(2, itemArray, size);
|
||||
|
||||
|
||||
g_hArray_Items.SetArray(index, itemArray, size);
|
||||
}
|
||||
Reference in New Issue
Block a user