Плагин лазерных мин KnockBack

Тема в разделе "Программирование / Скриптинг", создана пользователем TheRunningMan, 5 сен 2012.

  1. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    Привет!
    В общем ситация такая, я перделываю плагин лазерных мин, но это не суть...
    Дело такое при взрыве мины мне нужно что б она отталкивала, посредством ентити env_explosion, т.е. объект ломается, спаумится эта интитя и тут же взрывается, по магнитуде наноси тповреждение, я это повреждение хукаю через сдкхук от этой энтити, и происходит система отталкивания, которую мне подсказали взять из ZombieReloaded, вот что я там нашел...
    PHP:
    new g_iToolsVelocity;
    public 
    OnPluginStart()
    {
     
    HookEvent("player_hurt"EventPlayerHurt);
     
    g_iToolsVelocity FindSendPropInfo("CBasePlayer""m_vecVelocity[0]");
    }

    public 
    Action:EventPlayerHurt(Handle:event, const String:name[], bool:dontBroadcast)
    {
        
    // Get all required event info.
        
    new index GetClientOfUserId(GetEventInt(event"userid"));
        new 
    attacker GetClientOfUserId(GetEventInt(event"attacker"));
        new 
    hitgroup GetEventInt(event"hitgroup");
        new 
    dmg_health GetEventInt(event"dmg_health");
        
        
    decl String:weapon[WEAPONS_MAX_LENGTH];
        
    GetEventString(event"weapon"weaponsizeof(weapon));
        
        
    // Forward event to modules.
        
    ClassAlphaUpdate(index);
        
    InfectOnClientHurt(indexattackerweapon);
        
    AccountOnClientHurt(indexattackerdmg_health);
        
    SEffectsOnClientHurt(index);
        
    KnockbackOnClientHurt(indexattackerweaponhitgroupdmg_health);
        
    NapalmOnClientHurt(indexattackerweapon);
        
    ZHPOnClientHurt(index);
    }

    KnockbackOnClientHurt(clientattacker, const String:weapon[], hitgroupdmg_health)
    {
        
    // If attacker is invalid, then stop.
        
    if (!ZRIsClientValid(attacker))
        {
            return;
        }
        
        
    // Client is a human, then stop.
        
    if (InfectIsClientHuman(client))
        {
            return;
        }
        
        
    // If attacker is a zombie, then stop.
        
    if (InfectIsClientInfected(attacker))
        {
            return;
        }
        
        
    // Get zombie knockback value.
        
    new Float:knockback ClassGetKnockback(client);
        
        new 
    Float:clientloc[3];
        new 
    Float:attackerloc[3];
        
        
    GetClientAbsOrigin(clientclientloc);
        
        
    // Check if a grenade was thrown.
        
    if (StrEqual(weapon"hegrenade"))
        {
            
    // Get the location of the grenade.
            
    if (KnockbackFindExplodingGrenade(attackerloc) == -1)
            {
                
    // If the grenade wasn't found, then stop.
                
    return;
            }
        }
        else
        {
            
    // Get attackers eye position.
            
    GetClientEyePosition(attackerattackerloc);
            
            
    // Get attackers eye angles.
            
    new Float:attackerang[3];
            
    GetClientEyeAngles(attackerattackerang);
            
            
    // Calculate knockback end-vector.
            
    TR_TraceRayFilter(attackerlocattackerangMASK_ALLRayType_InfiniteKnockbackTRFilter);
            
    TR_GetEndPosition(clientloc);
        }
        
        new 
    bool:weapons GetConVarBool(g_hCvarsList[CVAR_WEAPONS]);
        if (
    weapons)
        {
            new 
    weaponindex WeaponsNameToIndex(weapon);
            if (
    weaponindex != -1)
            {
                
    // Apply weapon knockback multiplier.
                
    knockback *= WeaponsGetKnockback(weaponindex);
            }
        }
        
        new 
    bool:hitgroups GetConVarBool(g_hCvarsList[CVAR_HITGROUPS]);
        if (
    hitgroups)
        {
            new 
    hitgroupindex HitgroupToIndex(hitgroup);
            if (
    hitgroupindex != -1)
            {
                
    // Apply hitgroup knockback multiplier.
                
    knockback *= HitgroupsGetKnockback(hitgroupindex);
            }
        }
        
        
    // Apply damage knockback multiplier.
        
    knockback *= float(dmg_health);
        
        
    // Apply knockback.
        
    KnockbackSetVelocity(clientattackerlocclientlocknockback);
    }

    KnockbackSetVelocity(client, const Float:startpoint[3], const Float:endpoint[3], Float:magnitude)
    {
        
    // Create vector from the given starting and ending points.
        
    new Float:vector[3];
        
    MakeVectorFromPoints(startpointendpointvector);
        
        
    // Normalize the vector (equal magnitude at varying distances).
        
    NormalizeVector(vectorvector);
        
        
    // Apply the magnitude by scaling the vector (multiplying each of its components).
        
    ScaleVector(vectormagnitude);
        
        
    // ADD the given vector to the client's current velocity.
        
    ToolsClientVelocity(clientvector);
    }

    stock ToolsClientVelocity(clientFloat:vecVelocity[3], bool:apply truebool:stack true)
    {
        
    // If retrieve if true, then get client's velocity.
        
    if (!apply)
        {
            
    // x = vector component.
            
    for (new 03x++)
            {
                
    vecVelocity[x] = GetEntDataFloat(clientg_iToolsVelocity + (x*4));
            }
            
            
    // Stop here.
            
    return;
        }
        
        
    // If stack is true, then add client's velocity.
        
    if (stack)
        {
            
    // Get client's velocity.
            
    new Float:vecClientVelocity[3];
            
            
    // x = vector component.
            
    for (new 03x++)
            {
                
    vecClientVelocity[x] = GetEntDataFloat(clientg_iToolsVelocity + (x*4));
            }
            
            
    AddVectors(vecClientVelocityvecVelocityvecVelocity);
        }
        
        
    // Apply velocity on client.
        
    TeleportEntity(clientNULL_VECTORNULL_VECTORvecVelocity);
    }

    Конечно, некоторые моменты мне были не понятны зачем и для чего и что это вообще, ибо саму физику процесса никто не объясняет, я это использовал, но не хукал player_hurt, а хукал провреждение от энтити взрыва( это правильно или я уже здесь ошибся), в общем измени ли получилось так...
    PHP:
    public OnClientPutInServer(client)
    {
        
    SDKHook(clientSDKHook_OnTakeDamageOnTakeDamageClient);
    }

    public 
    Action:OnTakeDamageClient(client, &attacker, &inflictor, &Float:damage, &damagetype)
    {
        
    decl String:classname[64];
        
        if(
    attacker && IsValidEdict(attacker))
        {
        
        
    GetEdictClassname(inflictorclassnamesizeof(classname));

        if(
    StrEqual(classname"grenadeee") && client && ZR_IsClientHuman(client))
        return 
    Plugin_Handled;
        
        
        if(
    StrEqual(classname"grenadeee") && client && ZR_IsClientZombie(client))
        {
            
    KnockbackOnClientHurt(clientinflictordamage);
            return 
    Plugin_Changed;
        }
        
        }
        return 
    Plugin_Continue;
    }

    KnockbackOnClientHurt(clientattackerFloat:dmg_health)
    {
        new 
    Float:knockback 1.1;

        new 
    Float:clientloc[3];
        new 
    Float:attackerloc[3];

        
    GetClientAbsOrigin(clientclientloc);

        
        
        
    GetEntPropVector(attackerProp_Send"m_vecOrigin"attackerloc);

        
        
    knockback *= dmg_health;

        
        
    KnockbackSetVelocity(clientattackerlocclientlocknockback);
    }

    KnockbackSetVelocity(client, const Float:startpoint[3], const Float:endpoint[3], Float:magnitude)
    {
        
        new 
    Float:vector[3];
        
    MakeVectorFromPoints(startpointendpointvector);
        
        
        
    NormalizeVector(vectorvector);
        
        
        
    ScaleVector(vectormagnitude);
        
       
        
    ToolsClientVelocity(clientvector);
    }

    ToolsClientVelocity(clientFloat:vecVelocity[3], bool:apply truebool:stack true)
    {
       
        if (!
    apply)
        {
        

        for (new 
    03x++)
        {
            
    vecVelocity[x] = GetEntDataFloat(clientg_iToolsVelocity + (x*4));
        }

        
        return;
        }
        
       
        if (
    stack)
        {
        
        new 
    Float:vecClientVelocity[3];

        
        for (new 
    03x++)
        {
            
    vecClientVelocity[x] = GetEntDataFloat(clientg_iToolsVelocity + (x*4));
        }

        
    AddVectors(vecClientVelocityvecVelocityvecVelocity);
        }

        
        
    TeleportEntity(clientNULL_VECTORNULL_VECTORvecVelocity);
    }

    тут наврено не понятно больше две последние функции, что они и для чего, понятно что есть комментарии, но как говорится изложите по русски))


    Само создание энтити

    PHP:
    public mineBreak(const String:output[], calleractivatorFloat:delay)
    {
     
    //Это узнаем индекс клиента через индекс мины
            
    new owner ZR_GetClientByLasermine(caller);
            if (
    owner == -1)
            return;
            
            
            
    decl Float:vecPos[3];
            
    GetEntPropVector(callerProp_Send"m_vecOrigin"vecPos);
            
    new 
    iExplosion CreateEntityByName("env_explosion");
            if(
    iExplosion != -1)
            {
                
    DispatchKeyValueiExplosion"classname""grenadeee");
                
                
    DispatchKeyValue iExplosion "iMagnitude" "1000" ); 
                
    DispatchKeyValue iExplosion "iRadiusOverride" "300" ); 
                
    DispatchKeyValue iExplosion "fireballsprite" "sprites/zerogxplode.spr" ); 
                
    DispatchKeyValue iExplosion "rendermode" "5" ); 
                
    AcceptEntityInput iExplosion "Enable" );
                
    DispatchSpawn(iExplosion);
                
    TeleportEntity(iExplosionvecPosNULL_VECTORNULL_VECTOR);
                
    ActivateEntity(iExplosion);
                
    SetEntProp(iExplosionProp_Data"m_iCustomDamageType"DMG_BLAST);
                
    SetEntPropEnt(iExplosionProp_Data"m_hOwnerEntity"owner);
                
    AcceptEntityInput(iExplosion"Explode");
            }    
    }    


    И так проблема в отталкивании, оно есть, но не правильно, т.е. когда я указываю владельца энтити он отталкивает относитнльно его или точнее относительно тог окуда владелец смотрит, вот я взорву, и куда я смотрел туда и оттолкнет, если я не указываю владельца, то конечно отталкивает нормально тноситенльо взрыва в разные стороны, я честно не понимаю в чем проблема, потому что сам особо не шарю, но пытаюсь разобраться, эксперименты хорошо, я все плагины написал на экспериментах))) но все таки если не знаешь или не понмиаешь, то лучше чтоб указали где ошибка или пояснили хотя в чем она заключается...
     
  2. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    Re: KnockBack

    извини, не особо вчитывался, посмотри thc_rpg, там вроде было нечто подобное
     
  3. wanted241

    wanted241 Real-Gamer.Ru

    Сообщения:
    783
    Симпатии:
    355
    Re: KnockBack

    Это легко сделать. Нахер тебе код из Zombie Reloaded и THC RPG ?

    P.S. Я делать бесплатно это не буду, ибо мне это не нужно.
     
  4. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    Re: KnockBack

    я тут и не просил ничего делать я просил помочь по-моему тут раздел для этого, и рекламить тут себя не надо...
     
  5. schmidt

    schmidt wS (skype: ws.css)

    Сообщения:
    188
    Симпатии:
    347
    Re: KnockBack

    Т.е. тебе нужна функция для отталкивания назад? Попробуй это:

    Код:
    PushClient(client)
    {
        decl Float:EyeAngles[3];
        GetClientEyeAngles(client, EyeAngles);
    
        decl Float:Push[3];
        Push[0] = (FloatMul(-50.0, Cosine(DegToRad(EyeAngles[1]))));
        Push[1] = (FloatMul(-50.0, Sine(DegToRad(EyeAngles[1]))));
        Push[2] = (FloatMul(-50.0, Sine(DegToRad(EyeAngles[0]))));
        ScaleVector(Push, 50.0);
    
        TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, Push);
    }
     
  6. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    Re: KnockBack

    никто не читает темы....
    Мне нужно чтоб игрок отлетал от источника взрыва, и вперед или назад, все зависит от его расположеия и расположения игрока на которого действует взрыв, в моем случае получается что, отталкиванеи проиходит, туда куда смотрит владелец так сказать взрыва, туда и отлетает жертва взрыва...
    Но я попробую, но код похож, на плагин KnockBack, но ваш почему то не учитывает силу урона, т.е. дамаг...

    Попробывал, тоже самое, отталкивает туда куда смотрит атакующий
     
    Последнее редактирование: 6 сен 2012
  7. aktel

    aktel

    Сообщения:
    118
    Симпатии:
    13
    Re: KnockBack



    Вместо GetClientEyeAngles используй свою функцию .

     
  8. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    Re: KnockBack

    в смысле свою функцию, т.е. нужно вместо этого вычислить расположение атакера?
     
  9. wanted241

    wanted241 Real-Gamer.Ru

    Сообщения:
    783
    Симпатии:
    355
    Re: KnockBack

    Для большей инфы советую пойти на alliedmods.net. Там все-таки больше знают о SM!
     
  10. schmidt

    schmidt wS (skype: ws.css)

    Сообщения:
    188
    Симпатии:
    347
    Re: KnockBack

    При чем тут SM? Толкают игрока с помощью TeleportEntity, вот только куда - это уже математика/геометрия - формулы.
     
  11. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    Re: KnockBack

    в общем проблему я решил свою и получилось все отлично только каким точно сопсобом не понятно, то что оттлкивание я сделал было правильно, и я забыл что мина это физикс оверайд, который взрывается с радиусом)) в общем я бурал создание энитит взрыва и сдела через мины дамагу, и во ткорень проблемы, когда объект ломается он сам по себе уже вызывает отталкивание от источника, и оно будет правильном если мина взорвалась сама по себе , т.е. атакером не является игрок, так вот, мне удалось убрать это отталкивание, которое мешало правильно работать моему отталкиванию, причем дамаг и убийства все зачисляется нормально...
    Проблема была в том в каком порядке прописывать свойства энтити, я прсот ов этом не сильно силен, и всех их не знаю и не использовал, но каким-то чудом эта мина при взрыве перстала отталкивать нанося дамаг))
    В общем кто понял может объяснит, в чем прикол, на примере кода мин zr lasermine 1.4.2