←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Obrażenia z laserów się zacinają

  • +
  • -
Andrzejek's Photo 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 :(

Quote

  • +
  • -
GwynBleidD's Photo GwynBleidD 24.03.2014

Bo "zacina się" wszystko wyjaśnia... Co to znaczy, że się zacina? Gracz dostaje obrażenia po chwili? Nie dostaje wcale? Dostaje nawet jak już nie kieruje laser na niego? Opisz może to trochę, bo możliwości interpretacji tego jest trochę.
Quote

  • +
  • -
Andrzejek's Photo 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
}
Quote

  • +
  • -
Andrzejek's Photo 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

 

Attached File  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ź.

Quote

  • +
  • -
Andrzejek's Photo 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?

Quote