Не могу скомпилировать мод из-за 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
Сообщения
158
в инклудах или де то еще ты уже вызываешь данный паблик ac_OnPlayerTakeDamage и поэтому не можешь добавить еще один, тебе сначала надо с ним разобраться а потом уже добавлять новый
 
/home/dayn (AK tiktok user linux)
Активный
Регистрация
17 Июн 2025
Сообщения
1,430
Пользователь
Регистрация
27 Июл 2025
Сообщения
181
/home/dayn (AK tiktok user linux)
Активный
Регистрация
17 Июн 2025
Сообщения
1,430
OFFTOP

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

OFFTOP

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

 
Пользователь
Регистрация
28 Дек 2024
Сообщения
311
т.к я не павнер то я не могу гарантировать что это правильное решение/вообще рабочее, но
удалить веапонконфиг
смотри
в античите у тебя идёт
#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 без конфликтов.
 
Сверху