Obrażenia z laserów się zacinają
Andrzejek
24.03.2014
Witam mam takie pytanko, bo mam plugin od laserów i chodzi dokładnie o to
switch(get_pcvar_num(g_LDMGMODE)) { case 1: { if(pev(iCurrent,LASERMINE_HITING) == isHit) return PLUGIN_CONTINUE } case 2: { if(pev(iCurrent,LASERMINE_HITING) == isHit) { static Float:cnt static now,htime;now = floatround(get_gametime()) pev(iCurrent,LASERMINE_COUNT,cnt) htime = floatround(cnt) if(now - htime < get_pcvar_num(g_LDSEC)) { return PLUGIN_CONTINUE; }else{ set_pev(iCurrent,LASERMINE_COUNT,get_gametime()) } }else { set_pev(iCurrent,LASERMINE_COUNT,get_gametime()) } } }
I mam pytanko do was, dlaczego się zacina, cvar g_LDMGMODE mam ustawiony na 2 czyli własny czas, a cvar g_LDSEC na 1 czyli obrażenia co 1 sek, i nie wiem dlaczego się to zacina
GwynBleidD
24.03.2014
Andrzejek
24.03.2014
Sory, za brak opisu, dokładnie chodziło mi o to że nie kiedy się laser zacina w ten sposób że gdy gracz wejdzie w laser zadaje mu tylko 1 raz się wykona funkcja obrażeń, czyli tak jak bym ustawił cvar g_LDMGMODE na 1, o to mi dokładnie chodziło.
Cała funkcja:
CreateLaserDamage(iCurrent,isHit) { if(isHit < 0) return PLUGIN_CONTINUE switch(get_pcvar_num(g_LDMGMODE)) { case 1: { if(pev(iCurrent,LASERMINE_HITING) == isHit) return PLUGIN_CONTINUE } case 2: { if(pev(iCurrent,LASERMINE_HITING) == isHit) { static Float:cnt static now,htime;now = floatround(get_gametime()) pev(iCurrent,LASERMINE_COUNT,cnt) htime = floatround(cnt) if(now - htime < get_pcvar_num(g_LDSEC)) { return PLUGIN_CONTINUE; }else{ set_pev(iCurrent,LASERMINE_COUNT,get_gametime()) } }else { set_pev(iCurrent,LASERMINE_COUNT,get_gametime()) } } } new Float:vOrigin[3],Float:vEnd[3] pev(iCurrent,pev_origin,vOrigin) pev(iCurrent,pev_vuser1,vEnd) new teamid = pev(iCurrent, LASERMINE_TEAM) new szClassName[32] new Alive,God new iHitTeam,iHitHP,id new hitscore szClassName[0] = '^0' pev(isHit,pev_classname,szClassName,32) if((pev(isHit, pev_flags) & (FL_CLIENT | FL_FAKECLIENT | FL_MONSTER))) { Alive = pev_user_alive(isHit) God = get_user_godmode(isHit) if(!Alive || God) return PLUGIN_CONTINUE iHitTeam = int:cs_get_user_team(isHit) iHitHP = pev_user_health(isHit) - get_pcvar_num(g_LDMG) id = pev(iCurrent,LASERMINE_OWNER)//, szNetName[32] if(iHitHP <= 0) { if(iHitTeam != teamid) { emit_sound(isHit, CHAN_WEAPON, ENT_SOUND4, 1.0, ATTN_NORM, 0, PITCH_NORM) hitscore = 1 zp_set_user_ammo_packs(id,zp_get_user_ammo_packs(id) + get_pcvar_num(g_LFMONEY)) set_score(id,isHit,hitscore,iHitHP) }else { if(get_pcvar_num(g_LFF)) { emit_sound(isHit, CHAN_WEAPON, ENT_SOUND4, 1.0, ATTN_NORM, 0, PITCH_NORM) hitscore = -1 zp_set_user_ammo_packs(id,zp_get_user_ammo_packs(id) - get_pcvar_num(g_LFMONEY)) set_score(id,isHit,hitscore,iHitHP) } } }else if(iHitTeam != teamid || get_pcvar_num(g_LFF)) { emit_sound(isHit, CHAN_WEAPON, ENT_SOUND4, 1.0, ATTN_NORM, 0, PITCH_NORM) set_user_health(isHit,iHitHP) set_pev(iCurrent,LASERMINE_HITING,isHit); engfunc(EngFunc_MessageBegin,MSG_ONE_UNRELIABLE,g_msgDamage,{0.0,0.0,0.0},isHit); write_byte(get_pcvar_num(g_LDMG)) write_byte(get_pcvar_num(g_LDMG)) write_long(DMG_BULLET) engfunc(EngFunc_WriteCoord,vOrigin[0]) engfunc(EngFunc_WriteCoord,vOrigin[1]) engfunc(EngFunc_WriteCoord,vOrigin[2]) message_end() } }else if(equal(szClassName, ENT_CLASS_NAME3)) { new hl; hl = pev_user_health(isHit); set_user_health(isHit,hl-get_pcvar_num(g_LDMG)); } return PLUGIN_CONTINUE }
Andrzejek
25.03.2014
Już wiem jaki jest powód, gdy np. CT postawia laser a wejdzie w niego TT a za nim ustawi się kolejny TT to zada tylko obrażenia temu pierwszemu TT, czyli tak jak by po kolei zadawał obrażenia. Bardzo dziwne, bo jeżeli CT na modzie ZM wejdzie w laser, to TT spokojnie i bez zadanego oporu wejdzie do kampy(chodzi tu o opór lasera).
Tutaj daje pełny kod
lasermine_023.sma 38.39KB 3 downloads
Sprawdzałem, szukałem po kodzie i nie wiem dlaczego zadają obrażenia po kolei, jeżeli ktoś wie proszę o odpowiedź.
Andrzejek
27.03.2014
public ltm_Think( i_Ent ) { if(!pev_valid(i_Ent)) return FMRES_IGNORED; new EntityName[32]; pev(i_Ent, pev_classname, EntityName, 31); if(!equal( EntityName, ENT_CLASS_NAME)) return FMRES_IGNORED; static Float:fCurrTime; fCurrTime = get_gametime(); new typid = pev(i_Ent, LASERMINE_STEP); switch(typid) { case POWERUP_THINK: { new Float:fPowerupTime; pev(i_Ent, LASERMINE_POWERUP, fPowerupTime); if(fCurrTime > fPowerupTime) { set_pev(i_Ent, pev_solid, SOLID_BBOX); set_pev(i_Ent, LASERMINE_STEP, BEAMBREAK_THINK); PlaySound(i_Ent, ACTIVATE_SOUND); } new teamid = pev(i_Ent, LASERMINE_TEAM); switch(teamid) { case CS_TEAM_T: set_rendering(i_Ent,kRenderFxGlowShell,0,255,0,kRenderNormal,10); case CS_TEAM_CT:set_rendering(i_Ent,kRenderFxGlowShell,0,0,255,kRenderNormal,10); } set_pev(i_Ent, pev_nextthink, fCurrTime + 0.1); } case BEAMBREAK_THINK: { static Float:vEnd[3],Float:vOrigin[3]; pev(i_Ent, pev_origin, vOrigin); pev(i_Ent, LASERMINE_BEAMENDPOINT, vEnd); static iHit, Float:fFraction; engfunc(EngFunc_TraceLine, vOrigin, vEnd, DONT_IGNORE_MONSTERS, i_Ent, 0); get_tr2(0, TR_flFraction, fFraction); iHit = get_tr2(0, TR_pHit); if(fFraction < 1.0) { if(pev_valid(iHit)) { pev(iHit, pev_classname, EntityName, 31); if(!equal(EntityName, ENT_CLASS_NAME)) { set_pev(i_Ent, pev_enemy, iHit); if(get_pcvar_num(g_LMODE) == MODE_LASERMINE) CreateLaserDamage(i_Ent, iHit); else if(get_pcvar_num(g_LFF) || CsTeams:pev(i_Ent,LASERMINE_TEAM) != cs_get_user_team(iHit)) set_pev(i_Ent, LASERMINE_STEP, EXPLOSE_THINK); if (!pev_valid(i_Ent)) return FMRES_IGNORED; set_pev(i_Ent, pev_nextthink, fCurrTime + random_float(0.1, 0.3)); } } } if(get_pcvar_num(g_LDMGMODE)!=0) if(pev(i_Ent,LASERMINE_HITING) != iHit) set_pev(i_Ent,LASERMINE_HITING,iHit); // -- Tripmine is still there. if(pev_valid(i_Ent)) { static Float:fHealth; pev(i_Ent, pev_health, fHealth); if(fHealth <= 0.0 || (pev(i_Ent,pev_flags) & FL_KILLME)) { set_pev( i_Ent, LASERMINE_STEP, EXPLOSE_THINK ); set_pev( i_Ent, pev_nextthink, fCurrTime + random_float( 0.1, 0.3 ) ); } static Float:fBeamthink; pev(i_Ent, LASERMINE_BEAMTHINK, fBeamthink); if(fBeamthink < fCurrTime && get_pcvar_num(g_LVISIBLE)) { DrawLaser(i_Ent, vOrigin, vEnd); set_pev(i_Ent, LASERMINE_BEAMTHINK, fCurrTime + 0.1); } set_pev(i_Ent, pev_nextthink, fCurrTime + 0.01); } } case EXPLOSE_THINK: { // -- Stopping entity to think set_pev(i_Ent, pev_nextthink, 0.0); PlaySound(i_Ent, STOP_SOUND); g_deployed[pev(i_Ent,LASERMINE_OWNER)]--; CreateExplosion(i_Ent); CreateDamage(i_Ent,get_pcvar_float(g_LRDMG),get_pcvar_float(g_LRADIUS)) RemoveEntity(i_Ent); } } return FMRES_IGNORED; }
BEAMBREAK_THINK jest odpowiedzialny właśnie gdy ktoś w niego wejdzie zadaje obrażenia, i zauważyłem że iHit = get_tr2(0, TR_pHit); jest odpowiedzialne za ID któremu ma zadać obrażenia, czy ktoś ma jakieś pomysły?