Русское сообщество по скриптингу

[L4D/L4D2] Работа с танком

Статьи или фрагменты кода для новичков и уже опытных скриптеров по SourceMod.
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по SourceMod.

[L4D/L4D2] Работа с танком

Сообщение DJ_WEST » 01 янв 2010, 20:59

Автор: DJ_WEST

В данной статье будут собираться различного рода способы и функции работы с танком из 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_EventString:s_Name[], bool:b_DontBroadcast)
{
    
decl i_UserIDi_ClientString:s_ModelName[64]
    
    
i_UserID GetEventInt(h_Event"userid")
    
i_Client GetClientOfUserId(i_UserID)
    
    
GetEntPropString(i_ClientProp_Data"m_ModelName"s_ModelNamesizeof(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_Weaponsizeof(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 == || i_Type == 2056 || i_Type == 268435464)
        {
            
// Действие
        
}
    }
}
 

Данное событие срабатывает при загорании танка-бота или танка-игрока от всех видов огня. Можно воспользоваться данными от "weapon" или "type".
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2