Не могу скомпилировать мод из-за error.

Добро пожаловать!

Зарегистрировавшись у нас, вы сможете обсуждать, делиться и отправлять личные сообщения другим участникам нашего сообщества.

Зарегистрироваться!
Пользователь
Регистрация
17 Окт 2024
Сообщения
111
Я добавил в свой мод функцию OnPlayerTakeDamage но мне выдало эту ошибку
C:\Users\Acer\Desktop\ETERNITY RP\gamemodes\edit.pwn(17817) : error 021: symbol already defined: "ac_OnPlayerTakeDamage"
Хеллп пожалуйста
OnPlayerTakeDamage:
public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid, bodypart)
{
    if(weaponid == 0) SetPlayerHealth(playerid,pHealth[playerid]-5);
    if(weaponid == 1) SetPlayerHealth(playerid,pHealth[playerid]-8);
    if(weaponid == 2) SetPlayerHealth(playerid,pHealth[playerid]-8);
    if(weaponid == 3) SetPlayerHealth(playerid,pHealth[playerid]-8);
    if(weaponid == 4) SetPlayerHealth(playerid,pHealth[playerid]-10);
    if(weaponid == 5) SetPlayerHealth(playerid,pHealth[playerid]-8);
    if(weaponid == 8) SetPlayerHealth(playerid,pHealth[playerid]-8);
    if(issuerid != INVALID_PLAYER_ID && !IsACop(issuerid) && pInfo[issuerid][pMember] != 2) return 1;
    if(weaponid != 3 || PlayerCuffed{playerid} || IsPlayerInAnyVehicle(playerid)) return 1;
    format(format_string,70, "%s оглушил(а) дубинкой %s",GN(issuerid),GN(playerid));
    ProxDetector(25.0, issuerid, format_string, COLOR_PURPLE);
    TogglePlayerControllable(playerid,false), ClearAnim(playerid);
    ApplyAnimation(playerid, "CRACK", "crckdeth2", 4.1, 0, 1, 1, 1, 1,1);
    return TazerTime[playerid]=15, PlayerCuffed{playerid} = 1, true;
}
 
Пользователь
Регистрация
28 Мар 2022
Сообщения
157
в инклудах или де то еще ты уже вызываешь данный паблик ac_OnPlayerTakeDamage и поэтому не можешь добавить еще один, тебе сначала надо с ним разобраться а потом уже добавлять новый
 
Фулл Хаус
Активный
Регистрация
17 Июн 2025
Сообщения
1,382
Пользователь
Регистрация
27 Июл 2025
Сообщения
181
Фулл Хаус
Активный
Регистрация
17 Июн 2025
Сообщения
1,382
OFFTOP

это самый приват, у никого такого нет, он ведь просто скачал его с мировой сети

OFFTOP

нет он её купил у человека,который ломанул файлы Пентагона и выкачал самп мод оттуда. Чтобы не обесценить свой труд продал данному человеку за 50р

 
Пользователь
Регистрация
28 Дек 2024
Сообщения
315
т.к я не павнер то я не могу гарантировать что это правильное решение/вообще рабочее, но
удалить веапонконфиг
смотри
в античите у тебя идёт
#if defined _ALS_OnPlayerTakeDamage
#undef OnPlayerTakeDamage
#else
#define _ALS_OnPlayerTakeDamage
#endif
#define OnPlayerTakeDamage ac_OnPlayerTakeDamage

т.е все последующие вызовы OnPlayerTakeDamage на этапе компиляции автоматически превратятся в ac_OnPlayerTakeDamage

в веапон конфиг у тебя есть public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart) на строке 3374, т.е у тебя уже есть вызов 1 раз ac_OnPlayerTakeDamage и если ещё раз в конце мода написать как ты хотел OnPlayerTakeDamage то на этапе компиляции тебе его преобразует в ac_OnPlayerTakeDamage и будет ошибка

из вариантов решения у тебя есть удаление веапонконфига
либо дописывать логику OnPlayerTakeDamage в веапонконфиге шо я не рекомендую


Смотри, как у тебя устроено:


1. Что делает античит​


В rakcheat есть такие строки:



#if defined _ALS_OnPlayerTakeDamage
#undef OnPlayerTakeDamage
#else
#define _ALS_OnPlayerTakeDamage
#endif
#define OnPlayerTakeDamage ac_OnPlayerTakeDamage


Это означает, что все дальнейшие объявления OnPlayerTakeDamage на этапе компиляции автоматически переименовываются в ac_OnPlayerTakeDamage.




2. Что происходит в weapon-config​


В weapon-config есть:



public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart)


Но из-за строчек из античита (см. п.1), это превращается на этапе компиляции в:



public ac_OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart)


То есть фактически weapon-config уже один раз занял ac_OnPlayerTakeDamage.




3. Почему у тебя ошибка​


Когда ты в конце мода снова пишешь:



public OnPlayerTakeDamage(...)


то препроцессор снова заменяет это на:



public ac_OnPlayerTakeDamage(...)


А эта функция уже объявлена (weapon-config её создал). Поэтому компилятор и ругается:



error 021: symbol already defined: "ac_OnPlayerTakeDamage"




4. Какие варианты решения​


Тут есть несколько путей:


  • Удалить weapon-config. Самый простой вариант, тогда rakcheat останется один и ты сможешь писать свой OnPlayerTakeDamage без конфликтов.
  • Лезть в weapon-config и дописывать туда свою логику. Но это плохая идея, потому что потом будет сложно обновлять или поддерживать этот инклуд.
  • Правильный вариант (если хочется и античит, и weapon-config, и свою механику) — не объявлять OnPlayerTakeDamage в моде, а использовать хуки, которые уже даёт weapon-config (OnPlayerDamage / OnPlayerDamageDone и т.п.). Тогда твой код будет вызываться вместе с weapon-config без конфликтов.
 
Сверху