View Single Post
diorfo
Member
Join Date: Dec 2013
Old 10-27-2016 , 23:44   Re: [L4D2] Register extra Actions on GameME plugin
Reply With Quote #7

Quote:
Originally Posted by cravenge View Post
In order for those points to be registered, you will need CreateEvent function in those plugins. I'm really good at it, examples are my brutal hunter pounce and charger jump modified plugins in the plugins section.
Following your sugestion, i tried to create the event "player_incapacited_start" right after the moment the survivor is hit by car (i_Health > 0) in plugin "charger power" but i don't know why it's not triggering the event (maybe the cell packs SurvivorID and ChargerID are not taking the rights IDs of attacker and victims???)

Below what i did but seems no effect.

I apreciate any help or directions.

PHP Code:
/*

    Created by DJ_WEST
    
    Web: http://amx-x.ru
    AMX Mod X and SourceMod Russian Community
    
*/

#include <sourcemod>
#include <sdktools>

#define PLUGIN_VERSION "1.2"
#define TEAM_INFECTED 3
#define CLASS_CHARGER 6
#define PROP_CAR (1<<0)
#define PROP_CAR_ALARM (1<<1)
#define PROP_CONTAINER    (1<<2)
#define PROP_TRUCK (1<<3)
#define PUSH_COUNT "m_iHealth"

new Handle:g_h_CvarChargerPowerHandle:g_h_CvarChargerCarryHandle:g_h_CvarMessageTypeHandle:g_h_CvarObjectsHandle:g_h_CvarPushLimitHandle:g_h_CvarRemoveObject,
    
Handle:g_h_CvarChargerDamage

public Plugin:myinfo 
{
    
name "Charger Power",
    
author "DJ_WEST",
    
description "Allows charger to move objects (containers, cars, trucks) by hitting them when using own ability",
    
version PLUGIN_VERSION,
    
url "http://amx-x.ru"
}

public 
OnPluginStart()
{
    
decl String:s_Game[12], Handle:h_Version
    
    GetGameFolderName
(s_Gamesizeof(s_Game))
    if (!
StrEqual(s_Game"left4dead2"))
        
SetFailState("Charger Power supports Left 4 Dead 2 only!")
    
    
LoadTranslations("charger_power.phrases")
    
    
h_Version CreateConVar("charger_power_version"PLUGIN_VERSION"Charger Power version"FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY)
    
g_h_CvarChargerPower CreateConVar("l4d2_charger_power""500.0""Charger hit power"FCVAR_PLUGIN|FCVAR_NOTIFYtrue0.0true5000.0)
    
g_h_CvarChargerCarry CreateConVar("l4d2_charger_power_carry""1""Can move objects if charger carry the player"FCVAR_PLUGIN|FCVAR_NOTIFYtrue0.0true1.0)
    
g_h_CvarMessageType CreateConVar("l4d2_charger_power_message_type""3""Message type (0 - disable, 1 - chat, 2 - hint, 3 - instructor hint)"FCVAR_PLUGIN|FCVAR_NOTIFYtrue0.0true3.0)
    
g_h_CvarObjects CreateConVar("l4d2_charger_power_objects""15""Can move objects this type (1 - car, 2 - car alarm, 4 - container, 8 - truck)"FCVAR_PLUGIN|FCVAR_NOTIFYtrue1.0true15.0)
    
g_h_CvarPushLimit CreateConVar("l4d2_charger_power_push_limit""3""How many times object can be moved"FCVAR_PLUGIN|FCVAR_NOTIFYtrue1.0true100.0)
    
g_h_CvarRemoveObject CreateConVar("l4d2_charger_power_remove""0""Remove moved object after some time (in seconds)"FCVAR_PLUGIN|FCVAR_NOTIFYtrue0.0true100.0)
    
g_h_CvarChargerDamage CreateConVar("l4d2_charger_power_damage""10""Additional damage to charger from moving objects"FCVAR_PLUGIN|FCVAR_NOTIFYtrue0.0true100.0)

    
HookEvent("charger_charge_end"EventChargeEnd)
    
HookEvent("player_spawn"EventPlayerSpawn)

    
SetConVarString(h_VersionPLUGIN_VERSION)
}

public 
Action:EventChargeEnd(Handle:h_Event, const String:s_Name[], bool:b_DontBroadcast)
{
    
decl i_UserIDi_ClientFloat:f_Origin[3], Float:f_Angles[3], Float:f_EndOrigin[3], Float:f_Velocity[3],
        
Handle:h_TraceHandle:h_Packi_TargetString:s_ClassName[16], Float:f_PowerString:s_ModelName[64],
        
i_Typei_PushCounti_Healthi_Damagei_RemoveTime
    
    i_UserID 
GetEventInt(h_Event"userid")
    new 
Handle:ChargerID CreateDataPack()
    
WritePackCell(ChargerIDGetClientUserId(i_UserID))
    
i_Client GetClientOfUserId(i_UserID)
    
    
    if (!
i_Client || !IsClientInGame(i_Client))
        return 
Plugin_Handled
        
    
if (!GetConVarInt(g_h_CvarChargerCarry) && GetEntProp(i_ClientProp_Send"m_carryVictim") > 0)
        return 
Plugin_Handled

    GetClientAbsOrigin
(i_Clientf_Origin)
    
GetClientAbsAngles(i_Clientf_Angles)
    
f_Origin[2] += 20.0

    h_Trace 
TR_TraceRayFilterEx(f_Originf_AnglesMASK_ALLRayType_InfiniteTraceFilterClientsi_Client)
        
    if (
TR_DidHit(h_Trace))
    {
        
i_Target TR_GetEntityIndex(h_Trace)
        
TR_GetEndPosition(f_EndOriginh_Trace)
            
        if (
i_Target && IsValidEdict(i_Target) && GetVectorDistance(f_Originf_EndOrigin) <= 100.0)
        {
            if (
GetEntityMoveType(i_Target) != MOVETYPE_VPHYSICS)
                return 
Plugin_Handled
                
            i_PushCount 
GetEntProp(i_TargetProp_DataPUSH_COUNT)
            
            if (
i_PushCount >= GetConVarInt(g_h_CvarPushLimit))
                return 
Plugin_Handled
                
            i_Type 
GetConVarInt(g_h_CvarObjects)
                
            
GetEdictClassname(i_Targets_ClassNamesizeof(s_ClassName))
            
GetEntPropString(i_TargetProp_Data"m_ModelName"s_ModelNamesizeof(s_ModelName))
            
            if (
StrEqual(s_ClassName"prop_physics") || StrEqual(s_ClassName"prop_car_alarm"))
            {
                if (
StrEqual(s_ClassName"prop_car_alarm") && !(i_Type PROP_CAR_ALARM))
                    return 
Plugin_Handled
                
else if (StrContains(s_ModelName"car") != -&& !(i_Type PROP_CAR) && !(i_Type PROP_CAR_ALARM))
                    return 
Plugin_Handled
                
else if (StrContains(s_ModelName"dumpster") != -&& !(i_Type PROP_CONTAINER))
                    return 
Plugin_Handled
                
else if (StrContains(s_ModelName"forklift") != -&& !(i_Type PROP_TRUCK))
                    return 
Plugin_Handled
                    
                i_PushCount
++
                
SetEntProp(i_TargetProp_DataPUSH_COUNTi_PushCount)

                
GetAngleVectors(f_Anglesf_VelocityNULL_VECTORNULL_VECTOR)
                
f_Power GetConVarFloat(g_h_CvarChargerPower)
                
f_Velocity[0] *= f_Power
                f_Velocity
[1] *= f_Power
                f_Velocity
[2] *= f_Power
                TeleportEntity
(i_TargetNULL_VECTORNULL_VECTORf_Velocity)
                
                
h_Pack CreateDataPack()
                
WritePackCell(h_Packi_Target)
                
WritePackFloat(h_Packf_EndOrigin[0])
                
CreateTimer(0.5CheckEntityh_Pack)
                
                
i_Damage GetConVarInt(g_h_CvarChargerDamage)
                if (
i_Damage)
                {
                    
i_Health GetClientHealth(i_Client)
                    
i_Health -= i_Damage
                    
                    
if (i_Health 0
                        {
                        
SetEntityHealth(i_Clienti_Health)
                        new 
Handle:SurvivorID CreateDataPack()
                        
WritePackCell(SurvivorIDGetClientUserId(i_Client))
                        
                        
ResetPack(ChargerID)
                        
ResetPack(SurvivorID)
                            
                        new 
charger GetClientOfUserId(ReadPackCell(ChargerID))
                        new 
survivor GetClientOfUserId(ReadPackCell(SurvivorID))
                        new 
Handle:OnPlayerIncap CreateEvent("player_incapacited_start"true)
                        
SetEventInt(OnPlayerIncap"userid"GetClientUserId(survivor))
                        
SetEventInt(OnPlayerIncap"attacker"GetClientUserId(charger))
                        
FireEvent(OnPlayerIncapfalse)
                        }

                    else
                        {
                        
ForcePlayerSuicide(i_Client)

                        }
                        
                        
                }
                
                
i_RemoveTime GetConVarInt(g_h_CvarRemoveObject)
                if (
i_RemoveTime)
                    
CreateTimer(float(i_RemoveTime), RemoveEntityi_TargetTIMER_FLAG_NO_MAPCHANGE
            }
        }
    }
    
    return 
Plugin_Continue
}

public 
Action:RemoveEntity(Handle:h_Timerany:i_Ent)
{
    if (
IsValidEnt(i_Ent))
        
RemoveEdict(i_Ent)
}

public 
bool:TraceFilterClients(i_Entityi_Maskany:i_Data)
{
    if (
i_Entity == i_Data)
        return 
false
        
    
if (<= i_Entity <= MaxClients)
        return 
false
        
    
return true
}

public 
Action:CheckEntity(Handle:h_TimerHandle:h_Pack)
{
    
decl i_EntFloat:f_Origin[3], Float:f_LastOriginHandle:h_NewPack
    
    ResetPack
(h_Packfalse)
    
i_Ent ReadPackCell(h_Pack)
    
f_LastOrigin ReadPackFloat(h_Pack)
    
CloseHandle(h_Pack)
    
    if (
IsValidEdict(i_Ent))
    {
        
GetEntPropVector(i_EntProp_Data"m_vecOrigin"f_Origin)
        
        if (
f_Origin[0] != f_LastOrigin)
        {
            
h_NewPack CreateDataPack()
            
WritePackCell(h_NewPacki_Ent)
            
WritePackFloat(h_NewPackf_Origin[0])
            
CreateTimer(0.1CheckEntityh_NewPack)
        }
        else
            
TeleportEntity(i_EntNULL_VECTORNULL_VECTORFloat:{0.00.00.0})
    }
}

public 
Action:EventPlayerSpawn(Handle:h_Event, const String:s_Name[], bool:b_DontBroadcast)
{
    
decl i_UserIDi_ClientHandle:h_Pack
    
    i_UserID 
GetEventInt(h_Event"userid")
    
i_Client GetClientOfUserId(i_UserID)
    
    if (
IsClientInGame(i_Client) && !IsFakeClient(i_Client) && GetClientTeam(i_Client) == TEAM_INFECTED && GetInfectedClass(i_Client) == CLASS_CHARGER)
    {
        
        
h_Pack CreateDataPack()
        
WritePackCell(h_Packi_Client)
        
WritePackString(h_Pack"Move objects")
        
WritePackString(h_Pack"+attack")
        
CreateTimer(0.1DisplayHinth_Pack)
    }
}

public 
Action:DisplayHint(Handle:h_TimerHandle:h_Pack)
{
    
decl i_Client
    
    ResetPack
(h_Packfalse)
    
i_Client ReadPackCell(h_Pack)
    
    if (
GetConVarInt(g_h_CvarMessageType) == && IsClientInGame(i_Client))
        
ClientCommand(i_Client"gameinstructor_enable 1")
        
    
CreateTimer(0.3DelayDisplayHinth_Pack)
}

public 
Action:DelayDisplayHint(Handle:h_TimerHandle:h_Pack)
{
    
decl i_ClientString:s_LanguageKey[16], String:s_Message[256], String:s_Bind[10]

    
ResetPack(h_Packfalse)
    
i_Client ReadPackCell(h_Pack)
    
ReadPackString(h_Packs_LanguageKeysizeof(s_LanguageKey))
    
ReadPackString(h_Packs_Bindsizeof(s_Bind))
    
CloseHandle(h_Pack)
    
    switch (
GetConVarInt(g_h_CvarMessageType))
    {
        case 
1:
        {
            
FormatEx(s_Messagesizeof(s_Message), "\x03[%t]\x01 %t.""Information"s_LanguageKey)
            
ReplaceString(s_Messagesizeof(s_Message), "\n"" ")
            
PrintToChat(i_Clients_Message)
        }
        case 
2PrintHintText(i_Client"%t"s_LanguageKey)
        case 
3:
        {
            
FormatEx(s_Messagesizeof(s_Message), "%t"s_LanguageKey)
            
DisplayInstructorHint(i_Clients_Messages_Bind)
        }
    }
}

public 
DisplayInstructorHint(i_ClientString:s_Message[256], String:s_Bind[])
{
    
decl i_EntString:s_TargetName[32], Handle:h_RemovePack
    
    i_Ent 
CreateEntityByName("env_instructor_hint")
    
FormatEx(s_TargetNamesizeof(s_TargetName), "hint%d"i_Client)
    
ReplaceString(s_Messagesizeof(s_Message), "\n"" ")
    
DispatchKeyValue(i_Client"targetname"s_TargetName)
    
DispatchKeyValue(i_Ent"hint_target"s_TargetName)
    
DispatchKeyValue(i_Ent"hint_timeout""5")
    
DispatchKeyValue(i_Ent"hint_range""0.01")
    
DispatchKeyValue(i_Ent"hint_color""255 255 255")
    
DispatchKeyValue(i_Ent"hint_icon_onscreen""use_binding")
    
DispatchKeyValue(i_Ent"hint_caption"s_Message)
    
DispatchKeyValue(i_Ent"hint_binding"s_Bind)
    
DispatchSpawn(i_Ent)
    
AcceptEntityInput(i_Ent"ShowHint")
    
    
h_RemovePack CreateDataPack()
    
WritePackCell(h_RemovePacki_Client)
    
WritePackCell(h_RemovePacki_Ent)
    
CreateTimer(5.0RemoveInstructorHinth_RemovePack)
}
    
public 
Action:RemoveInstructorHint(Handle:h_TimerHandle:h_Pack)
{
    
decl i_Enti_Client
    
    ResetPack
(h_Packfalse)
    
i_Client ReadPackCell(h_Pack)
    
i_Ent ReadPackCell(h_Pack)
    
CloseHandle(h_Pack)
    
    if (!
i_Client || !IsClientInGame(i_Client))
        return 
Plugin_Handled
    
    
if (IsValidEntity(i_Ent))
            
RemoveEdict(i_Ent)
    
    
ClientCommand(i_Client"gameinstructor_enable 0")
        
    
DispatchKeyValue(i_Client"targetname""")
        
    return 
Plugin_Continue
}

stock GetInfectedClass(i_Client)
    return 
GetEntProp(i_ClientProp_Send"m_zombieClass")
    
stock IsValidEnt(i_Ent)
    return (
IsValidEdict(i_Ent) && IsValidEntity(i_Ent)) 

Last edited by diorfo; 10-28-2016 at 00:09.
diorfo is offline