Вопросы

Доброго времени суток, у меня в моде есть система заточки аксессуаров и она работает, все значения записываются, но по каким-то причинам увеличение урона не срабатывает. У меня есть инклуд 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;

 

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


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

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

Ответы на этот вопрос пока отсутствуют

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

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

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

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


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

Войти

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


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

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

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

    • От gooding


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

      Добавил gooding Добавлено 20.11.2024 Категория Моды Автор GOODING (Я)  
    • От gooding
      Всем здравствуйте, уважаемые читатели. Я много времени потратил на доработку данного игрового мода, чтобы его выставить на форум.
      Лог доработок можно посмотреть внизу, а скриншоты игрового мода внизу и верху.
      Основа данного мода: Cruela RP
       
       

    • От gooding


      Скачать файл ASIA RP | Самый уникальный бонусник SA-MP | Malibu RP
      Доброго времени суток, ув. читатели! На скриншотах не видно много функционала, но в игре вы увидите, что этот мод хороший, потому что все баги мода Malibu RP и добавлено немного своего (50 рандомных событий на /activatetumanov и уникальный собственный маппинг).
      Добавил gooding Добавлено 15.12.2024 Категория Моды Автор Tumanov Studio  
    • От Доналдо Фарекелка
      Приветствую, этот мод я нашёл на просторах интернета. 
      Скачал мод у автора:  Developer Stravinskiy
      Доработал мод: Donaldo_Farekelka
       
      Предупреждаю! Мод сырой, багов стало меньше, но они есть.
      Мод: Баня, Подвал, В некоторых местах маппинг, система коронавируса, 8 лвл админок
       
      Информация:
      1) Dc_Cmd
      2) Mysql, mode, language - Всё настраивается теперь в pawno ( UPDATE: 1.1.0 )
      3) Административные права в данный момент можно выдать через /amakeadmin(Смотреть уроки) или БД ( UPDATE: 1.2.2 ).
       
      То что я сделал ( Всё что я делаю сейчас, смотрите в изменениях ):
       
    • От Доналдо Фарекелка


      Скачать файл Arizona RolePlay || Ser
      Приветствую, этот мод я нашёл на просторах интернета. 
      Скачал мод у автора:  Developer Stravinskiy
      Доработал мод: Donaldo_Farekelka
       
      Предупреждаю! Мод сырой, багов стало меньше, но они есть.
      Мод: Баня, Подвал, В некоторых местах маппинг, система коронавируса, 8 лвл админок
       
      Информация:
      1) Dc_Cmd
      2) Mysql, mode, language - Всё настраивается теперь в pawno ( UPDATE: 1.1.0 )
      3) Административные права в данный момент можно выдать через /amakeadmin(Смотреть уроки) или БД ( UPDATE: 1.2.2 ).
       
      То что я сделал ( Всё что я делаю сейчас, смотрите в изменениях ):
       
      Добавил Доналдо Фарекелка Добавлено 13.04.2023 Категория Моды Автор shenol (vk.com/donaldo_farekelka)