В данной статье будут собираться различного рода способы и функции работы с танком из Left 4 Dead.
Появление танка на карте
- Код: Выделить всё
public OnPluginStart()
HookEvent("tank_spawn", EventTankSpawn)
public Action:EventTankSpawn(Handle:h_Event, String:s_Name[], bool:b_DontBroadcast)
{
decl i_UserID, i_Client
i_UserID = GetEventInt(h_Event, "userid")
// Получение ID игрока, который будет танком
i_Client = GetClientOfUserId(i_UserID)
}
Событие tank_spawn срабатывает при появлении танка в игре. Когда танк появляется ботом, то срабатывает событие один раз, затем событие срабатывает второй раз при передачи управления игроку.
Потеря контроля над танком
- Код: Выделить всё
public OnPluginStart()
HookEvent("tank_frustrated", EventTankFrustrated)
public Action:EventTankFrustrated(Handle:h_Event, String:s_Name[], bool:b_DontBroadcast)
{
decl i_UserID, i_Client
i_UserID = GetEventInt(h_Event, "userid")
// Получение ID игрока, который теряет контроль над танком
i_Client = GetClientOfUserId(i_UserID)
}
При потери игроком контроля над танком срабатывает событие tank_frustrated, затем срабатывает событие tank_spawn после передачи контроля другому игроку или боту.
Танк умирает
Способ №1:
- Код: Выделить всё
public OnPluginStart()
HookEvent("player_incapacitated", EventPlayerIncapacitated)
public Action:EventPlayerIncapacitated(Handle:h_Event, String:s_Name[], bool:b_DontBroadcast)
{
decl i_UserID, i_Client, String:s_ModelName[64]
i_UserID = GetEventInt(h_Event, "userid")
i_Client = GetClientOfUserId(i_UserID)
GetEntPropString(i_Client, Prop_Data, "m_ModelName", s_ModelName, sizeof(s_ModelName))
// Если игрок является танком
if (StrContains(s_ModelName, "hulk") != -1)
{
// Действие
}
}
Данным способом можно поймать смерть танка, как игрока, так и бота. Еще одно преимущество данного способа - данное событие срабатывает в момент начала анимации смерти танка, то есть первее других рассмотренных дальше вариантов.
Способ №2:
- Код: Выделить всё
public OnPluginStart()
HookEvent("tank_killed", EventTankKilled)
public Action:EventTankKilled(Handle:h_Event, String:s_Name[], bool:b_DontBroadcast)
{
decl i_UserID, i_Client
i_UserID = GetEventInt(h_Event, "userid")
// ID убитого танка
i_Client = GetClientOfUserId(i_UserID)
}
Данное событие срабатывает только при смерти танка, который управляется ботом.
Способ №3:
- Код: Выделить всё
public OnPluginStart()
HookEvent("player_death", EventPlayerDeath)
public Action:EventPlayerDeath(Handle:h_Event, String:s_Name[], bool:b_DontBroadcast)
{
decl i_UserID, i_Client, String:s_ModelName[16]
i_UserID = GetEventInt(h_Event, "userid")
i_Client = GetClientOfUserId(i_UserID)
GetEventString(h_Event, "victimname", s_ModelName, sizeof(s_ModelName))
// Если игрок является танком
if (StrEqual(s_ModelName, "Tank"))
{
// Действие
}
}
Данное событие срабатывает, как при смерти танка-бота, так и при смерти танка, управляемого игроком. Но в отличие от первого и второго способа, срабатывает в момент окончания анимации смерти танка.
Танк загорается
Способ №1:
- Код: Выделить всё
public OnPluginStart()
HookEvent("zombie_ignited", EventZombieIgnited)
public Action:EventZombieIgnited(Handle:h_Event, String:s_Name[], bool:b_DontBroadcast)
{
decl String:s_ModelName[128], i_TankID
i_TankID = GetEventInt(h_Event, "entityid")
GetEntPropString(i_TankID, Prop_Data, "m_ModelName", s_ModelName, sizeof(s_ModelName))
// Если объект является танком
if (StrContains(s_ModelName, "hulk") != -1)
{
// Действие
}
}
Данное событие срабатывает только при загорании танка-бота от молотова, канистры, фейерверка и зажигательных патронов.
Способ №2:
- Код: Выделить всё
public OnPluginStart()
HookEvent("player_hurt", EventPlayerHurt)
public Action:EventPlayerHurt(Handle:h_Event, String:s_Name[], bool:b_DontBroadcast)
{
decl i_UserID, i_Client, String:s_ModelName[64]
i_UserID = GetEventInt(h_Event, "userid")
i_Client = GetClientOfUserId(i_UserID)
GetEntPropString(i_Client, Prop_Data, "m_ModelName", s_ModelName, sizeof(s_ModelName))
// Если урон получил танк
if (StrContains(s_ModelName, "hulk") != -1)
{
decl String:s_Weapon[16], i_Type
i_Type = GetEventInt(h_Event, "type")
GetEventString(h_Event, "weapon", s_Weapon, sizeof(s_Weapon))
// Способ №1
// Если урон получен от огня
// s_Weapon = entityflame - танк горит от молотова, канистры, фейерверка, зажигательных патронов
// s_Weapon = inferno - танк находится в месте, где горит огонь от молотова, канистры, фейерверка
// s_Weapon = "" (!s_Weapon[0]) - танк загорелся от огня, находящегося на карте (бочки, костеры и т.д)
if (StrEqual(s_Weapon, "entityflame") || StrEqual(s_Weapon, "inferno") || !s_Weapon[0])
{
// Действие
}
// Способ №2
// Если урон получен от огня
// i_Type = 8 || 2056 - танк находится в месте, где горит огонь от молотова, канистры, фейерверка или огонь, находящийся на карте (бочки, костеры и т.д)
// i_Type = 268435464 - танк горит от молотова, канистры, фейерверка, зажигательных патронов или от огня, находящегося на карте (бочки, костеры и т.д)
if (i_Type == 8 || i_Type == 2056 || i_Type == 268435464)
{
// Действие
}
}
}
Данное событие срабатывает при загорании танка-бота или танка-игрока от всех видов огня. Можно воспользоваться данными от "weapon" или "type".