Raised This Month: $51 Target: $400
 12% 

Is it safe?


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
Kowalsky
Senior Member
Join Date: Mar 2015
Location: Poland
Old 03-16-2016 , 03:58   Is it safe?
Reply With Quote #1

I have rewritten one plugin dealing with entities a little bit and it is crashing my server every 5-10minutes. I think the following code might crash the server :

Code:
ent = engfunc( CreateNamedEntity... ); g_Entity[ id ] = ent;

And then later I operate with the g_Entity[ id ], of course everywhere I use this variable I check if the entity is valid. (pev_valid) So is it safe to do it so?
Kowalsky is offline
klippy
AlliedModders Donor
Join Date: May 2013
Location: Serbia
Old 03-16-2016 , 04:17   Re: Is it safe?
Reply With Quote #2

What you described seems perfectly okay. I would say that there is something else crashing your server, but you are not really giving enough information.
klippy is offline
siriusmd99
Veteran Member
Join Date: Oct 2013
Location: Republic of Moldova
Old 03-16-2016 , 08:05   Re: Is it safe?
Reply With Quote #3

on client disconnect and connect ent[id] = 0

But anyway, show the code if you want a good answer.
siriusmd99 is offline
Kowalsky
Senior Member
Join Date: Mar 2015
Location: Poland
Old 03-16-2016 , 14:54   Re: Is it safe?
Reply With Quote #4

Here is the full code of my plugin. Mainly I have edited what I have descripted in the topic above and added some features.

PHP Code:
#include < amxmodx >
#include < fakemeta >
#include < hamsandwich >

#pragma semicolon 1

new const DispenserCosts] = { 1500500700 };
new const 
DispenserMaxHealing] = { 200400500 };
new const 
DispenserMaxHealth] = { 300500700 };
new const 
DispenserHealRadius] = { 200300400 };

#define DISPENSER_EXPLOSION_MAXDMG 90

enum STATUS_BUILDINGSTATUS_ACTIVE };
enum DISPENSER_LEVEL1DISPENSER_LEVEL2DISPENSER_LEVEL3 };

new const 
gDamageSounds[ ][ ] = {
"debris/metal1.wav",
"debris/metal2.wav",
"debris/metal3.wav"
};

new const 
gDispenserClassname[ ] = "NiceDispenser";
new const 
szDispenserClassname[ ] = "info_target";

new const 
gDispenserActive[ ] = "buttons/button9.wav";
new const 
gDispenserMdl[ ] = "models/mt_dispenser.mdl";
new const 
gHealingSprite[ ] = "sprites/heal_spr.spr";
new const 
gExploSprite[ ] = "sprites/zerogxplode.spr";

new 
gHealingBeamgExplosionSpriteg_msgMoneyg_HUDSync;
new 
Float:gDispenserOrigin33 ][ ];
new 
bDispenserID33 ];
new 
bool:bTrigger33 ];

new const 
gBeamColor][ ] = {
2555050 },    // T
5050255 }    // CT
};

public 
plugin_init( ) {
register_plugin"Build Dispenser""2.0""Podarok/tuty" );

RegisterHamHam_TakeDamageszDispenserClassname"bacon_TakeDamage");
RegisterHamHam_TraceAttackszDispenserClassname"bacon_TraceAttack" );
RegisterHamHam_TouchszDispenserClassname"bacon_Touch" );
RegisterHamHam_Spawn"player""EVENT_Spawn");

register_forwardFM_Think"DispenserThink" );
register_forwardFM_TraceLine"FW_Traceline");

register_clcmd"say /healmachine""CommandDispenserBuild" );

g_msgMoney get_user_msgid"Money" );
g_HUDSync CreateHudSyncObj( );
}

public 
client_disconnectid ) {
if( 
pev_validbDispenserIDid ] ) ) {
bDispenserIDid ] = 0;
set_pevbDispenserIDid ], pev_flagspevbDispenserIDid ], pev_flags ) | FL_KILLME );
}
}

public 
plugin_precache( ) {    
gHealingBeam precache_modelgHealingSprite );
gExplosionSprite precache_modelgExploSprite );

precache_modelgDispenserMdl );
precache_soundgDispenserActive );

new 
i;
for( 
0sizeof gDamageSoundsi++ )
precache_soundgDamageSounds] );
}

public 
CommandDispenserBuildid ) {
if( !
is_user_aliveid ) )
return 
PLUGIN_CONTINUE;

if( 
pev_validbDispenserIDid ] ) ) {
client_printidprint_center"You already have build a Heal Machine!" );
return 
PLUGIN_HANDLED;
}

if( !( 
pevidpev_flags ) & FL_ONGROUND ) ) {
client_printidprint_center"You must be on ground to build a Heal Machine!" );
return 
PLUGIN_HANDLED;
}

if ( 
pevidpev_bInDuck ) ) {
client_printidprint_center"You must not duck while building a Heal Machine!" );
return 
PLUGIN_CONTINUE;
}

new 
iMoney fm_get_user_moneyid );

if( 
iMoney DispenserCostsDISPENSER_LEVEL1 ] ) {
client_printidprint_center"Insufficient funds... Need at least %d$"DispenserCostsDISPENSER_LEVEL1 ] );
return 
PLUGIN_HANDLED;
}

new 
Float:flPlayerOrigin];
pevidpev_originflPlayerOrigin );

new 
iEntity engfuncEngFunc_CreateNamedEntityengfuncEngFunc_AllocStringszDispenserClassname ) );

if( !
pev_validiEntity ) )
return 
PLUGIN_HANDLED;

new 
iTeam fm_get_user_teamid );

set_peviEntitypev_classnamegDispenserClassname );
engfuncEngFunc_SetModeliEntitygDispenserMdl );
set_peviEntitypev_body, ( iTeam == ) ? DISPENSER_LEVEL1 DISPENSER_LEVEL1 );

// Drop entity to the ground and fix its size (in order not to go underground)
new Float:end];
new 
tr create_tr2( );

end] = flPlayerOrigin];
end] = flPlayerOrigin];
end] = -8192.0;

engfuncEngFunc_TraceLineflPlayerOriginendIGNORE_MONSTERSiEntitytr );
get_tr2trTR_vecEndPosend );
free_tr2tr );

new 
Float:vec_dist vector_distanceflPlayerOriginend );
flPlayerOrigin] -= vec_dist;

new 
Float:maxs];
maxs] = 12.0;
maxs] = 10.0;
maxs] = vec_dist 12.0;

engfuncEngFunc_SetSizeiEntityFloat:{ -12.0, -10.0, -12.0 }, maxs );
engfuncEngFunc_SetOriginiEntityflPlayerOrigin );

set_peviEntitypev_teamiTeam );
set_peviEntitypev_solidSOLID_NOT );
set_peviEntitypev_movetypeMOVETYPE_FLY );
set_peviEntitypev_healthfloatDispenserMaxHealthDISPENSER_LEVEL1 ] ) );
set_peviEntitypev_takedamageDAMAGE_YES );
set_peviEntitypev_iuser2id );
set_peviEntitypev_iuser3STATUS_BUILDING );
set_peviEntitypev_iuser1DISPENSER_LEVEL1 );
set_peviEntitypev_nextthinkget_gametime( ) + 0.1 );

gDispenserOriginid ][ ] = flPlayerOrigin];
gDispenserOriginid ][ ] = flPlayerOrigin];
gDispenserOriginid ][ ] = flPlayerOrigin] + vec_dist;

bDispenserIDid ] = iEntity;

set_task5.0"BuildDispenserSolid"iEntity );
fm_set_user_moneyidiMoney DispenserCostsDISPENSER_LEVEL1 ] );

client_printidprint_center"Building a Heal Machine right here!" );

return 
PLUGIN_HANDLED;
}

public 
BuildDispenserSolidiEntity ) {
if( 
pev_validiEntity ) ) {
new 
iTeam peviEntitypev_team ) - 1;

fm_set_renderingiEntitykRenderFxGlowShellgBeamColoriTeam ][ ], gBeamColoriTeam ][ ], gBeamColoriTeam ][ ], kRenderNormal);

set_peviEntitypev_solidSOLID_BBOX );
set_peviEntitypev_iuser3STATUS_ACTIVE );

emit_soundiEntityCHAN_STATICgDispenserActiveVOL_NORMATTN_NORM0PITCH_NORM );
}
}

public 
bool:CanUpgradeDispenseriEntityid ) {
if( 
peviEntitypev_iuser1 ) == DISPENSER_LEVEL3 )
return 
false;

if( 
peviEntitypev_team ) != fm_get_user_teamid ) )
return 
false;

if( 
peviEntitypev_iuser2 ) == id )
return 
false;

if( 
peviEntitypev_iuser4 ) == id )
return 
false;

return 
true;
}

public 
DispenserUpgradeiEntityid ) {
new 
iNewLevel peviEntitypev_iuser1 ) + 1;
set_peviEntitypev_body, ( peviEntitypev_team ) == ) ? iNewLevel iNewLevel );
set_peviEntitypev_iuser1iNewLevel );
set_peviEntitypev_healthfloatDispenserMaxHealthiNewLevel ] ) );

if( 
iNewLevel == DISPENSER_LEVEL2 )
set_peviEntitypev_iuser4id );

fm_set_user_moneyidfm_get_user_moneyid ) - DispenserCostsiNewLevel ] );
emit_soundiEntityCHAN_STATICgDispenserActiveVOL_NORMATTN_NORM0PITCH_NORM );

new 
iOwner peviEntitypev_iuser2 );

new 
szName32 ];
get_user_nameidszName31 );

client_printiOwnerprint_center"%s has upgraded your Heal Machine to level %d"szNameiNewLevel );
}

public 
bacon_TakeDamageentidinflictoridattackerFloat:damagedamagebits ) {
if( !
pev_valident ) )
return 
HAM_IGNORED;

if( !
is_user_connectedidattacker ) )
return 
HAM_IGNORED;

new 
szClassname32 ];
peventpev_classnameszClassnamecharsmaxszClassname ) );

if( 
equalszClassnamegDispenserClassname ) ) {    
if( 
peventpev_team ) == fm_get_user_teamidattacker ) )
return 
HAM_SUPERCEDE;

if( 
peventpev_health ) - damage <= 0.0 ) {
new 
szName32 ];
get_user_nameidattackerszName31 );

new 
iOwner peventpev_iuser2 );

engfuncEngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYgDispenserOriginiOwner ], );
write_byteTE_EXPLOSION );
engfuncEngFunc_WriteCoordgDispenserOriginiOwner ][ ] );
engfuncEngFunc_WriteCoordgDispenserOriginiOwner ][ ] );
engfuncEngFunc_WriteCoordgDispenserOriginiOwner ][ ] );
write_shortgExplosionSprite ); 
write_byte30 ); 
write_byte10 ); 
write_byte); 
message_end( );

new 
victim = -1;
new 
Float:fPlayerOrigin], Float:fPlayerVelocity], Float:fDmgToDoFloat:distance;
while ( ( 
victim engfuncEngFunc_FindEntityInSpherevictimgDispenserOriginiOwner ], 250.0 ) ) != ) {
if( !
is_user_alivevictim ) )
continue;

pevvictimpev_originfPlayerOrigin );
distance get_distance_fgDispenserOriginiOwner ], fPlayerOrigin );

fDmgToDo DISPENSER_EXPLOSION_MAXDMG - ( DISPENSER_EXPLOSION_MAXDMG * ( distance 250.0 ) );
ExecuteHamHam_TakeDamagevictimentiOwnerfDmgToDoDMG_BLAST );

if ( ( 
pevvictimpev_flags ) & FL_ONGROUND ) && fPlayerOrigin] < gDispenserOriginiOwner ][ ] )
fPlayerOrigin] = gDispenserOriginiOwner ][ ] + distance;

pevvictimpev_velocityfPlayerVelocity );

for ( new 
03i++ )
fPlayerVelocity] = ( ( ( fPlayerOrigin] - gDispenserOriginiOwner ][ ] ) * 250.0 distance gDispenserOriginiOwner ][ ] ) - fPlayerOrigin] ) * 3.0;

set_pevvictimpev_velocityfPlayerVelocity );
}

bDispenserIDiOwner ] = 0;
set_peventpev_flagspeventpev_flags ) | FL_KILLME );

return 
HAM_IGNORED;
}

emit_soundentCHAN_STATICgDamageSoundsrandom_num0charsmaxgDamageSounds ) ) ], VOL_NORMATTN_NORM0PITCH_NORM );    
}

return 
HAM_IGNORED;
}

public 
bacon_TraceAttackiVictimiAttackerFloat:flDamageFloat:flDirection], iTriDamageBits ) {
if( !
pev_validiVictim ) )
return 
HAM_IGNORED;

if( !
is_user_connectediAttacker ) )
return 
HAM_IGNORED;

new 
szClassname32 ];
peviVictimpev_classnameszClassnamecharsmaxszClassname ) );

if( 
equalszClassnamegDispenserClassname ) ) {
if( 
peviVictimpev_team ) == fm_get_user_teamiAttacker ) )
return 
HAM_SUPERCEDE;

new 
Float:flEndOrigin];
get_tr2iTrTR_vecEndPosflEndOrigin );

UTIL_SparksflEndOrigin );
}

return 
HAM_IGNORED;
}

public 
bacon_TouchiEntid ) {
if( !
pev_validiEnt ) )
return 
HAM_IGNORED;

if( !
is_user_aliveid ) )
return 
HAM_IGNORED;

new 
szClassname32 ];
peviEntpev_classnameszClassnamecharsmaxszClassname ) );

if( 
equalszClassnamegDispenserClassname ) ) {
if( 
CanUpgradeDispenseriEntid ) ) {
if( 
fm_get_user_moneyid ) >= DispenserCostspeviEntpev_iuser1 ) + ] )
DispenserUpgradeiEntid );
}
}

return 
HAM_IGNORED;
}

public 
EVENT_Spawnid ) {
if( !
is_user_aliveid ) )
return 
HAM_IGNORED;

if( !
pev_validbDispenserIDid ] ) )
return 
HAM_IGNORED;

new 
iTeam fm_get_user_teamid );
if( 
iTeam == pevbDispenserIDid ], pev_team ) )
return 
HAM_IGNORED;

set_pevbDispenserIDid ], pev_teamiTeam );

new 
iLevel pevbDispenserIDid ], pev_iuser1 );
set_pevbDispenserIDid ], pev_body, ( iTeam == ) ? iLevel iLevel );
fm_set_renderingbDispenserIDid ], kRenderFxGlowShellgBeamColoriTeam ][ ], gBeamColoriTeam ][ ], gBeamColoriTeam ][ ], kRenderNormal);

return 
HAM_IGNORED;
}

public 
DispenserThinkiEnt ) {
if( !
pev_validiEnt ) )
return 
FMRES_IGNORED;

new 
szClassname32 ];
peviEntpev_classnameszClassname31 );

if( !
equalszClassnamegDispenserClassname ) )
return 
FMRES_IGNORED;

switch( 
peviEntpev_iuser3 ) ) {
case 
STATUS_BUILDINGfm_set_renderingiEntkRenderFxDistort255255255kRenderTransAdd70 );
case 
STATUS_ACTIVE: {
new 
iOwner peviEntpev_iuser2 );
new 
iTeam peviEntpev_team );
new 
iLevel peviEntpev_iuser1 );
new 
id = -1;

while( ( 
id engfuncEngFunc_FindEntityInSphereidgDispenserOriginiOwner ], floatDispenserHealRadiusiLevel ] ) ) ) != ) {
if( !
is_user_aliveid ) )
continue;

if( 
fm_get_user_teamid ) != iTeam )
continue;

if( !
UTIL_IsVisibleidiEnt ) )
continue;

new 
Float:health;
pevidpev_healthhealth );

if( 
health 1.0 floatDispenserMaxHealingiLevel ] ) )
continue;

set_pevidpev_healthhealth 1.0 );

new 
Float:flOrigin];
pevidpev_originflOrigin );
UTIL_BeamEntsflOrigingDispenserOriginiOwner ], 5020050 );
}
}
}

new 
Float:flAngles];
peviEntpev_anglesflAngles );
flAngles] += 1.0;

set_peviEntpev_anglesflAngles );
set_peviEntpev_nextthinkget_gametime( ) + 0.1 );

return 
FMRES_IGNORED;
}

public 
FW_TracelineFloat:start], Float:end], noMonstersid ) {
if( !
is_user_aliveid ) )
return 
FMRES_IGNORED;

new 
iEnt get_trTR_pHit );

if( !
pev_validiEnt ) ) {
if( 
bTriggerid ] ) {
ClearSyncHudid g_HUDSync );
bTriggerid ] = false;
}
return 
FMRES_IGNORED;
}

new 
szClassname32 ];
peviEntpev_classnameszClassname31 );

if( !
equalszClassnamegDispenserClassname ) ) {
if( 
bTriggerid ] ) {
ClearSyncHudid g_HUDSync );
bTriggerid ] = false;
}
return 
FMRES_IGNORED;
}

new 
iTeam peviEntpev_team ) - 1;
new 
iLevel peviEntpev_iuser1 ) + 1;
new 
szName32 ], szUpgrade17 ];
get_user_namepeviEntpev_iuser2 ), szName31 );

if( 
CanUpgradeDispenseriEntid ) )
formatexszUpgrade16"^n[Upgrade: %d$]"DispenserCostsiLevel ] );

set_hudmessagegBeamColoriTeam ][ ] , gBeamColoriTeam ][ ] , gBeamColoriTeam ][ ] , -1.0 0.38 , .holdtime=0.4 , .channel=-);
ShowSyncHudMsgidg_HUDSync"[Heal Machine]^n[Owner: %s]^n[HP: %d/%d]^n[Level: %d]%s"szNamepeviEntpev_health ), DispenserMaxHealthiLevel ], iLevelszUpgrade );
bTriggerid ] = true;

return 
FMRES_IGNORED;
}

stock UTIL_BeamEntsFloat:flStart], Float:flEnd], rg) {
engfuncEngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYflStart );
write_byteTE_BEAMPOINTS );
engfuncEngFunc_WriteCoordflStart] );
engfuncEngFunc_WriteCoordflStart] );
engfuncEngFunc_WriteCoordflStart] );
engfuncEngFunc_WriteCoordflEnd] );
engfuncEngFunc_WriteCoordflEnd] );
engfuncEngFunc_WriteCoordflEnd] );
write_shortgHealingBeam );
write_byte);
write_byte);
write_byte);
write_byte25 );
write_byte);
write_byte);
write_byte);
write_byte);
write_byte255 );
write_byte20 );
message_end( );
}

stock UTIL_SparksFloat:flOrigin] ) {
engfuncEngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYflOrigin);
write_byteTE_SPARKS );
engfuncEngFunc_WriteCoordflOrigin] );
engfuncEngFunc_WriteCoordflOrigin] );
engfuncEngFunc_WriteCoordflOrigin] );
message_end( );
}

stock bool:UTIL_IsVisibleindexentity ) {
new 
Float:flStart], Float:flDest];
pevindexpev_originflStart );
pevindexpev_view_ofsflDest );

for( new 
03i++ )
flStart] += flDest];

peventitypev_originflDest );
engfuncEngFunc_TraceLineflStartflDestIGNORE_MONSTERSindex);

new 
Float:flFraction;
get_tr20TR_flFractionflFraction );

if( 
flFraction == 1.0 || get_tr20TR_pHit ) == entity )
return 
true;

return 
false;
}

stock fm_get_user_moneyid )
return 
get_pdata_intid115);

stock fm_set_user_moneyidmoneyflash=) {    
set_pdata_intid115money);

message_beginMSG_ONE_UNRELIABLEg_msgMoney_id );
write_longmoney );
write_byteflash );
message_end( );

return 
1;
}

stock fm_get_user_teamid )
return 
get_pdata_intid114 );

stock fm_set_renderingentityfx kRenderFxNone255255255render kRenderNormalamount 16 ) {
new 
Float:RenderColor];
RenderColor] = float);
RenderColor] = float);
RenderColor] = float);

set_peventitypev_renderfxfx );
set_peventitypev_rendercolorRenderColor );
set_peventitypev_rendermoderender );
set_peventitypev_renderamtfloatamount ) );

return 
1;

These are the forwards I have added/briefly modified :
Code:
RegisterHam( Ham_TakeDamage, szDispenserClassname, "bacon_TakeDamage", 0 ); RegisterHam( Ham_Touch, szDispenserClassname, "bacon_Touch" ); RegisterHam( Ham_Spawn, "player", "EVENT_Spawn", 1 ); register_forward( FM_TraceLine, "FW_Traceline", 1 );

Besides that I have added some entity information in pev_iuser1-4 (entity's levels and additional stuff), but I don't think that this is the reason for such frequent crashes. Could someone please look through and tell me what is wrong, maybe you will find a mistake. There has got to be a stupid small mistake for sure.

I have also moved Ham_TakeDamage from Post to Pre. (Because grenade damage can't be blocked in post event)

Last edited by HamletEagle; 03-17-2016 at 15:57. Reason: Post fixed
Kowalsky is offline
SkumTomteN
Veteran Member
Join Date: Oct 2013
Location: Asgard
Old 03-16-2016 , 17:02   Re: Is it safe?
Reply With Quote #5

You are setting the bDispenserID[ id ] to 0 before killing the entity in client_disconnect + bacon_TakeDamage.

Have you ever been on the server when this happens?.
__________________
Contact: Steam
Videos: Youtube

Last edited by SkumTomteN; 03-16-2016 at 17:06.
SkumTomteN is offline
Kowalsky
Senior Member
Join Date: Mar 2015
Location: Poland
Old 03-16-2016 , 17:17   Re: Is it safe?
Reply With Quote #6

Quote:
Originally Posted by SkumTomteN View Post
You are setting the bDispenserID[ id ] to 0 before killing the entity in client_disconnect + bacon_TakeDamage.

Have you ever been on the server when this happens?.
Thank you for your responce. I have been testing Ham_TakeDamage event myself (killing the entity). The server was okay and imo it should be okay since every time I call this variable I check if it is a valid entity. I will try putting it after FL_KILLME tho and will report later on. Although I am not sure if this is the case.

Last edited by Kowalsky; 03-16-2016 at 17:17.
Kowalsky is offline
Kowalsky
Senior Member
Join Date: Mar 2015
Location: Poland
Old 03-17-2016 , 12:07   Re: Is it safe?
Reply With Quote #7

It didn't help. Could some experienced coder please look through my code and tell what is wrong with it? I would really appreceate it. I have been looking through it for like 10 times already and couldnt find anything suspicious.

E: Nvm, I have fixed the problem!

Last edited by Kowalsky; 03-17-2016 at 15:10.
Kowalsky is offline
siriusmd99
Veteran Member
Join Date: Oct 2013
Location: Republic of Moldova
Old 03-17-2016 , 14:35   Re: Is it safe?
Reply With Quote #8

Man add expression from client disconnect to client_connect too. I had the same issue on a VIP plugin and after I set it to 0 on both connect and disconnect, it worked.
And do not check pev_valid, just make it = 0 , it's fastest than calling pev.
siriusmd99 is offline
HamletEagle
AMX Mod X Plugin Approver
Join Date: Sep 2013
Location: Romania
Old 03-17-2016 , 15:56   Re: Is it safe?
Reply With Quote #9

Kowalsky, after you solved your problem don't delete anything from the thread, also post the solution. It may help others later.
__________________
HamletEagle is offline
Kowalsky
Senior Member
Join Date: Mar 2015
Location: Poland
Old 03-18-2016 , 03:56   Re: Is it safe?
Reply With Quote #10

Okay so the problem was that I have set bDispenser[ id ] variable to 0 in client_disconnect first and afterwards executed set_pev on it (on entity id which was equal to 0 at that time). Basically what ScumTomteN said. I will add the code later when I am at home.

E: nvm, Hamlet fixed it. Thank you!

Last edited by Kowalsky; 03-18-2016 at 04:49.
Kowalsky is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 02:07.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode