Ну перепродажа) сейчас напишу Боту)
да не, ему пофиг, тем более как я понял он дописывал)Ну перепродажа) сейчас напишу Боту)
Оказалось не пофиг)да не, ему пофиг, тем более как я понял он дописывал)
Ждём васПочему этот ресурс должен быть на продаже?
;Команда для возрождения без меню
; note: Регистрируется во всех чатах + консоль
cl_cmd = adminlife_on
;Игрок имеющий этот флаг доступа будет возрождаться всегда (-1 - Отключить)
;Счётчик возрождений уменьшаться не будет
all_access = -1
;Задерка перед открытием меню
open_menu_delay = 2.5
;Минимальное кол-во игроков для работы плагина
min_players = 5
;Разница в кол-ве живых противников, при которой нельзя будет возродится
alive_team_diff = 2
;Минимальное кол-во живых игроков при котором можно будет возродится
alive_players = 2
;Доступы
;"Флаг(и) доступа" "кол-во возрождений" "С какого раунда доступно"
"o" "1" "1"
[ru]
MENU_TITLE = \wВозродимся?
MENU_ITEM_YES = Да
MENU_ITEM_NO = Нет
MENU_NUMBER_COLOR = \y
CHAT_USER_ALIVE = ^3[^4Respawn^3]^1 Вы и так живы^4!
CHAT_RESPAWN_QUANTITY = ^3[^4Respawn^3]^1 У вас закончился лимит возрождений^4!
CHAT_FROM_ROUND = ^3[^4Respawn^3]^1 Возрождение доступно с^4 %i ^1раунда^4!
CHAT_MIN_PLAYERS = ^3[^4Respawn^3]^1 Необходимо минимальное кол-во игроков ^3[^4%i^3]
CHAT_BOMB_PLANTED = ^3[^4Respawn^3]^1 Нельзя возродится, если установлена бомба^4!
CHAT_ALIVE_PLAYERS = ^3[^4Respawn^3]^1 Нельзя возродится если в живых осталось меньше ^4%i ^1игроков^4!
CHAT_ALIVE_TEAM_DIFF = ^3[^4Respawn^3]^1 Нельзя возродится, если в живых осталось меньше ^4%i ^1противников^4!
#if defined _admin_life_api_included
#endinput
#endif
#define _admin_life_api_included
/**
* Вызывается всякий раз когда игрок пытается возродится
*
* @note: AdminLife_Respawn(const pPlayer,const iPost)
*
* Чтобы заблокировать возрождение используйте iPost = 0 + return PLUGIN_HANDLED;
*
* @param pPlayer Игрок, что пытается возродится
* @param iPost 0 - До момента возрождения(до всех стандартных условий плагина)
*
* @noreturn
*/
forward AdminLife_Respawn(const pPlayer,const iPost);
/**
* Вернёт кол-во возрождений игрока
*
* @param pPlayer Игрок
* @param iType 0 - Оставшееся | 1 - Общее
*
* @return int
*/
native get_user_life(const pPlayer,const iType);
/**
* Добавит/отнимет кол-во возрождений игрока
*
* @param pPlayer Игрок
* @param iNum Кол-во
* @param iType 0 - Оставшееся | 1 - Общее
*
* @noreturn
*/
native add_user_life(const pPlayer,const iNum,const iType);
/**
* Насильно откроет меню возрождений игроку
*
* @param pPlayer Игрок
*
* @noreturn
*/
native display_respawn_menu(const pPlayer);
/**
* Насильно попытается возродить игрока
*
* @note: С соблюдением всех условий
*
* @param pPlayer Игрок
*
* @noreturn
*/
native user_respawn(const pPlayer);
/**
История изменений:
0.1.0 (03.05.2024) by b0t.
- Релиз;
*/
new const VERSION[] = "0.1.0";
#include <amxmodx>
#include <reapi>
#define rg_get_current_round() (get_member_game(m_iTotalRoundsPlayed)+1)
#define rg_get_players() (get_member_game(m_iNumTerrorist)+get_member_game(m_iNumCT))
#define rg_get_valid_team(%0) (TEAM_TERRORIST <= TeamName:get_member(%0,m_iTeam) <= TEAM_CT)
const TASK_ID__OPEN_MENU = 0xA323;
enum _:FileStruct {
FLAG_ACCESS,
RESPAWN_QUANTITY,
FROM_ROUND
};
new
Array:g_a_RespawnData;
enum _:SettingsStruct {
ALL_FLAG_ACCESS,
Float:OPEN_MENU_DELAY,
MIN_PLAYERS,
ALIVE_TEAM_DIFF,
ALIVE_PLAYERS
};
new
gSettings[SettingsStruct];
enum _:PlayersDataStruct {
P_RESPAWN_QUANTITY_DEFAULT,
P_RESPAWN_QUANTITY,
P_FROM_ROUND
};
new
pData[33][PlayersDataStruct];
new
g_fwdForward,
g_iMenuId,
bool:g_bRoundEnd; // Костыль, чтобы не возраждались когда был анонс конца раунда;
public plugin_init() {
register_plugin("Admin Life",VERSION,"b0t.");
RegisterHookChain(RG_CBasePlayer_Killed,"CBasePlayer_Killed_Post", .post = true);
RegisterHookChain(RG_CSGameRules_RestartRound,"CSGameRules_RestartRound_Post", .post = true);
RegisterHookChain(RG_RoundEnd,"RoundEnd_Post", .post = true);
g_fwdForward = CreateMultiForward("AdminLife_Respawn",ET_STOP,FP_CELL,FP_CELL);
Func__CreateMultiLang();
register_dictionary("admin_life_new.txt");
Func__CreateMenu();
Func__ReadFile();
}
public CBasePlayer_Killed_Post(const pVictim,pAttacker) {
if(get_user_flags(pVictim) & gSettings[ALL_FLAG_ACCESS] && gSettings[ALL_FLAG_ACCESS] != -1) {
remove_task(pVictim+TASK_ID__OPEN_MENU);
set_task(gSettings[OPEN_MENU_DELAY],"TaskFunc__OpenMenu",pVictim+TASK_ID__OPEN_MENU);
return;
}
if(!pData[pVictim][P_RESPAWN_QUANTITY_DEFAULT] || !pData[pVictim][P_RESPAWN_QUANTITY])
return;
if(rg_get_players() < gSettings[MIN_PLAYERS])
return;
if(rg_get_current_round() < pData[pVictim][P_FROM_ROUND])
return;
remove_task(pVictim+TASK_ID__OPEN_MENU);
set_task(gSettings[OPEN_MENU_DELAY],"TaskFunc__OpenMenu",pVictim+TASK_ID__OPEN_MENU);
}
public CSGameRules_RestartRound_Post() {
for(new id=1;id<=MaxClients;++id) {
if(!is_user_connected(id) || is_user_bot(id) || is_user_hltv(id))
continue;
if(!rg_get_valid_team(id))
continue;
if(!pData[id][P_RESPAWN_QUANTITY_DEFAULT])
continue;
pData[id][P_RESPAWN_QUANTITY] = pData[id][P_RESPAWN_QUANTITY_DEFAULT];
}
g_bRoundEnd = false;
}
public RoundEnd_Post() {
g_bRoundEnd = true;
}
public TaskFunc__OpenMenu(id) {
id -= TASK_ID__OPEN_MENU;
if(!is_user_connected(id) || is_user_alive(id) || g_bRoundEnd)
return;
menu_display(id,g_iMenuId);
}
public RespawnMenu__Handler(const id,const iMenu,const iItem) {
if(iItem == MENU_EXIT)
return PLUGIN_HANDLED;
switch(iItem) {
case 0: Func__Respawn(id);
}
return PLUGIN_HANDLED;
}
public Func__Respawn(const id) {
if(UTIL__CanUserRespawn(id)) {
rg_round_respawn(id);
}
}
public client_putinserver(id) {
new iBitFlagAccess = get_user_flags(id);
new iSize = ArraySize(g_a_RespawnData);
pData[id][P_RESPAWN_QUANTITY_DEFAULT] = pData[id][P_RESPAWN_QUANTITY] = pData[id][P_FROM_ROUND] = 0;
for(new i,aData[FileStruct];i<iSize;++i) {
ArrayGetArray(g_a_RespawnData,i,aData);
if(iBitFlagAccess & aData[FLAG_ACCESS] == aData[FLAG_ACCESS]) {
pData[id][P_RESPAWN_QUANTITY_DEFAULT] = aData[RESPAWN_QUANTITY];
pData[id][P_FROM_ROUND] = aData[FROM_ROUND];
break;
}
}
}
public Func__CreateMenu() {
new iMenu = menu_create(fmt("%l","MENU_TITLE"),"RespawnMenu__Handler");
menu_additem(iMenu,fmt("%l","MENU_ITEM_YES"));
menu_additem(iMenu,fmt("%l","MENU_ITEM_NO"));
menu_setprop(iMenu,MPROP_NUMBER_COLOR,fmt("%l","MENU_NUMBER_COLOR"));
menu_setprop(iMenu,MPROP_EXIT,MEXIT_NEVER);
g_iMenuId = iMenu;
}
public Func__ReadFile() {
new szData[512];
formatex(szData,charsmax(szData),"addons/amxmodx/configs/AdminLife.ini");
if(!file_exists(szData)) {
write_file(szData,";Команда для возрождения без меню");
write_file(szData,"; note: Регистрируется во всех чатах + консоль");
write_file(szData,"cl_cmd = adminlife_on");
write_file(szData,"");
write_file(szData,";Игрок имеющий этот флаг доступа будет возрождаться всегда (-1 - Отключить)");
write_file(szData,";Счётчик возрождений уменьшаться не будет");
write_file(szData,"all_access = -1");
write_file(szData,"");
write_file(szData,";Задерка перед открытием меню");
write_file(szData,"open_menu_delay = 2.5");
write_file(szData,"");
write_file(szData,";Минимальное кол-во игроков для работы плагина");
write_file(szData,"min_players = 5");
write_file(szData,"");
write_file(szData,";Разница в кол-ве живых противников, при которой нельзя будет возродится");
write_file(szData,"alive_team_diff = 2");
write_file(szData,"");
write_file(szData,";Минимальное кол-во живых игроков при котором можно будет возродится");
write_file(szData,"alive_players = 2");
write_file(szData,"");
write_file(szData,";Доступы");
write_file(szData,";^"Флаг(и) доступа^" ^"кол-во возрождений^" ^"С какого раунда доступно^"");
write_file(szData,"^"o^" ^"1^" ^"1^"");
}
new f = fopen(szData,"r");
g_a_RespawnData = ArrayCreate(FileStruct);
new aData[FileStruct];
while(fgets(f,szData,charsmax(szData))) {
trim(szData);
switch(szData[0]) {
case EOS,';': {
continue;
}
case '"': {
static szFlagAccess[64],szRespawnQuantity[5],szFromRound[5];
parse(szData,
szFlagAccess,charsmax(szFlagAccess),
szRespawnQuantity,charsmax(szRespawnQuantity),
szFromRound,charsmax(szFromRound)
);
aData[FLAG_ACCESS] = read_flags(szFlagAccess);
aData[RESPAWN_QUANTITY] = str_to_num(szRespawnQuantity);
aData[FROM_ROUND] = str_to_num(szFromRound);
ArrayPushArray(g_a_RespawnData,aData);
}
default: {
static szLeft[256],szRight[256];
strtok(szData,szLeft,charsmax(szLeft),szRight,charsmax(szRight),'=');
trim(szLeft);
trim(szRight);
if(equal(szLeft,"cl_cmd")) {
register_clcmd(szRight,"Func__Respawn");
register_clcmd(fmt("say /%s",szRight),"Func__Respawn");
register_clcmd(fmt("say_team /%s",szRight),"Func__Respawn");
}
else if(equal(szLeft,"all_access"))
gSettings[ALL_FLAG_ACCESS] = szRight[0] == '-' ? -1 : read_flags(szRight);
else if(equal(szLeft,"open_menu_delay"))
gSettings[OPEN_MENU_DELAY] = str_to_float(szRight);
else if(equal(szLeft,"min_players"))
gSettings[MIN_PLAYERS] = str_to_num(szRight);
else if(equal(szLeft,"alive_team_diff"))
gSettings[ALIVE_TEAM_DIFF] = str_to_num(szRight);
else if(equal(szLeft,"alive_players"))
gSettings[ALIVE_PLAYERS] = str_to_num(szRight);
}
}
continue;
}
fclose(f);
}
public Func__CreateMultiLang() {
new szData[512];
formatex(szData,charsmax(szData),"addons/amxmodx/data/lang/admin_life_new.txt");
if(file_exists(szData))
return;
write_file(szData,"[ru]");
write_file(szData,"");
write_file(szData,"MENU_TITLE = \wВозродимся?");
write_file(szData,"MENU_ITEM_YES = Да");
write_file(szData,"MENU_ITEM_NO = Нет");
write_file(szData,"MENU_NUMBER_COLOR = \y");
write_file(szData,"");
write_file(szData,"CHAT_USER_ALIVE = ^^3[^^4Respawn^^3]^^1 Вы и так живы^^4!");
write_file(szData,"CHAT_RESPAWN_QUANTITY = ^^3[^^4Respawn^^3]^^1 У вас закончился лимит возрождений^^4!");
write_file(szData,"CHAT_FROM_ROUND = ^^3[^^4Respawn^^3]^^1 Возрождение доступно с^^4 %i ^^1раунда^^4!");
write_file(szData,"CHAT_MIN_PLAYERS = ^^3[^^4Respawn^^3]^^1 Необходимо минимальное кол-во игроков ^^3[^^4%i^^3]");
write_file(szData,"CHAT_BOMB_PLANTED = ^^3[^^4Respawn^^3]^^1 Нельзя возродится, если установлена бомба^^4!");
write_file(szData,"CHAT_ALIVE_PLAYERS = ^^3[^^4Respawn^^3]^^1 Нельзя возродится если в живых осталось меньше ^^4%i ^^1игроков^^4!");
write_file(szData,"CHAT_ALIVE_TEAM_DIFF = ^^3[^^4Respawn^^3]^^1 Нельзя возродится, если в живых осталось меньше ^^4%i ^^1противников^^4!");
}
public plugin_natives() {
register_native("get_user_life","native_get_user_life");
register_native("add_user_life","native_add_user_life");
register_native("display_respawn_menu","native_display_respawn_menu");
register_native("user_respawn","native_user_respawn");
}
public native_get_user_life() {
enum {
_id = 1,
_iType
};
new id = get_param(_id);
new iType = get_param(_iType);
return pData[id][iType == 0 ? P_RESPAWN_QUANTITY : P_RESPAWN_QUANTITY_DEFAULT];
}
public native_add_user_life() {
enum {
_id = 1,
_iNum,
_iType
};
new id = get_param(_id);
new iNum = get_param(_iNum);
new iType = get_param(_iType);
pData[id][iType == 0 ? P_RESPAWN_QUANTITY : P_RESPAWN_QUANTITY_DEFAULT] += iNum;
}
public native_display_respawn_menu() {
new id = get_param(1);
remove_task(id+TASK_ID__OPEN_MENU);
menu_display(id,g_iMenuId);
}
public native_user_respawn() {
Func__Respawn(get_param(1));
}
stock bool:UTIL__CanUserRespawn(const pPlayer) {
if(get_user_flags(pPlayer) & gSettings[ALL_FLAG_ACCESS] && gSettings[ALL_FLAG_ACCESS] != -1)
return true;
new iRet;
ExecuteForward(g_fwdForward,iRet,pPlayer,0);
if(iRet == PLUGIN_HANDLED)
return false;
if(!pData[pPlayer][P_RESPAWN_QUANTITY_DEFAULT])
return false;
if(g_bRoundEnd)
return false;
if(rg_get_players() < gSettings[MIN_PLAYERS])
return false;
if(!rg_get_valid_team(pPlayer))
return false;
if(is_user_alive(pPlayer)) {
client_print_color(pPlayer,print_team_default,"%l","CHAT_USER_ALIVE");
return false;
}
if(pData[pPlayer][P_RESPAWN_QUANTITY] <= 0) {
client_print_color(pPlayer,print_team_default,"%l","CHAT_RESPAWN_QUANTITY");
return false;
}
if(rg_get_current_round() < pData[pPlayer][P_FROM_ROUND]) {
client_print_color(pPlayer,print_team_default,"%l","CHAT_FROM_ROUND",pData[pPlayer][P_FROM_ROUND]);
return false;
}
if(rg_get_players() < gSettings[MIN_PLAYERS]) {
client_print_color(pPlayer,print_team_default,"%l","CHAT_MIN_PLAYERS",gSettings[MIN_PLAYERS]);
return false;
}
if(rg_is_bomb_planted()) {
client_print_color(pPlayer,print_team_default,"%l","CHAT_BOMB_PLANTED");
return false;
}
new iAliveCt,iAliveTe;
rg_initialize_player_counts(iAliveTe,iAliveCt);
if((iAliveTe+iAliveCt) < gSettings[ALIVE_PLAYERS]) {
client_print_color(pPlayer,print_team_default,"%l","CHAT_ALIVE_PLAYERS",gSettings[ALIVE_PLAYERS]);
return false;
}
new iAlive;
switch(TeamName:get_member(pPlayer,m_iTeam)) {
case TEAM_CT: iAlive = iAliveTe;
case TEAM_TERRORIST: iAlive = iAliveCt;
}
if(iAlive < gSettings[ALIVE_TEAM_DIFF]) {
client_print_color(pPlayer,print_team_default,"%l","CHAT_ALIVE_TEAM_DIFF",gSettings[ALIVE_TEAM_DIFF]);
return false;
}
pData[pPlayer][P_RESPAWN_QUANTITY]--;
ExecuteForward(g_fwdForward,iRet,pPlayer,1);
return true;
}
О чем изначально и говорилось)Оказалось не пофиг)
Да всё плагины которые данный человек закинул были написаны @b0t. Так же перепродажа написанного с нуля плагина. Смена авторства это пипец, так как этот человек ничего не соображает в серверах от слова совсем.@travka zelenaj, изначально я сомневался в том, что ресурсы были написаны автором.
Направил платный ресурс в беседу, чтобы ответили мне более понимающие пользователи.
Сейчас, я так понимаю, основа лежит на @b0t.
Бегло прочитал сообщения, вижу что ресурсы были написаны или изменены на платной основе автора ресурса?
Продаешь без исходника, привязываешь по IP@BiZaJe, а как продавать?
Без исходного кода?
И каждый раз одно и тоже будет всегда.
Каким образом продавать – исходный ли код или нет.
Проще тогда вообще ничего не продавать.
Каждый из сторон получил свое, если так подумать.