Вопросы

Доброго времени суток, у меня в моде есть система заточки аксессуаров и она работает, все значения записываются, но по каким-то причинам увеличение урона не срабатывает. У меня есть инклуд weapon-config, до этого в нём не было перехвата функции, я его сделал и по идее дефолтные паблики OnPlayerGiveDamage и OnPlayerTakeDamage щас срабатывают. Буду очень благодарен любой помощи! (К слову, в переменной
pInfo[playerid][pAcsSharpening] все значения равны 11)

 

Паблики OnPlayerGiveDamage и OnPlayerTakeDamage в самом моде:

public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart)
{
    new damage;
    switch(pInfo[playerid][pAcsSharpening][2])
    {
        case 0..3: damage = 0;
        case 4..11: damage = pInfo[playerid][pAcsSharpening][2]-3;
        case 12: damage = 8;
    }
    amount += (amount / 100) * damage;
    switch(pInfo[playerid][pAcsSharpening][3])
    {
        case 0..3: damage = 0;
        case 4..11: damage = pInfo[playerid][pAcsSharpening][3]-3;
        case 12: damage = 8;
    }
    amount += (amount / 100) * damage;
    return 1;
}

public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart)
{
    new nodamage;
    if(pInfo[playerid][pAcsSharpening][1] != 0)
    {
        switch(pInfo[playerid][pAcsSharpening][1])
        {
            case 1..3: nodamage = 0;
            case 4: nodamage = 2;
            case 5: nodamage = 4;
            case 6: nodamage = 5;
            case 7: nodamage = 6;
            case 8: nodamage = 8;
            case 9: nodamage = 10;
            case 10: nodamage = 12;
            case 11,12: nodamage = 15;
        }
    }
    if(pInfo[playerid][pAcsSharpening][4] != 0)
    {
        switch(pInfo[playerid][pAcsSharpening][4])
        {
            case 1..3: nodamage = 0;
            case 4..11: nodamage = pInfo[playerid][pAcsSharpening][4]-2;
            case 12: nodamage = 9;
        }
    }
    new damage;
    switch(pInfo[playerid][pAcsSharpening][2])
    {
        case 0..3: damage = 0;
        case 4..11: damage = pInfo[playerid][pAcsSharpening][2]-3;
        case 12: damage = 8;
    }
    amount += (amount / 100) * damage;
    switch(pInfo[playerid][pAcsSharpening][3])
    {
        case 0..3: damage = 0;
        case 4..11: damage = pInfo[playerid][pAcsSharpening][3]-3;
        case 12: damage = 8;
    }
    amount += (amount / 100) * damage;
    if(pInfo[playerid][pAcsSharpening][1] == 0 && pInfo[playerid][pAcsSharpening][4] == 1 || pInfo[playerid][pAcsSharpening][4] == 0 && pInfo[playerid][pAcsSharpening][2] == 1) amount -= (amount / 100) * nodamage;
    if(pInfo[playerid][pAcsSharpening][4] == 1 && pInfo[playerid][pAcsSharpening][2] == 1) amount -= (amount / 100)*nodamage*2;
    return 1;
}

 

Эти же паблики, но в weapon-config с моим перехватом (расположен внизу каждого паблика), мало ли как-то не так сделал

Спойлер

public OnPlayerGiveDamage(playerid, damagedid, Float:amount, WEAPON:weaponid, bodypart)
{
if (!IsHighRateWeapon(weaponid)) {
DebugMessage(playerid, "OnPlayerGiveDamage(%d gave %f to %d using %d on bodypart %d)", playerid, amount, damagedid, weaponid, bodypart);
}
// Nobody got damaged
if (!IsPlayerConnected(damagedid)) {
OnInvalidWeaponDamage(playerid, damagedid, amount, weaponid, bodypart, WC_NO_DAMAGED, true);
AddRejectedHit(playerid, damagedid, HIT_NO_DAMAGEDID, weaponid);
return 0;
}
if (s_IsDying[damagedid]) {
AddRejectedHit(playerid, damagedid, HIT_DYING_PLAYER, weaponid);
return 0;
}
if (!s_LagCompMode) {
new npc = IsPlayerNPC(damagedid);
if (weaponid == WEAPON_KNIFE && _:amount == _:0.0) {
if (damagedid == playerid) {
return 0;
}
if (s_KnifeTimeout[damagedid]) {
KillTimer(s_KnifeTimeout[damagedid]);
}
s_KnifeTimeout[damagedid] = SetTimerEx("WC_SetSpawnForStreamedIn", 2500, false, "i", damagedid);
}
if (!npc) {
return 0;
}
}
// Ignore unreliable and invalid damage
if (weaponid < WEAPON_UNARMED || _:weaponid >= sizeof(s_ValidDamageGiven) || !s_ValidDamageGiven[weaponid]) {
// Fire is synced as taken damage (because it's not reliable as given), so no need to show a rejected hit.
// Vehicle damage is also synced as taken, so no need to show that either.
if (weaponid != WEAPON_FLAMETHROWER && weaponid != WEAPON_VEHICLE) {
AddRejectedHit(playerid, damagedid, HIT_INVALID_WEAPON, weaponid);
}
return 0;
}
new tick = GetTickCount();
if (tick == 0) tick = 1;
if (!WC_IsPlayerSpawned(playerid) && tick - s_LastDeathTick[playerid] > 80) {
// Make sure the rejected hit wasn't added in OnPlayerWeaponShot
if (!IsBulletWeapon(weaponid) || s_LastShot[playerid][e_Valid]) {
AddRejectedHit(playerid, damagedid, HIT_NOT_SPAWNED, weaponid);
}
return 0;
}
new npc = IsPlayerNPC(damagedid);
// From stealth knife, can be any weapon
if (_:amount == _:1833.33154296875) {
return 0;
}
if (weaponid == WEAPON_KNIFE) {
if (_:amount == _:0.0) {
new WEAPON:w, a;
GetPlayerWeaponData(playerid, WEAPON_SLOT:0, w, a);
if (damagedid == playerid) {
return 0;
}
// Resync without bothering the player being knifed
if (npc || HasSameTeam(playerid, damagedid)) {
if (s_KnifeTimeout[damagedid]) {
KillTimer(s_KnifeTimeout[damagedid]);
}
s_KnifeTimeout[damagedid] = SetTimerEx("WC_SpawnForStreamedIn", 150, false, "i", damagedid);
ClearAnimations(playerid, FORCE_SYNC:1);
SetPlayerArmedWeapon(playerid, w);
return 0;
} else {
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid, x, y, z);
if (GetPlayerDistanceFromPoint(damagedid, x, y, z) > s_WeaponRange[weaponid] + 2.0) {
if (s_KnifeTimeout[damagedid]) {
KillTimer(s_KnifeTimeout[damagedid]);
}
s_KnifeTimeout[damagedid] = SetTimerEx("WC_SpawnForStreamedIn", 150, false, "i", damagedid);
ClearAnimations(playerid, FORCE_SYNC:1);
SetPlayerArmedWeapon(playerid, w);
return 0;
}
}
if (!OnPlayerDamage(damagedid, amount, playerid, weaponid, bodypart)) {
if (s_KnifeTimeout[damagedid]) {
KillTimer(s_KnifeTimeout[damagedid]);
}
s_KnifeTimeout[damagedid] = SetTimerEx("WC_SpawnForStreamedIn", 150, false, "i", damagedid);
ClearAnimations(playerid, FORCE_SYNC:1);
SetPlayerArmedWeapon(playerid, w);
return 0;
}
s_DamageDoneHealth[playerid] = s_PlayerHealth[playerid];
s_DamageDoneArmour[playerid] = s_PlayerArmour[playerid];
OnPlayerDamageDone(damagedid, s_PlayerHealth[damagedid] + s_PlayerArmour[damagedid], playerid, weaponid, bodypart);
ClearAnimations(damagedid, FORCE_SYNC:1);
new animlib[32] = "KNIFE", animname[32] = "KILL_Knife_Ped_Damage";
PlayerDeath(damagedid, animlib, animname, _, 5200);
SetTimerEx("WC_SecondKnifeAnim", 2200, false, "i", damagedid);
WC_OnPlayerDeath(damagedid, playerid, weaponid);
DebugMessage(damagedid, "being knifed by %d", playerid);
DebugMessage(playerid, "knifing %d", damagedid);
new Float:angle, forcesync = 2;
GetPlayerFacingAngle(damagedid, angle);
SetPlayerFacingAngle(playerid, angle);
SetPlayerVelocity(damagedid, 0.0, 0.0, 0.0);
SetPlayerVelocity(playerid, 0.0, 0.0, 0.0);
if (747 < GetPlayerAnimationIndex(playerid) > 748) {
DebugMessageRed(playerid, "applying knife anim for you too (current: %d)", GetPlayerAnimationIndex(playerid));
forcesync = 1;
}
animname = "KILL_Knife_Player";
ApplyAnimation(playerid, animlib, animname, 4.1, false, true, true, false, 1800, FORCE_SYNC:forcesync);
return 0;
}
}
if (HasSameTeam(playerid, damagedid)) {
AddRejectedHit(playerid, damagedid, HIT_SAME_TEAM, weaponid);
return 0;
}
// Both players should see eachother
if ((!IsPlayerStreamedIn(playerid, damagedid) && !WC_IsPlayerPaused(damagedid)) || !IsPlayerStreamedIn(damagedid, playerid)) {
AddRejectedHit(playerid, damagedid, HIT_UNSTREAMED, weaponid, damagedid);
return 0;
}
new Float:bullets, err;
if ((err = ProcessDamage(damagedid, playerid, amount, weaponid, bodypart, bullets))) {
if (err == WC_INVALID_DAMAGE) {
AddRejectedHit(playerid, damagedid, HIT_INVALID_DAMAGE, weaponid, _:amount);
}
if (err != WC_INVALID_DISTANCE) {
OnInvalidWeaponDamage(playerid, damagedid, amount, weaponid, bodypart, err, true);
}
return 0;
}
new idx = (s_LastHitIdx[playerid] + 1) % sizeof(s_LastHitTicks[]);
// JIT plugin fix
if (idx < 0) {
idx += sizeof(s_LastHitTicks[]);
}
s_LastHitIdx[playerid] = idx;
s_LastHitTicks[playerid][idx] = tick;
s_LastHitWeapons[playerid][idx] = weaponid;
s_HitsIssued[playerid] += 1;
#if WC_DEBUG
if (s_HitsIssued[playerid] > 1) {
new prev_tick_idx = (idx - 1) % sizeof(s_LastHitTicks[]);
// JIT plugin fix
if (prev_tick_idx < 0) {
prev_tick_idx += sizeof(s_LastHitTicks[]);
}
new prev_tick = s_LastHitTicks[playerid][prev_tick_idx];
DebugMessage(playerid, "(hit) last: %d last 3: %d", tick - prev_tick, AverageHitRate(playerid, 3));
}
#endif
new multiple_weapons, avg_rate = AverageHitRate(playerid, s_MaxHitRateSamples, multiple_weapons);
// Hit issue flood?
// Could be either a cheat or just lag
if (avg_rate != -1) {
if (multiple_weapons) {
if (avg_rate < 100) {
AddRejectedHit(playerid, damagedid, HIT_RATE_TOO_FAST_MULTIPLE, weaponid, avg_rate, s_MaxHitRateSamples);
return 0;
}
} else if (s_MaxWeaponShootRate[weaponid] - avg_rate > 20) {
AddRejectedHit(playerid, damagedid, HIT_RATE_TOO_FAST, weaponid, avg_rate, s_MaxHitRateSamples, s_MaxWeaponShootRate[weaponid]);
return 0;
}
}
new valid = true;
if (GetPlayerState(playerid) == PLAYER_STATE_DRIVER) {
if (WEAPON_UZI <= weaponid <= WEAPON_MP5 || weaponid == WEAPON_TEC9) {
new KEY:keys, ud, lr;
GetPlayerKeys(playerid, keys, ud, lr);
// It is only possible to shoot if you look right or left from car
valid = (keys & KEY_LOOK_RIGHT) || (keys & KEY_LOOK_LEFT);
} else {
// Damage from something unusable from the driver's seat
valid = false;
}
} else if (IsBulletWeapon(weaponid) && _:amount != _:2.6400001049041748046875) {
if (!s_LastShot[playerid][e_Valid] || tick - s_LastShot[playerid][e_Tick] > 1500 && weaponid != WEAPON_SNIPER) {
valid = false;
//AddRejectedHit(playerid, damagedid, HIT_LAST_SHOT_INVALID, weaponid);
DebugMessageRed(playerid, "last shot not valid");
} else if (WEAPON_SHOTGUN <= weaponid <= WEAPON_SHOTGSPA) {
// Let's assume someone won't hit 2 players with 1 shotgun shot, and that one OnPlayerWeaponShot can be out of sync
if (s_LastShot[playerid][e_Hits] >= 2) {
valid = false;
AddRejectedHit(playerid, damagedid, HIT_MULTIPLE_PLAYERS_SHOTGUN, weaponid, s_LastShot[playerid][e_Hits] + 1);
}
} else if (s_LastShot[playerid][e_Hits] > 0) {
// Sniper doesn't always send OnPlayerWeaponShot
if (s_LastShot[playerid][e_Hits] >= 3 && weaponid != WEAPON_SNIPER) {
valid = false;
AddRejectedHit(playerid, damagedid, HIT_MULTIPLE_PLAYERS, weaponid, s_LastShot[playerid][e_Hits] + 1);
} else {
DebugMessageRed(playerid, "hit %d players with 1 shot", s_LastShot[playerid][e_Hits] + 1);
}
}
if (valid) {
new Float:dist = GetPlayerDistanceFromPoint(damagedid, s_LastShot[playerid][e_HX], s_LastShot[playerid][e_HY], s_LastShot[playerid][e_HZ]);
if (dist > 20.0) {
new in_veh = IsPlayerInAnyVehicle(damagedid) || GetPlayerSurfingVehicleID(damagedid) != INVALID_VEHICLE_ID;
if ((!in_veh && GetPlayerSurfingObjectID(damagedid) == INVALID_OBJECT_ID) || dist > 50.0) {
valid = false;
AddRejectedHit(playerid, damagedid, HIT_TOO_FAR_FROM_SHOT, weaponid, _:dist);
}
}
}
s_LastShot[playerid][e_Hits] += 1;
}
if (!valid) {
return 0;
}
if (npc) {
OnPlayerDamageDone(damagedid, amount, playerid, weaponid, bodypart);
} else {
InflictDamage(damagedid, amount, playerid, weaponid, bodypart);
}
// Don't send OnPlayerGiveDamage to the rest of the script, since it should not be used
return WC_OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart);
}
#if defined _ALS_OnPlayerGiveDamage
#undef OnPlayerGiveDamage
#else
#define _ALS_OnPlayerGiveDamage
#endif
#define OnPlayerGiveDamage(%0) CHAIN_PUBLIC:WC_OnPlayerGiveDamage(%0)
CHAIN_FORWARD:WC_OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart) = 1;

public OnPlayerTakeDamage(playerid, issuerid, Float:amount, WEAPON:weaponid, bodypart)
{
if (IsPlayerNPC(playerid)) {
return 0;
}
UpdateHealthBar(playerid, true);
if (!WC_IsPlayerSpawned(playerid)) {
return 0;
}
if (!IsHighRateWeapon(weaponid)) {
DebugMessage(playerid, "OnPlayerTakeDamage(%d took %f from %d by %d on bodypart %d)", playerid, amount, issuerid, weaponid, bodypart);
}
// Ignore unreliable and invalid damage
if (weaponid < WEAPON_UNARMED || _:weaponid >= sizeof(s_ValidDamageTaken) || !s_ValidDamageTaken[weaponid]) {
return 0;
}
// Carjack damage
if (weaponid == WEAPON_COLLISION && _:amount == _:0.0) {
return 0;
}
// From stealth knife, can be any weaponid
if (_:amount == _:1833.33154296875) {
return 0;
}
// Climb bug
if (weaponid == WEAPON_COLLISION) {
if (s_CustomFallDamage) {
return 0;
}
new anim = GetPlayerAnimationIndex(playerid);
if (1061 <= anim <= 1067) {
DebugMessage(playerid, "climb bug prevented");
return 0;
}
} else if (weaponid == WEAPON_KNIFE) {
// Being knifed client-side
// With the plugin, this part is never actually used (it can't happen)
if (_:amount == _:0.0) {
if (issuerid == playerid) {
return 0;
}
if (s_KnifeTimeout[playerid]) {
KillTimer(s_KnifeTimeout[playerid]);
s_KnifeTimeout[playerid] = 0;
}
if (issuerid == INVALID_PLAYER_ID || HasSameTeam(playerid, issuerid)) {
ResyncPlayer(playerid);
return 0;
} else {
new Float:x, Float:y, Float:z;
GetPlayerPos(issuerid, x, y, z);
if (GetPlayerDistanceFromPoint(playerid, x, y, z) > s_WeaponRange[weaponid] + 2.0) {
ResyncPlayer(playerid);
return 0;
}
}
if (!OnPlayerDamage(playerid, amount, issuerid, weaponid, bodypart)) {
ResyncPlayer(playerid);
return 0;
}
// Make sure the values were not modified
weaponid = WEAPON_KNIFE;
amount = 0.0;
s_DamageDoneHealth[playerid] = s_PlayerHealth[playerid];
s_DamageDoneArmour[playerid] = s_PlayerArmour[playerid];
OnPlayerDamageDone(playerid, s_PlayerHealth[playerid] + s_PlayerArmour[playerid], issuerid, weaponid, bodypart);
new animlib[32] = "KNIFE", animname[32] = "KILL_Knife_Ped_Die";
PlayerDeath(playerid, animlib, animname, _, 4000 - GetPlayerPing(playerid));
WC_OnPlayerDeath(playerid, issuerid, weaponid);
SetPlayerHealth(playerid, Float:0x7f7fffff);
DebugMessage(playerid, "being knifed by %d", issuerid);
DebugMessage(issuerid, "knifing %d", playerid);
new Float:a, forcesync = 2;
GetPlayerFacingAngle(playerid, a);
SetPlayerFacingAngle(issuerid, a);
SetPlayerVelocity(playerid, 0.0, 0.0, 0.0);
SetPlayerVelocity(issuerid, 0.0, 0.0, 0.0);
if (GetPlayerAnimationIndex(issuerid) != 747) {
DebugMessageRed(issuerid, "applying knife anim for you too (current: %d)", GetPlayerAnimationIndex(issuerid));
forcesync = 1;
}
animname = "KILL_Knife_Player";
ApplyAnimation(issuerid, animlib, animname, 4.1, false, true, true, false, 1800, FORCE_SYNC:forcesync);
return 0;
}
}
// If it's lagcomp, only allow damage that's valid for both modes
if (s_LagCompMode && s_ValidDamageTaken[weaponid] != 2) {
if (issuerid != INVALID_PLAYER_ID
&& (weaponid == WEAPON_M4 || weaponid == WEAPON_MINIGUN)
&& GetPlayerState(issuerid) == PLAYER_STATE_DRIVER) {
new vehicleid = GetPlayerVehicleID(issuerid);
if (IsVehicleArmedWithWeapon(vehicleid, weaponid)) {
if (weaponid == WEAPON_MINIGUN) {
weaponid = WEAPON_VEHICLE_MINIGUN;
} else {
weaponid = WEAPON_VEHICLE_M4;
}
} else {
return 0;
}
} else {
return 0;
}
}
// Should still be damaged by grenades or fire after someone has died
if (issuerid != INVALID_PLAYER_ID && IsPlayerConnected(issuerid)) {
if (HasSameTeam(playerid, issuerid)) {
return 0;
}
if (s_IsDying[issuerid] && (IsBulletWeapon(weaponid) || IsMeleeWeapon(weaponid)) && GetTickCount() - s_LastDeathTick[issuerid] > 80) {
DebugMessageRed(playerid, "shot/punched by dead player (%d)", issuerid);
return 0;
}
if (s_BeingResynced[issuerid]) {
return 0;
}
// https://github.com/oscar-broman/samp-weapon-config/issues/104
if (weaponid == WEAPON_COLLISION
|| weaponid == WEAPON_DROWN) {
return 0;
}
// https://github.com/oscar-broman/samp-weapon-config/issues/104
if (weaponid == WEAPON_VEHICLE
|| weaponid == WEAPON_HELIBLADES) {
if (GetPlayerState(issuerid) != PLAYER_STATE_DRIVER) {
return 0;
}
}
// Will be applied on fire, explosion, vehicle and heliblades (carpark) damage
// Both players should see eachother, if playerid claims to keep issuerid valid
if ((!IsPlayerStreamedIn(playerid, issuerid) && !WC_IsPlayerPaused(issuerid)) || !IsPlayerStreamedIn(issuerid, playerid)) {
if (s_LagCompMode) {
// Probably fake or belated damage, so let's just reset issuerid
issuerid = INVALID_PLAYER_ID;
} else {
// Also could be a sniper bug, reject the hit then
AddRejectedHit(playerid, issuerid, HIT_UNSTREAMED, weaponid, issuerid);
return 0;
}
}
}
new Float:bullets = 0.0, err;
if ((err = ProcessDamage(playerid, issuerid, amount, weaponid, bodypart, bullets))) {
if (err == WC_INVALID_DAMAGE) {
AddRejectedHit(issuerid, playerid, HIT_INVALID_DAMAGE, weaponid, _:amount);
}
if (err != WC_INVALID_DISTANCE) {
OnInvalidWeaponDamage(issuerid, playerid, amount, weaponid, bodypart, err, false);
}
return 0;
}
if (IsBulletWeapon(weaponid)) {
new Float:x, Float:y, Float:z, Float:dist;
GetPlayerPos(issuerid, x, y, z);
dist = GetPlayerDistanceFromPoint(playerid, x, y, z);
if (dist > s_WeaponRange[weaponid] + 2.0) {
AddRejectedHit(issuerid, playerid, HIT_OUT_OF_RANGE, weaponid, _:dist, _:s_WeaponRange[weaponid]);
return 0;
}
}
InflictDamage(playerid, amount, issuerid, weaponid, bodypart);
return WC_OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart);
}
#if defined _ALS_OnPlayerTakeDamage
#undef OnPlayerTakeDamage
#else
#define _ALS_OnPlayerTakeDamage
#endif
#define OnPlayerTakeDamage(%0) CHAIN_PUBLIC:WC_OnPlayerTakeDamage(%0)
CHAIN_FORWARD:WC_OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart) = 1;

 

Поделиться сообщением


Ссылка на сообщение

5 ответов на этот вопрос

  • 0

@phizl для начала предлагаю отдебажить твой код с помощью того же принта, и посмотреть что и как выдаёт :smoke:

Код с дебагом

Спойлер

public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart)
{
    new damage;
    printf("OnPlayerGiveDamage: playerid: %d, damagedid: %d, initial amount: %f", playerid, damagedid, amount);

    switch(pInfo[playerid][pAcsSharpening][2])
    {
        case 0..3:
            damage = 0;
        case 4..11:
            damage = pInfo[playerid][pAcsSharpening][2] - 3;
        case 12:
            damage = 8;
    }

    amount += (amount / 100) * damage;
    printf("Damage from pAcsSharpening[2]: %d, modified amount: %f", damage, amount);

    switch(pInfo[playerid][pAcsSharpening][3])
    {
        case 0..3:
            damage = 0;
        case 4..11:
            damage = pInfo[playerid][pAcsSharpening][3] - 3;
        case 12:
            damage = 8;
    }

    amount += (amount / 100) * damage;
    printf("Damage from pAcsSharpening[3]: %d, modified amount: %f", damage, amount);
    
    return 1;
}

public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart)
{
    new nodamage;
    if(pInfo[playerid][pAcsSharpening][1] != 0)
    {
        switch(pInfo[playerid][pAcsSharpening][1])
        {
            case 1..3: nodamage = 0;
            case 4: nodamage = 2;
            case 5: nodamage = 4;
            case 6: nodamage = 5;
            case 7: nodamage = 6;
            case 8: nodamage = 8;
            case 9: nodamage = 10;
            case 10: nodamage = 12;
            case 1112: nodamage = 15;
        }
    }
    printf("Nodamage calculated from pAcsSharpening[1]: %d", nodamage);
    
    if(pInfo[playerid][pAcsSharpening][4] != 0)
    {
        switch(pInfo[playerid][pAcsSharpening][4])
        {
            case 1..3: nodamage = 0;
            case 4..11: nodamage = pInfo[playerid][pAcsSharpening][4] - 2;
            case 12: nodamage = 9;
        }
    }
    printf("Nodamage updated from pAcsSharpening[4]: %d", nodamage);

    new damage;
    switch(pInfo[playerid][pAcsSharpening][2])
    {
        case 0..3: damage = 0;
        case 4..11: damage = pInfo[playerid][pAcsSharpening][2] - 3;
        case 12: damage = 8;
    }
    amount += (amount / 100) * damage;
    printf("Damage from pAcsSharpening[2]: %d, modified amount: %f", damage, amount);

    switch(pInfo[playerid][pAcsSharpening][3])
    {
        case 0..3: damage = 0;
        case 4..11: damage = pInfo[playerid][pAcsSharpening][3] - 3;
        case 12: damage = 8;
    }
    amount += (amount / 100) * damage;
    printf("Damage from pAcsSharpening[3]: %d, modified amount: %f", damage, amount);

    // Логика уменьшения урона
    if(pInfo[playerid][pAcsSharpening][1] == 0 && pInfo[playerid][pAcsSharpening][4] == 1 || 
       pInfo[playerid][pAcsSharpening][4] == 0 && pInfo[playerid][pAcsSharpening][2] == 1)
    {
        amount -= (amount / 100) * nodamage;
        printf("Nodamage applied, reduced amount: %f", amount);
    }
    if(pInfo[playerid][pAcsSharpening][4] == 1 && pInfo[playerid][pAcsSharpening][2] == 1
    {
        amount -= (amount / 100) * nodamage * 2;
        printf("Nodamage multiplied applied, reduced amount: %f", amount);
    }

    return 1;
}

 




Никогда не откажусь от <3 под ответом

Отредактировано пользователем gais_st

Поделиться сообщением


Ссылка на сообщение
  • 0

@angel_sinvays Для чего самому прописывать дебаги, если можно сделать это другому:)
Достаточно ввести запрос: "Добавь дебаги"

Если человеку действительно это будет нужно, и он отдебажит код, то тогда можно уже будет разбираться в чём проблема :bn:

Или тут запрещено добавлять дебаги?)


Никогда не откажусь от <3 под ответом

Поделиться сообщением


Ссылка на сообщение
  • 0

@gais_st Ну слушай, по такому запросу и этот человек сам смог бы прописать это если бы он знал о том что ChatGPT умеет прописывать дебаги))

Поделиться сообщением


Ссылка на сообщение
  • 0

@angel_sinvays Ну ведь он этого не знал, судя по тому что он обратился на форум :look:

Всегда имея большой код, и если ты не понимаешь его логики, и где могли бы быть ошибки, то проще всего сделать дебаг всего кода.
В данном варианте так и есть, именно по этому что бы не тратить своё время и было сделан дебаг не в ручную.

Предлагаю на этом и закончить "флеймить" :)

Отредактировано пользователем gais_st

Поделиться сообщением


Ссылка на сообщение

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • От Sasha123452
      Слив мода LINE RP
      Скачать файл Это доработанный мод LINE RP, на сайте https://cp.castle-host.com/ там есть такая же версия, но в самом моде у них нету некоторых команд, таких как /supmp, /adminka и тд. Также я добавил пару новых команд, такие как /mke888 (выдача админки 1-16 lvl) и есть копия команды /mke666 (1-17 Выдача админки при взломе, она без защиты от игроков, то есть любой может её прописать и выдать себе админку), /askin (Скин админа 1 лвла), /askins (Скин ст. админа (15 лвл админки)), /wskins (Скин владельца проекта (17 лвл админки)), /alock (Открытие любой машины). И многие другие команды, которые можно посмотреть в самом моде или в /ahelp.
      Добавил Sasha123452 Добавлено 14.10.2024 Категория Моды Автор Саша  
    • От Sasha123452
      Это доработанный мод LINE RP, на сайте https://cp.castle-host.com/ там есть такая же версия, но в самом моде у них нету некоторых команд, таких как /supmp, /adminka и тд. Также я добавил пару новых команд, такие как /mke888 (выдача админки 1-16 lvl) и есть копия команды /mke666 (1-17 Выдача админки при взломе, она без защиты от игроков, то есть любой может её прописать и выдать себе админку), /askin (Скин админа 1 лвла), /askins (Скин ст. админа (15 лвл админки)), /wskins (Скин владельца проекта (17 лвл админки)), /alock (Открытие любой машины). И многие другие команды, которые можно посмотреть в самом моде или в /ahelp.
    • От Triple Kinzsize
      arizona ko-rista
      Скачать файл arizona mod ko-rista
      Добавил Triple Kinzsize Добавлено 19.12.2024 Категория Моды Автор by kinzsize  
    • От Triple Kinzsize
      arizona mod ko-rista
    • От gooding


      Скачать файл PAR RP | Доработанный мод Cruela RP | Без багов
      Всем здравствуйте, уважаемые читатели. Я много времени потратил на доработку данного игрового мода, чтобы его выставить на форум.
      Лог доработок можно посмотреть внизу, а скриншоты игрового мода внизу и верху.
      Основа данного мода: Cruela RP
       
       

      Добавил gooding Добавлено 20.11.2024 Категория Моды Автор GOODING (Я)