Нужна помощь по плагину dr_duel есть исходник и ошибки в логах при debug
Проблема на сервере, когда игроки выбирают дуэль с Очередью.
Когда идет дуэль с очередью, должно быть 1 стрельнул, потом другой, а тут 1 может стрелять много раз а другой иногда.
Изначальный исходник:
ошибки
[AMXX] [0] dr_duels.sma::ChangeAttack (line 657)
[AMXX] [1] dr_duels.sma::timer_dTime (line 668)
Потом попробовал вот так:
Теперь ошибка:
[AMXX] [0] dr_duels.sma::ChangeAttack (line 657)
[AMXX] [1] dr_duels.sma::fw_attack (line 643)
Проблема на сервере, когда игроки выбирают дуэль с Очередью.
Когда идет дуэль с очередью, должно быть 1 стрельнул, потом другой, а тут 1 может стрелять много раз а другой иногда.
Изначальный исходник:
C++:
#include < amxmodx >
#include < amxmisc >
#include < colorchat >
#include < hamsandwich >
#include < fakemeta >
#include < fun >
#include < dr_mode >
/*
* 1. Дуэль + Бетсы
* 2. Спавны
*/
#define fm_set_user_ammo(%1,%2) set_pdata_int(get_pdata_cbase(%1, 373), 51, %2, 4)
#define BETS_DELAY 20
#define TASK_BETS 31413
#define TIME_ATTACK 10
#define TASK_ATTACK 24141
#define DELAY_INFORMER 0.5
#define TASK_INFORMER 13413
#define DUEL_TIME 120
#define TASK_DUEL 12513
#define SOUND_PATH "sound/dr_mode/duels"
//DUEL
enum _: wData { wName[32], wIName[32], wIndex, wAmmo, oAmmo }
new sWeapons[][wData] = {
{"weapon_deagle", "Дигл", CSW_DEAGLE, 255, 1},
{"weapon_m4a1", "M4A1", CSW_M4A1, 255, 1},
{"weapon_hegrenade", "Гранаты", CSW_HEGRENADE, 255, 255},
{"weapon_awp", "AWP", CSW_AWP, 255, 1},
{"weapon_ak47", "AK47", CSW_AK47, 255, 1},
{"weapon_usp", "USP", CSW_USP, 255, 1},
{"weapon_scout", "Муха", CSW_SCOUT, 255, 1},
{"weapon_m249", "Пулемет", CSW_M249, 255, 1}
}
new tId, cId, wId, dOch, tName[32], cName[32], duel = false, bets = false, dVstr[33], gTime, dTime, g_SyncHud, dSound[33];
new duelSound[][] = { "fight1.mp3", "fight2.mp3", "fight3.mp3" };
new AttackSound[][] = {"attack.mp3"};
//BETS
new aBet[33], mBet[33], cBet[2], tBet[2], bSound[33];
new betSound[][] = { "bet1.mp3", "bet2.mp3", "bet3.mp3" };
//SPAWNS
new Float: dOrigins[2][3], szFile[128];
new fwdStart;
new exploSpr;
public plugin_init(){
register_plugin("DR Duels", "1.0", "PAffAEJIkA :3");
register_clcmd("say /dr", "LastOpen");
register_clcmd("say /lr", "LastOpen");
register_clcmd("say_team /dr", "LastOpen");
register_clcmd("say_team /lr", "LastOpen");
register_clcmd("say /bets_sound", "clcmd_bSound");
register_clcmd("say /duel_sound", "clcmd_dSound");
register_clcmd("say /duel_settings", "openMenu");
RegisterHookChain(RG_RoundEnd, "round_end");
RegisterHookChain(RG_CBasePlayer_Killed, "PlayerKilled");
RegisterHam(Ham_Touch, "weaponbox", "BlockUSE", 0);
//RegisterHam(Ham_Use, "func_conveyor", "BlockUSE", 0);
RegisterHam(Ham_Touch, "trigger_teleport", "BlockUSE", 0);
register_clcmd("drop", "clcmd_Drop");
g_SyncHud = CreateHudSyncObj();
for(new i = 0; i < sizeof(sWeapons); i ++)
RegisterHam(Ham_Weapon_PrimaryAttack, sWeapons[i][wName], "fw_attack", false);
fwdStart = CreateMultiForward("DR_DuelStart", ET_CONTINUE, FP_CELL, FP_CELL);
}
public plugin_precache(){
new buffer[128];
for(new i = 0; i < sizeof(betSound); i ++){
format(buffer, charsmax(buffer), "%s/%s", SOUND_PATH, betSound[i]);
precache_generic(buffer);
}
for(new i = 0; i < sizeof(duelSound); i ++){
format(buffer, charsmax(buffer), "%s/%s", SOUND_PATH, duelSound[i]);
precache_generic(buffer);
}
for(new i = 0; i < sizeof(AttackSound); i ++){
format(buffer, charsmax(buffer), "%s/%s", SOUND_PATH, AttackSound[i]);
precache_generic(buffer);
}
exploSpr = precache_model("sprites/shockwave.spr");
}
public client_putinserver(id){
dSound[id] = true;
bSound[id] = true;
}
public clcmd_bSound(id){
bSound[id] = bSound[id] ? false : true;
client_print_color(id, 0, "^3[^4SOUND^3] Вы^4 %s^3 музыку во время ставок!", bSound[id] ? "включили" : "выключили");
}
public clcmd_dSound(id){
dSound[id] = dSound[id] ? false : true;
client_print_color(id, 0, "^3[^4SOUND^3] Вы^4 %s^3 музыку во время дуэли!", dSound[id] ? "включили" : "выключили");
}
public BlockUSE(ent, id){
if(!is_user_alive(id))
return HAM_IGNORED;
if(duel)
return HAM_SUPERCEDE;
return HAM_IGNORED;
}
//Спавны
public plugin_cfg(){
new gMapName[35];
get_mapname(gMapName, charsmax(gMapName));
format(szFile, charsmax(szFile), "/addons/amxmodx/configs/dr_mode/dr_duels/%s.ini", gMapName);
if(!file_exists(szFile))
return;
new buffer[256], file = fopen(szFile, "r");
while(!feof(file)){
fgets(file, buffer, charsmax(buffer));
if(buffer[0] && buffer[0] != ';'){
new orig[3][32], tName[5];
parse(buffer, tName, charsmax(tName), orig[0], charsmax(orig[]), orig[1], charsmax(orig[]), orig[2], charsmax(orig[]));
if(equali(tName, "TT:")){
dOrigins[0][0] = str_to_float(orig[0]);
dOrigins[0][1] = str_to_float(orig[1]);
dOrigins[0][2] = str_to_float(orig[2]);
}else{
dOrigins[1][0] = str_to_float(orig[0]);
dOrigins[1][1] = str_to_float(orig[1]);
dOrigins[1][2] = str_to_float(orig[2]);
}
}
}
fclose(file);
}
public openMenu(id){
new caption[128];
format(caption, charsmax(caption), "\d[DUELS]\w Меню раставления спавнов");
new menu = menu_create(caption, "settings_handle");
new item[5][64];
format(item[0], charsmax(item[]), "\%sУстановтиь спавн TT", dOrigins[0][0] ? "d" : "w");
format(item[1], charsmax(item[]), "\%sУстановтиь спавн CT", dOrigins[1][0] ? "d" : "w");
format(item[2], charsmax(item[]), "\wПротестировать спавны");
format(item[3], charsmax(item[]), "\wУдалить все спавны");
format(item[4], charsmax(item[]), "\wСохранить изменения");
for(new i = 0, temp[10]; i < sizeof(item); i ++){
num_to_str(i + 1, temp, charsmax(temp));
menu_additem(menu, item[i], temp);
}
menu_setprop(menu, MPROP_EXITNAME, "\rВыход");
return menu_display(id, menu);
}
public settings_handle(id, menu, item){
if(item == MENU_EXIT)
return 0;
new data[30], iName[64], access, callback;
menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
new key = str_to_num(data);
new Float: fOrigins[3];
get_entvar(id, var_origin, fOrigins);
switch(key){
case 1:{
if(!dOrigins[0][0])
dOrigins[0] = fOrigins;
}
case 2:{
if(!dOrigins[1][0])
dOrigins[1] = fOrigins;
}
case 3:{
set_entvar(id, var_origin, dOrigins[0]);
set_task(1.0, "setOrigin2", id);
}
case 4:{
dOrigins[0][0] = 0.0;
dOrigins[1][0] = 0.0;
}
case 5:{
new buffer[255];
format(buffer, charsmax(buffer), "TT: %f %f %f", dOrigins[0][0], dOrigins[0][1], dOrigins[0][2]);
write_file(szFile, buffer, 0);
format(buffer, charsmax(buffer), "CT: %f %f %f", dOrigins[1][0], dOrigins[1][1], dOrigins[1][2]);
write_file(szFile, buffer, 1);
}
}
return openMenu(id);
}
public setOrigin2(id)
set_entvar(id, var_origin, dOrigins[1]);
//Спавны
public client_disconnect(id){
if(duel && (id == cId || id == tId))
StopDuel();
}
public round_end()
StopDuel();
public PlayerKilled(){
if(!duel && checkDuel()){
new players[32], count;
get_players(players, count, "ache", "CT");
if(is_user_alive(players[0]))
ShowLastCTMenu(players[0]);
}
}
public clcmd_Drop(id){
if(!is_user_alive(id))
return PLUGIN_CONTINUE;
if(duel)
return PLUGIN_HANDLED;
return PLUGIN_CONTINUE;
}
public LastOpen(id){
if(checkDuel())
ShowLastCTMenu(id);
}
//Last
public ShowLastCTMenu(id){
new TeamName:gTeam = get_member(id, m_iTeam);
if(gTeam != TEAM_CT)
return 0;
new caption[128];
format(caption, charsmax(caption), "\d[DUELS]\w Будем играть дуэль?");
new menu = menu_create(caption, "HANDLE_LastCT");
menu_additem(menu, "Да", "1");
menu_additem(menu, "Нет", "2");
menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
return menu_display(id, menu);
}
public HANDLE_LastCT(id, menu, item){
if(item == MENU_EXIT || !checkDuel() || !is_user_alive(id))
return 0;
new data[30], iName[64], access, callback;
menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
new key = str_to_num(data);
switch(key){
case 1: return ShowMenuPeople(id);
case 2: return PLUGIN_HANDLED;
}
return ShowLastCTMenu(id);
}
//People
public ShowMenuPeople(id){
new players[32], count;
get_players(players, count, "ache", "TERRORIST");
if(count == 1){
tId = dr_get_leader();
return ShowOCHMenu(id);
}
new caption[128];
format(caption, charsmax(caption), "\d[DUELS]\w Выберите противника");
new menu = menu_create(caption, "HANDLE_PEOPLE");
for(new i = 0, temp[10], szName[32]; i < count; i ++){
num_to_str(i + 1, temp, charsmax(temp));
get_user_name(players[i], szName, charsmax(szName));
menu_additem(menu, szName, temp);
}
menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
return menu_display(id, menu);
}
public HANDLE_PEOPLE(id, menu, item){
if(item == MENU_EXIT || !checkDuel() || !is_user_alive(id))
return 0;
new data[30], iName[64], access, callback;
menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
new key = str_to_num(data);
new players[32], count;
get_players(players, count, "ache", "TERRORIST");
tId = players[key - 1];
return ShowOCHMenu(id);
}
//OCH
public ShowOCHMenu(id){
new caption[128];
format(caption, charsmax(caption), "\d[DUELS]\w Выберите режим игры");
new menu = menu_create(caption, "HANDLE_OCH");
menu_additem(menu, "Без очереди", "1");
menu_additem(menu, "\rС очередью", "2");
menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
return menu_display(id, menu);
}
public HANDLE_OCH(id, menu, item){
if(item == MENU_EXIT || !checkDuel() || !is_user_alive(id))
return 0;
new data[30], iName[64], access, callback;
menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
new key = str_to_num(data);
switch(key){
case 1: dOch = false;
case 2: dOch = true;
}
return ShowMenuWeapon(id);
}
//Weapon
public ShowMenuWeapon(id){
new caption[128];
format(caption, charsmax(caption), "\d[DUELS]\w Выберите оружие дуэли");
new menu = menu_create(caption, "HANDLE_WPN");
for(new i = 0, temp[10]; i < sizeof(sWeapons); i ++){
num_to_str(i + 1, temp, charsmax(temp));
menu_additem(menu, sWeapons[i][wIName], temp);
}
menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
return menu_display(id, menu);
}
public HANDLE_WPN(id, menu, item){
if(item == MENU_EXIT || !checkDuel() || !is_user_alive(id))
return 0;
new data[30], iName[64], access, callback;
menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
new key = str_to_num(data);
wId = key - 1;
return ShowMenuAccept(id);
}
//Accept
public ShowMenuAccept(id){
new caption[164];
get_user_name(tId, tName, charsmax(tName));
get_user_name(id, cName, charsmax(cName));
format(caption, charsmax(caption), "\d[DUELS]\w Противник:\r %s^n\wОружие:\r %s^n\wРежим:\r %s^n\wНачинаем?", tName, sWeapons[wId][wIName], dOch ? "по очереди" : "без очереди");
new menu = menu_create(caption, "HANDLE_ACCEPT");
menu_additem(menu, "Да", "1");
menu_additem(menu, "\rНет", "2");
menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
return menu_display(id, menu);
}
public HANDLE_ACCEPT(id, menu, item){
if(item == MENU_EXIT || !checkDuel() || !is_user_alive(id))
return 0;
new data[30], iName[64], access, callback;
menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
new key = str_to_num(data);
switch(key){
case 1: return StartBets(id);
case 2: return ShowLastCTMenu(id);
}
return ShowMenuAccept(id);
}
//Bets
public StartBets(id){
dr_stop_game(STOP_GAME);
bets = true;
off_func(false);
set_task(DELAY_INFORMER, "ShowInformer", TASK_INFORMER, .flags = "b");
cId = id;
strip_user_weapons(tId);
strip_user_weapons(cId);
new players[32], count, iTrack = random_num(0, charsmax(betSound));
get_players(players, count, "ch");
for(new i = 0, player; i < count; i ++){
player = players[i];
if(!bSound[player])
continue;
client_cmd(player, "mp3 play %s/%s", SOUND_PATH, betSound[iTrack]);
}
set_entvar(id, var_origin, dOrigins[0]);
set_entvar(tId, var_origin, dOrigins[1]);
set_freeze(true);
if(count == 2)
return StartDuel();
for(new i = 0, player; i < count; i ++){
player = players[i];
if(player == cId || player == tId)
continue;
ShowMenuBet(player);
}
gTime = BETS_DELAY;
set_task(1.0, "timer_gTime", TASK_BETS, .flags = "a", .repeat = BETS_DELAY);
return PLUGIN_CONTINUE;
}
public ShowMenuBet(id){
new caption[128];
format(caption, charsmax(caption), "\d[DUELS]\w На кого хотите поставить?");
new menu = menu_create(caption, "HANDLE_BETS");
new item[3][128];
format(item[0], charsmax(item[]), "\w%s \d[\rTT\d]", tName);
format(item[1], charsmax(item[]), "\w%s \d[\rCT\d]", cName);
format(item[2], charsmax(item[]), "\rОтказываюсь делать ставку");
menu_additem(menu, item[0], "1");
menu_additem(menu, item[1], "2");
menu_additem(menu, item[2], "3");
menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
return menu_display(id, menu);
}
public HANDLE_BETS(id, menu, item){
if(item == MENU_EXIT || !bets)
return 0;
new data[30], iName[64], access, callback;
menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
new key = str_to_num(data);
aBet[id] = 0;
switch(key){
case 1: aBet[id] = tId;
case 2: aBet[id] = cId;
case 3: return PLUGIN_HANDLED;
}
return ShowMenuBetMoney(id);
}
public ShowMenuBetMoney(id){
new caption[128];
format(caption, charsmax(caption), "\d[DUELS]\w Сколько хотите поставить?");
new menu = menu_create(caption, "HANDLE_BETSMONEY");
new item[6][128], szMoney = get_member(id, m_iAccount);
format(item[0], charsmax(item[]), "\%s100$", szMoney >= 100 ? "w" : "d");
format(item[1], charsmax(item[]), "\%s500$", szMoney >= 500 ? "w" : "d");
format(item[2], charsmax(item[]), "\%s1000$", szMoney >= 1000 ? "w" : "d");
format(item[3], charsmax(item[]), "\%s5000$", szMoney >= 5000 ? "w" : "d");
format(item[4], charsmax(item[]), "\%s10000$", szMoney >= 10000 ? "w" : "d");
format(item[5], charsmax(item[]), "Все\r %d$", szMoney);
for(new i = 0, temp[10]; i < sizeof(item); i ++){
num_to_str(i + 1, temp, charsmax(temp));
menu_additem(menu, item[i], temp);
}
menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
return menu_display(id, menu);
}
public HANDLE_BETSMONEY(id, menu, item){
if(item == MENU_EXIT || !bets)
return 0;
new data[30], iName[64], access, callback;
menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
new key = str_to_num(data), szMoney = get_member(id, m_iAccount);
mBet[id] = -1;
switch(key){
case 1:{
if(szMoney >= 100)
mBet[id] = 100;
}
case 2:{
if(szMoney >= 500)
mBet[id] = 500;
}
case 3:{
if(szMoney >= 1000)
mBet[id] = 1000;
}
case 4:{
if(szMoney >= 5000)
mBet[id] = 5000;
}
case 5:{
if(szMoney >= 10000)
mBet[id] = 10000;
}
case 6: mBet[id] = szMoney;
}
if(mBet[id] == -1)
return ShowMenuBetMoney(id);
else{
if(mBet[id] == 0)
return PLUGIN_CONTINUE;
dr_set_user_money(id, szMoney - mBet[id]);
if(aBet[id] == tId){
++ tBet[0];
tBet[1] += mBet[id];
}else{
++ cBet[0];
cBet[1] += mBet[id];
}
new szName[32];
get_user_name(id, szName, charsmax(szName));
client_print_color(0, 0, "^3[^4BETS^3] Игрок^4 %s^3 поставил^4 %d$^3 на^1 %s^3!", szName, mBet[id], aBet[id] == tId ? tName : cName);
}
return PLUGIN_CONTINUE;
}
public StartDuel(){
if(!is_user_alive(tId) || !is_user_alive(cId))
return StopDuel();
bets = false;
duel = true;
new players[32], count, iTrack = random_num(0, charsmax(duelSound));
get_players(players, count, "ch");
for(new i = 0, player; i < count; i ++){
player = players[i];
if(!dSound[player])
continue;
client_cmd(player, "mp3 play %s/%s", SOUND_PATH, duelSound[iTrack]);
}
ExecuteForward(fwdStart, iTrack, tId, cId);
rg_set_user_model(tId, "leet");
rg_set_user_model(cId, "gign");
set_freeze(false);
off_effects(tId);
off_effects(cId);
gTime = DUEL_TIME;
set_entvar(tId, var_health, 100.0);
set_entvar(cId, var_health, 100.0);
rg_give_item(tId, sWeapons[wId][wName]);
rg_give_item(cId, sWeapons[wId][wName]);
if(dOch){
dVstr[cId] = true;
dVstr[tId] = false;
dTime = TIME_ATTACK;
switch(sWeapons[wId][wIndex]){
case CSW_HEGRENADE:{
rg_set_user_bpammo(cId, WeaponIdType:sWeapons[wId][wIndex], sWeapons[wId][oAmmo]);
rg_set_user_bpammo(tId, WeaponIdType:sWeapons[wId][wIndex], sWeapons[wId][oAmmo]);
}
default:{
fm_set_user_ammo(cId, 1);
fm_set_user_ammo(tId, 1);
}
}
set_task(1.0, "timer_dTime", TASK_ATTACK, .flags = "a", .repeat = TIME_ATTACK);
}else{
rg_set_user_bpammo(tId, WeaponIdType:sWeapons[wId][wIndex], sWeapons[wId][wAmmo]);
rg_set_user_bpammo(cId, WeaponIdType:sWeapons[wId][wIndex], sWeapons[wId][wAmmo]);
}
set_task(1.0, "timer_gTime", TASK_DUEL, .flags = "a", .repeat = DUEL_TIME);
return PLUGIN_CONTINUE;
}
public fw_attack(weap){
if(!dOch || !duel)
return HAM_IGNORED;
new id = get_entvar(weap, var_owner);
if(!is_user_alive(id))
return HAM_IGNORED;
if(!dVstr[id])
return HAM_SUPERCEDE
else
ChangeAttack(id);
return HAM_IGNORED
}
public ChangeAttack(id){
dVstr[id] = false;
new vId = id == cId ? tId : cId;
if(is_user_connected(vId)){
dVstr[vId] = true;
fm_set_user_ammo(vId, 1);
client_cmd(vId, "mp3 play %s/%s", SOUND_PATH, AttackSound[random_num(0, sizeof AttackSound)]);
}
dTime = TIME_ATTACK;
remove_task(TASK_ATTACK);
set_task(1.0, "timer_dTime", TASK_ATTACK, .flags = "a", .repeat = TIME_ATTACK);
}
public timer_dTime(){
if(-- dTime == 0)
ChangeAttack(dVstr[cId] ? cId : tId);
}
public timer_gTime(tid){
if(-- gTime == 0){
switch(tid){
case TASK_BETS:{
StartDuel();
remove_task(TASK_BETS);
}
case TASK_DUEL:{
if(is_user_alive(tId) && is_user_alive(cId)){
new w;
if(get_user_health(tId) > get_user_health(cId))
w = 2;
else if(get_user_health(tId) < get_user_health(cId))
w = 1;
else
w = random_num(1, 2);
user_kill(w == 1 ? tId : cId);
}
StopDuel();
remove_task(TASK_DUEL);
}
}
}else if (tid == TASK_BETS){
new Float: fOrigin[3];
pev(tId, pev_origin, fOrigin);
set_krujok(fOrigin, TEAM_TERRORIST);
pev(cId, pev_origin, fOrigin);
set_krujok(fOrigin, TEAM_CT);
}
}
native dr_set_duels(id, bool:st);
public StopDuel(){
bets = false;
off_func(true);
remove_task(TASK_INFORMER);
remove_task(TASK_DUEL);
remove_task(TASK_BETS);
remove_task(TASK_ATTACK);
client_cmd(0, "mp3 stop");
if(duel){
new win = 0, szWin, szMoney;
if(!is_user_alive(tId)){
win = cId;
client_print_color(0, 0, "^3[^4DUELS^3] Победил^4 %s^3!!", cName);
if(is_user_connected(cId)){
if(cBet[0])
szWin = cBet[1]/cBet[0] + 5000
else
szWin = 5000;
szMoney = get_member(cId, m_iAccount);
dr_set_user_money(cId, szMoney + szWin);
client_print_color(cId, 0, "^3[^4DUELS^3] Вы выиграли^4 %d$", szWin);
}
}else if(!is_user_alive(cId)){
win = tId
client_print_color(0, 0, "^3[^4DUELS^3] Победил^4 %s^3!!", tName);
if(is_user_connected(tId)){
if(tBet[0])
szWin = tBet[1]/tBet[0] + 5000
else
szWin = 5000;
szMoney = get_member(tId, m_iAccount);
dr_set_user_money(tId, szMoney + szWin);
client_print_color(tId, 0, "^3[^4DUELS^3] Вы выиграли^4 %d$", szWin);
}
}
dr_set_duels(win == tId ? tId : cId, true);
dr_set_duels(win == tId ? cId : tId, false);
new players[32], count; get_players(players, count);
for(new i = 0, player; i < count; i ++){
player = players[i];
if(aBet[player] == win){
if(mBet[player] == 0)
continue;
szWin = mBet[player] * 2;
szMoney = get_member(player, m_iAccount);
dr_set_user_money(player, szMoney + szWin);
client_print_color(player, 0, "^3[^4BETS^3] Вы выиграли^4 %d$^3!!", szWin);
}
}
}
cBet = {0, 0};
tBet = {0, 0};
arrayset(aBet, 0, sizeof(aBet))
arrayset(mBet, 0, sizeof(mBet))
duel = false;
return PLUGIN_CONTINUE;
}
public ShowInformer(){
new szBuffer[512], iLen;
iLen = format(szBuffer, charsmax(szBuffer), "[~] Режим: Дуэль [%s]", dOch ? "с очередью" : "без очереди");
iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] Оружие: %s", sWeapons[wId][wIName]);
iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] %s[%d%%] VS %s[%d%%]", tName, get_user_health(tId), cName, get_user_health(cId));
if(dOch && duel){
if(dVstr[cId])
iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] Стреляет %s [%d]", cName, dTime);
else
iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] Стреляет %s [%d]", tName, dTime);
}
if(bets)
iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] Делаем ставки! [%d]", gTime);
else
iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] До конца дуэли [%d] сек", gTime);
if(!cBet[0])
iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] На %s никто не поставил", cName);
else
iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] На %s поставило %d[%d$]", cName, cBet[0], cBet[1]);
if(!tBet[0])
iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] На %s никто не поставил", tName);
else
iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] На %s поставило %d[%d$]", tName, tBet[0], tBet[1]);
set_hudmessage(255, 159, 61, 0.01, 0.19, 0, 0.1, 1.0, _, _, -1);
new players[32], count;
get_players(players, count);
for(new i = 0, player; i < count; i ++){
player = players[i];
ShowSyncHudMsg(player, g_SyncHud, szBuffer);
}
}
bool: checkDuel(){
if(get_member_game(m_iNumTerrorist) == 0)
return false;
if(!dr_active())
return false;
if(duel || bets)
return false;
if(dr_get_gameid() == -1)
return false;
new players[32], count;
get_players(players, count, "ache", "CT");
if(count > 1)
return false;
return true;
}
off_func(func){
dr_set_active_shop(0, func);
dr_set_informer(func);
dr_set_bhop(func);
}
off_effects(id){
set_entvar(id, var_maxspeed, 250.0);
set_entvar(id, var_gravity, 1.0);
set_entvar(id, var_rendermode, kRenderNormal);
set_entvar(id, var_renderamt, 100);
set_entvar(id, var_rendercolor, {0.0, 0.0, 0.0});
set_entvar(id, var_renderfx, kRenderFxGlowShell);
}
set_freeze(func){
new flags;
flags = get_entvar(cId, var_flags);
if(func)
set_entvar(cId, var_flags, flags | FL_FROZEN);
else
set_entvar(cId, var_flags, flags & ~FL_FROZEN);
flags = get_entvar(tId, var_flags);
if(func)
set_entvar(tId, var_flags, flags | FL_FROZEN);
else
set_entvar(tId, var_flags, flags & ~FL_FROZEN);
}
set_krujok(Float:gOrigin[3], TeamName: gTeam){
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, gOrigin, 0)
write_byte(TE_BEAMCYLINDER);
engfunc(EngFunc_WriteCoord, gOrigin[0])
engfunc(EngFunc_WriteCoord, gOrigin[1])
engfunc(EngFunc_WriteCoord, gOrigin[2])
engfunc(EngFunc_WriteCoord, gOrigin[0])
engfunc(EngFunc_WriteCoord, gOrigin[1])
engfunc(EngFunc_WriteCoord, gOrigin[2] + 555.5)
write_short(exploSpr);
write_byte(0);
write_byte(0);
write_byte(5);
write_byte(60);
write_byte(0);
write_byte(gTeam == TEAM_TERRORIST ? 255 : 0);
write_byte(0);
write_byte(gTeam == TEAM_TERRORIST ? 0 : 255);
write_byte(255);
write_byte(0);
message_end();
}
[AMXX] [0] dr_duels.sma::ChangeAttack (line 657)
[AMXX] [1] dr_duels.sma::timer_dTime (line 668)
Потом попробовал вот так:
C++:
#include < amxmodx >
#include < amxmisc >
#include < colorchat >
#include < hamsandwich >
#include < fakemeta >
#include < fun >
#include < dr_mode >
/*
* 1. Дуэль + Бетсы
* 2. Спавны
*/
#define fm_set_user_ammo(%1,%2) set_pdata_int(get_pdata_cbase(%1, 373), 51, %2, 4)
#define BETS_DELAY 20
#define TASK_BETS 31413
#define TIME_ATTACK 10
#define TASK_ATTACK 24141
#define DELAY_INFORMER 0.5
#define TASK_INFORMER 13413
#define DUEL_TIME 120
#define TASK_DUEL 12513
#define SOUND_PATH "sound/dr_mode/duels"
//DUEL
enum _: wData { wName[32], wIName[32], wIndex, wAmmo, oAmmo }
new sWeapons[][wData] = {
{"weapon_deagle", "Дигл", CSW_DEAGLE, 255, 1},
{"weapon_m4a1", "M4A1", CSW_M4A1, 255, 1},
{"weapon_hegrenade", "Гранаты", CSW_HEGRENADE, 255, 255},
{"weapon_awp", "AWP", CSW_AWP, 255, 1},
{"weapon_ak47", "AK47", CSW_AK47, 255, 1},
{"weapon_usp", "USP", CSW_USP, 255, 1},
{"weapon_scout", "Муха", CSW_SCOUT, 255, 1},
{"weapon_m249", "Пулемет", CSW_M249, 255, 1}
}
new tId, cId, wId, dOch, tName[32], cName[32], duel = false, bets = false, dVstr[33], gTime, dTime, g_SyncHud, dSound[33];
new duelSound[][] = { "fight1.mp3", "fight2.mp3", "fight3.mp3" };
new AttackSound[][] = {"attack.mp3"};
//BETS
new aBet[33], mBet[33], cBet[2], tBet[2], bSound[33];
new betSound[][] = { "bet1.mp3", "bet2.mp3", "bet3.mp3" };
//SPAWNS
new Float: dOrigins[2][3], szFile[128];
new fwdStart;
new exploSpr;
public plugin_init(){
register_plugin("DR Duels", "1.0", "PAffAEJIkA :3");
register_clcmd("say /dr", "LastOpen");
register_clcmd("say /lr", "LastOpen");
register_clcmd("say_team /dr", "LastOpen");
register_clcmd("say_team /lr", "LastOpen");
register_clcmd("say /bets_sound", "clcmd_bSound");
register_clcmd("say /duel_sound", "clcmd_dSound");
register_clcmd("say /duel_settings", "openMenu");
RegisterHookChain(RG_RoundEnd, "round_end");
RegisterHookChain(RG_CBasePlayer_Killed, "PlayerKilled");
RegisterHam(Ham_Touch, "weaponbox", "BlockUSE", 0);
//RegisterHam(Ham_Use, "func_conveyor", "BlockUSE", 0);
RegisterHam(Ham_Touch, "trigger_teleport", "BlockUSE", 0);
register_clcmd("drop", "clcmd_Drop");
g_SyncHud = CreateHudSyncObj();
for(new i = 0; i < sizeof(sWeapons); i ++)
RegisterHam(Ham_Weapon_PrimaryAttack, sWeapons[i][wName], "fw_attack", false);
fwdStart = CreateMultiForward("DR_DuelStart", ET_CONTINUE, FP_CELL, FP_CELL);
}
public plugin_precache(){
new buffer[128];
for(new i = 0; i < sizeof(betSound); i ++){
format(buffer, charsmax(buffer), "%s/%s", SOUND_PATH, betSound[i]);
precache_generic(buffer);
}
for(new i = 0; i < sizeof(duelSound); i ++){
format(buffer, charsmax(buffer), "%s/%s", SOUND_PATH, duelSound[i]);
precache_generic(buffer);
}
for(new i = 0; i < sizeof(AttackSound); i ++){
format(buffer, charsmax(buffer), "%s/%s", SOUND_PATH, AttackSound[i]);
precache_generic(buffer);
}
exploSpr = precache_model("sprites/shockwave.spr");
}
public client_putinserver(id){
dSound[id] = true;
bSound[id] = true;
}
public clcmd_bSound(id){
bSound[id] = bSound[id] ? false : true;
client_print_color(id, 0, "^3[^4SOUND^3] Вы^4 %s^3 музыку во время ставок!", bSound[id] ? "включили" : "выключили");
}
public clcmd_dSound(id){
dSound[id] = dSound[id] ? false : true;
client_print_color(id, 0, "^3[^4SOUND^3] Вы^4 %s^3 музыку во время дуэли!", dSound[id] ? "включили" : "выключили");
}
public BlockUSE(ent, id){
if(!is_user_alive(id))
return HAM_IGNORED;
if(duel)
return HAM_SUPERCEDE;
return HAM_IGNORED;
}
//Спавны
public plugin_cfg(){
new gMapName[35];
get_mapname(gMapName, charsmax(gMapName));
format(szFile, charsmax(szFile), "/addons/amxmodx/configs/dr_mode/dr_duels/%s.ini", gMapName);
if(!file_exists(szFile))
return;
new buffer[256], file = fopen(szFile, "r");
while(!feof(file)){
fgets(file, buffer, charsmax(buffer));
if(buffer[0] && buffer[0] != ';'){
new orig[3][32], tName[5];
parse(buffer, tName, charsmax(tName), orig[0], charsmax(orig[]), orig[1], charsmax(orig[]), orig[2], charsmax(orig[]));
if(equali(tName, "TT:")){
dOrigins[0][0] = str_to_float(orig[0]);
dOrigins[0][1] = str_to_float(orig[1]);
dOrigins[0][2] = str_to_float(orig[2]);
}else{
dOrigins[1][0] = str_to_float(orig[0]);
dOrigins[1][1] = str_to_float(orig[1]);
dOrigins[1][2] = str_to_float(orig[2]);
}
}
}
fclose(file);
}
public openMenu(id){
new caption[128];
format(caption, charsmax(caption), "\d[DUELS]\w Меню раставления спавнов");
new menu = menu_create(caption, "settings_handle");
new item[5][64];
format(item[0], charsmax(item[]), "\%sУстановтиь спавн TT", dOrigins[0][0] ? "d" : "w");
format(item[1], charsmax(item[]), "\%sУстановтиь спавн CT", dOrigins[1][0] ? "d" : "w");
format(item[2], charsmax(item[]), "\wПротестировать спавны");
format(item[3], charsmax(item[]), "\wУдалить все спавны");
format(item[4], charsmax(item[]), "\wСохранить изменения");
for(new i = 0, temp[10]; i < sizeof(item); i ++){
num_to_str(i + 1, temp, charsmax(temp));
menu_additem(menu, item[i], temp);
}
menu_setprop(menu, MPROP_EXITNAME, "\rВыход");
return menu_display(id, menu);
}
public settings_handle(id, menu, item){
if(item == MENU_EXIT)
return 0;
new data[30], iName[64], access, callback;
menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
new key = str_to_num(data);
new Float: fOrigins[3];
get_entvar(id, var_origin, fOrigins);
switch(key){
case 1:{
if(!dOrigins[0][0])
dOrigins[0] = fOrigins;
}
case 2:{
if(!dOrigins[1][0])
dOrigins[1] = fOrigins;
}
case 3:{
set_entvar(id, var_origin, dOrigins[0]);
set_task(1.0, "setOrigin2", id);
}
case 4:{
dOrigins[0][0] = 0.0;
dOrigins[1][0] = 0.0;
}
case 5:{
new buffer[255];
format(buffer, charsmax(buffer), "TT: %f %f %f", dOrigins[0][0], dOrigins[0][1], dOrigins[0][2]);
write_file(szFile, buffer, 0);
format(buffer, charsmax(buffer), "CT: %f %f %f", dOrigins[1][0], dOrigins[1][1], dOrigins[1][2]);
write_file(szFile, buffer, 1);
}
}
return openMenu(id);
}
public setOrigin2(id)
set_entvar(id, var_origin, dOrigins[1]);
//Спавны
public client_disconnect(id){
if(duel && (id == cId || id == tId))
StopDuel();
}
public round_end()
StopDuel();
public PlayerKilled(){
if(!duel && checkDuel()){
new players[32], count;
get_players(players, count, "ache", "CT");
if(is_user_alive(players[0]))
ShowLastCTMenu(players[0]);
}
}
public clcmd_Drop(id){
if(!is_user_alive(id))
return PLUGIN_CONTINUE;
if(duel)
return PLUGIN_HANDLED;
return PLUGIN_CONTINUE;
}
public LastOpen(id){
if(checkDuel())
ShowLastCTMenu(id);
}
//Last
public ShowLastCTMenu(id){
new TeamName:gTeam = get_member(id, m_iTeam);
if(gTeam != TEAM_CT)
return 0;
new caption[128];
format(caption, charsmax(caption), "\d[DUELS]\w Будем играть дуэль?");
new menu = menu_create(caption, "HANDLE_LastCT");
menu_additem(menu, "Да", "1");
menu_additem(menu, "Нет", "2");
menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
return menu_display(id, menu);
}
public HANDLE_LastCT(id, menu, item){
if(item == MENU_EXIT || !checkDuel() || !is_user_alive(id))
return 0;
new data[30], iName[64], access, callback;
menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
new key = str_to_num(data);
switch(key){
case 1: return ShowMenuPeople(id);
case 2: return PLUGIN_HANDLED;
}
return ShowLastCTMenu(id);
}
//People
public ShowMenuPeople(id){
new players[32], count;
get_players(players, count, "ache", "TERRORIST");
if(count == 1){
tId = dr_get_leader();
return ShowOCHMenu(id);
}
new caption[128];
format(caption, charsmax(caption), "\d[DUELS]\w Выберите противника");
new menu = menu_create(caption, "HANDLE_PEOPLE");
for(new i = 0, temp[10], szName[32]; i < count; i ++){
num_to_str(i + 1, temp, charsmax(temp));
get_user_name(players[i], szName, charsmax(szName));
menu_additem(menu, szName, temp);
}
menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
return menu_display(id, menu);
}
public HANDLE_PEOPLE(id, menu, item){
if(item == MENU_EXIT || !checkDuel() || !is_user_alive(id))
return 0;
new data[30], iName[64], access, callback;
menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
new key = str_to_num(data);
new players[32], count;
get_players(players, count, "ache", "TERRORIST");
tId = players[key - 1];
return ShowOCHMenu(id);
}
//OCH
public ShowOCHMenu(id){
new caption[128];
format(caption, charsmax(caption), "\d[DUELS]\w Выберите режим игры");
new menu = menu_create(caption, "HANDLE_OCH");
menu_additem(menu, "Без очереди", "1");
menu_additem(menu, "\rС очередью", "2");
menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
return menu_display(id, menu);
}
public HANDLE_OCH(id, menu, item){
if(item == MENU_EXIT || !checkDuel() || !is_user_alive(id))
return 0;
new data[30], iName[64], access, callback;
menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
new key = str_to_num(data);
switch(key){
case 1: dOch = false;
case 2: dOch = true;
}
return ShowMenuWeapon(id);
}
//Weapon
public ShowMenuWeapon(id){
new caption[128];
format(caption, charsmax(caption), "\d[DUELS]\w Выберите оружие дуэли");
new menu = menu_create(caption, "HANDLE_WPN");
for(new i = 0, temp[10]; i < sizeof(sWeapons); i ++){
num_to_str(i + 1, temp, charsmax(temp));
menu_additem(menu, sWeapons[i][wIName], temp);
}
menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
return menu_display(id, menu);
}
public HANDLE_WPN(id, menu, item){
if(item == MENU_EXIT || !checkDuel() || !is_user_alive(id))
return 0;
new data[30], iName[64], access, callback;
menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
new key = str_to_num(data);
wId = key - 1;
return ShowMenuAccept(id);
}
//Accept
public ShowMenuAccept(id){
new caption[164];
get_user_name(tId, tName, charsmax(tName));
get_user_name(id, cName, charsmax(cName));
format(caption, charsmax(caption), "\d[DUELS]\w Противник:\r %s^n\wОружие:\r %s^n\wРежим:\r %s^n\wНачинаем?", tName, sWeapons[wId][wIName], dOch ? "по очереди" : "без очереди");
new menu = menu_create(caption, "HANDLE_ACCEPT");
menu_additem(menu, "Да", "1");
menu_additem(menu, "\rНет", "2");
menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
return menu_display(id, menu);
}
public HANDLE_ACCEPT(id, menu, item){
if(item == MENU_EXIT || !checkDuel() || !is_user_alive(id))
return 0;
new data[30], iName[64], access, callback;
menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
new key = str_to_num(data);
switch(key){
case 1: return StartBets(id);
case 2: return ShowLastCTMenu(id);
}
return ShowMenuAccept(id);
}
//Bets
public StartBets(id){
dr_stop_game(STOP_GAME);
bets = true;
off_func(false);
set_task(DELAY_INFORMER, "ShowInformer", TASK_INFORMER, .flags = "b");
cId = id;
strip_user_weapons(tId);
strip_user_weapons(cId);
new players[32], count, iTrack = random_num(0, charsmax(betSound));
get_players(players, count, "ch");
for(new i = 0, player; i < count; i ++){
player = players[i];
if(!bSound[player])
continue;
client_cmd(player, "mp3 play %s/%s", SOUND_PATH, betSound[iTrack]);
}
set_entvar(id, var_origin, dOrigins[0]);
set_entvar(tId, var_origin, dOrigins[1]);
set_freeze(true);
if(count == 2)
return StartDuel();
for(new i = 0, player; i < count; i ++){
player = players[i];
if(player == cId || player == tId)
continue;
ShowMenuBet(player);
}
gTime = BETS_DELAY;
set_task(1.0, "timer_gTime", TASK_BETS, .flags = "a", .repeat = BETS_DELAY);
return PLUGIN_CONTINUE;
}
public ShowMenuBet(id){
new caption[128];
format(caption, charsmax(caption), "\d[DUELS]\w На кого хотите поставить?");
new menu = menu_create(caption, "HANDLE_BETS");
new item[3][128];
format(item[0], charsmax(item[]), "\w%s \d[\rTT\d]", tName);
format(item[1], charsmax(item[]), "\w%s \d[\rCT\d]", cName);
format(item[2], charsmax(item[]), "\rОтказываюсь делать ставку");
menu_additem(menu, item[0], "1");
menu_additem(menu, item[1], "2");
menu_additem(menu, item[2], "3");
menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
return menu_display(id, menu);
}
public HANDLE_BETS(id, menu, item){
if(item == MENU_EXIT || !bets)
return 0;
new data[30], iName[64], access, callback;
menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
new key = str_to_num(data);
aBet[id] = 0;
switch(key){
case 1: aBet[id] = tId;
case 2: aBet[id] = cId;
case 3: return PLUGIN_HANDLED;
}
return ShowMenuBetMoney(id);
}
public ShowMenuBetMoney(id){
new caption[128];
format(caption, charsmax(caption), "\d[DUELS]\w Сколько хотите поставить?");
new menu = menu_create(caption, "HANDLE_BETSMONEY");
new item[6][128], szMoney = get_member(id, m_iAccount);
format(item[0], charsmax(item[]), "\%s100$", szMoney >= 100 ? "w" : "d");
format(item[1], charsmax(item[]), "\%s500$", szMoney >= 500 ? "w" : "d");
format(item[2], charsmax(item[]), "\%s1000$", szMoney >= 1000 ? "w" : "d");
format(item[3], charsmax(item[]), "\%s5000$", szMoney >= 5000 ? "w" : "d");
format(item[4], charsmax(item[]), "\%s10000$", szMoney >= 10000 ? "w" : "d");
format(item[5], charsmax(item[]), "Все\r %d$", szMoney);
for(new i = 0, temp[10]; i < sizeof(item); i ++){
num_to_str(i + 1, temp, charsmax(temp));
menu_additem(menu, item[i], temp);
}
menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
return menu_display(id, menu);
}
public HANDLE_BETSMONEY(id, menu, item){
if(item == MENU_EXIT || !bets)
return 0;
new data[30], iName[64], access, callback;
menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
new key = str_to_num(data), szMoney = get_member(id, m_iAccount);
mBet[id] = -1;
switch(key){
case 1:{
if(szMoney >= 100)
mBet[id] = 100;
}
case 2:{
if(szMoney >= 500)
mBet[id] = 500;
}
case 3:{
if(szMoney >= 1000)
mBet[id] = 1000;
}
case 4:{
if(szMoney >= 5000)
mBet[id] = 5000;
}
case 5:{
if(szMoney >= 10000)
mBet[id] = 10000;
}
case 6: mBet[id] = szMoney;
}
if(mBet[id] == -1)
return ShowMenuBetMoney(id);
else{
if(mBet[id] == 0)
return PLUGIN_CONTINUE;
dr_set_user_money(id, szMoney - mBet[id]);
if(aBet[id] == tId){
++ tBet[0];
tBet[1] += mBet[id];
}else{
++ cBet[0];
cBet[1] += mBet[id];
}
new szName[32];
get_user_name(id, szName, charsmax(szName));
client_print_color(0, 0, "^3[^4BETS^3] Игрок^4 %s^3 поставил^4 %d$^3 на^1 %s^3!", szName, mBet[id], aBet[id] == tId ? tName : cName);
}
return PLUGIN_CONTINUE;
}
public StartDuel(){
if(!is_user_alive(tId) || !is_user_alive(cId))
return StopDuel();
bets = false;
duel = true;
new players[32], count, iTrack = random_num(0, charsmax(duelSound));
get_players(players, count, "ch");
for(new i = 0, player; i < count; i ++){
player = players[i];
if(!dSound[player])
continue;
client_cmd(player, "mp3 play %s/%s", SOUND_PATH, duelSound[iTrack]);
}
ExecuteForward(fwdStart, iTrack, tId, cId);
rg_set_user_model(tId, "leet");
rg_set_user_model(cId, "gign");
set_freeze(false);
off_effects(tId);
off_effects(cId);
gTime = DUEL_TIME;
set_entvar(tId, var_health, 100.0);
set_entvar(cId, var_health, 100.0);
rg_give_item(tId, sWeapons[wId][wName]);
rg_give_item(cId, sWeapons[wId][wName]);
if(dOch){
dVstr[cId] = true;
dVstr[tId] = false;
dTime = TIME_ATTACK;
switch(sWeapons[wId][wIndex]){
case CSW_HEGRENADE:{
rg_set_user_bpammo(cId, WeaponIdType:sWeapons[wId][wIndex], sWeapons[wId][oAmmo]);
rg_set_user_bpammo(tId, WeaponIdType:sWeapons[wId][wIndex], sWeapons[wId][oAmmo]);
}
default:{
fm_set_user_ammo(cId, 1);
fm_set_user_ammo(tId, 1);
}
}
set_task(1.0, "timer_dTime", TASK_ATTACK, .flags = "a", .repeat = TIME_ATTACK);
}else{
rg_set_user_bpammo(tId, WeaponIdType:sWeapons[wId][wIndex], sWeapons[wId][wAmmo]);
rg_set_user_bpammo(cId, WeaponIdType:sWeapons[wId][wIndex], sWeapons[wId][wAmmo]);
}
set_task(1.0, "timer_gTime", TASK_DUEL, .flags = "a", .repeat = DUEL_TIME);
return PLUGIN_CONTINUE;
}
public fw_attack(weap){
if(!dOch || !duel)
return HAM_IGNORED;
new id = get_entvar(weap, var_owner);
if(!is_user_alive(id))
return HAM_IGNORED;
if(!dVstr[id])
return HAM_SUPERCEDE
else
ChangeAttack(id);
return HAM_IGNORED
}
public ChangeAttack(id){
dVstr[id] = false;
new vId = id == cId ? tId : cId;
if(is_user_connected(vId)){
dVstr[vId] = true;
fm_set_user_ammo(vId, 1);
client_cmd(vId, "mp3 play %s/%s", SOUND_PATH, AttackSound[random_num(0, sizeof(AttackSound)-1)]);
}
dTime = TIME_ATTACK;
remove_task(TASK_ATTACK);
set_task(1.0, "timer_dTime", TASK_ATTACK, .flags = "a", .repeat = TIME_ATTACK);
}
public timer_dTime(){
if(-- dTime == 0)
ChangeAttack(dVstr[cId] ? cId : tId);
}
public timer_gTime(tid){
if(-- gTime == 0){
switch(tid){
case TASK_BETS:{
StartDuel();
remove_task(TASK_BETS);
}
case TASK_DUEL:{
if(is_user_alive(tId) && is_user_alive(cId)){
new w;
if(get_user_health(tId) > get_user_health(cId))
w = 2;
else if(get_user_health(tId) < get_user_health(cId))
w = 1;
else
w = random_num(1, 2);
user_kill(w == 1 ? tId : cId);
}
StopDuel();
remove_task(TASK_DUEL);
}
}
}else if (tid == TASK_BETS){
new Float: fOrigin[3];
pev(tId, pev_origin, fOrigin);
set_krujok(fOrigin, TEAM_TERRORIST);
pev(cId, pev_origin, fOrigin);
set_krujok(fOrigin, TEAM_CT);
}
}
native dr_set_duels(id, bool:st);
public StopDuel(){
bets = false;
off_func(true);
remove_task(TASK_INFORMER);
remove_task(TASK_DUEL);
remove_task(TASK_BETS);
remove_task(TASK_ATTACK);
client_cmd(0, "mp3 stop");
if(duel){
new win = 0, szWin, szMoney;
if(!is_user_alive(tId)){
win = cId;
client_print_color(0, 0, "^3[^4DUELS^3] Победил^4 %s^3!!", cName);
if(is_user_connected(cId)){
if(cBet[0])
szWin = cBet[1]/cBet[0] + 5000
else
szWin = 5000;
szMoney = get_member(cId, m_iAccount);
dr_set_user_money(cId, szMoney + szWin);
client_print_color(cId, 0, "^3[^4DUELS^3] Вы выиграли^4 %d$", szWin);
}
}else if(!is_user_alive(cId)){
win = tId
client_print_color(0, 0, "^3[^4DUELS^3] Победил^4 %s^3!!", tName);
if(is_user_connected(tId)){
if(tBet[0])
szWin = tBet[1]/tBet[0] + 5000
else
szWin = 5000;
szMoney = get_member(tId, m_iAccount);
dr_set_user_money(tId, szMoney + szWin);
client_print_color(tId, 0, "^3[^4DUELS^3] Вы выиграли^4 %d$", szWin);
}
}
dr_set_duels(win == tId ? tId : cId, true);
dr_set_duels(win == tId ? cId : tId, false);
new players[32], count; get_players(players, count);
for(new i = 0, player; i < count; i ++){
player = players[i];
if(aBet[player] == win){
if(mBet[player] == 0)
continue;
szWin = mBet[player] * 2;
szMoney = get_member(player, m_iAccount);
dr_set_user_money(player, szMoney + szWin);
client_print_color(player, 0, "^3[^4BETS^3] Вы выиграли^4 %d$^3!!", szWin);
}
}
}
cBet = {0, 0};
tBet = {0, 0};
arrayset(aBet, 0, sizeof(aBet))
arrayset(mBet, 0, sizeof(mBet))
duel = false;
return PLUGIN_CONTINUE;
}
public ShowInformer(){
new szBuffer[512], iLen;
iLen = format(szBuffer, charsmax(szBuffer), "[~] Режим: Дуэль [%s]", dOch ? "с очередью" : "без очереди");
iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] Оружие: %s", sWeapons[wId][wIName]);
iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] %s[%d%%] VS %s[%d%%]", tName, get_user_health(tId), cName, get_user_health(cId));
if(dOch && duel){
if(dVstr[cId])
iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] Стреляет %s [%d]", cName, dTime);
else
iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] Стреляет %s [%d]", tName, dTime);
}
if(bets)
iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] Делаем ставки! [%d]", gTime);
else
iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] До конца дуэли [%d] сек", gTime);
if(!cBet[0])
iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] На %s никто не поставил", cName);
else
iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] На %s поставило %d[%d$]", cName, cBet[0], cBet[1]);
if(!tBet[0])
iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] На %s никто не поставил", tName);
else
iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] На %s поставило %d[%d$]", tName, tBet[0], tBet[1]);
set_hudmessage(255, 159, 61, 0.01, 0.19, 0, 0.1, 1.0, _, _, -1);
new players[32], count;
get_players(players, count);
for(new i = 0, player; i < count; i ++){
player = players[i];
ShowSyncHudMsg(player, g_SyncHud, szBuffer);
}
}
bool: checkDuel(){
if(get_member_game(m_iNumTerrorist) == 0)
return false;
if(!dr_active())
return false;
if(duel || bets)
return false;
if(dr_get_gameid() == -1)
return false;
new players[32], count;
get_players(players, count, "ache", "CT");
if(count > 1)
return false;
return true;
}
off_func(func){
dr_set_active_shop(0, func);
dr_set_informer(func);
dr_set_bhop(func);
}
off_effects(id){
set_entvar(id, var_maxspeed, 250.0);
set_entvar(id, var_gravity, 1.0);
set_entvar(id, var_rendermode, kRenderNormal);
set_entvar(id, var_renderamt, 100);
set_entvar(id, var_rendercolor, {0.0, 0.0, 0.0});
set_entvar(id, var_renderfx, kRenderFxGlowShell);
}
set_freeze(func){
new flags;
flags = get_entvar(cId, var_flags);
if(func)
set_entvar(cId, var_flags, flags | FL_FROZEN);
else
set_entvar(cId, var_flags, flags & ~FL_FROZEN);
flags = get_entvar(tId, var_flags);
if(func)
set_entvar(tId, var_flags, flags | FL_FROZEN);
else
set_entvar(tId, var_flags, flags & ~FL_FROZEN);
}
set_krujok(Float:gOrigin[3], TeamName: gTeam){
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, gOrigin, 0)
write_byte(TE_BEAMCYLINDER);
engfunc(EngFunc_WriteCoord, gOrigin[0])
engfunc(EngFunc_WriteCoord, gOrigin[1])
engfunc(EngFunc_WriteCoord, gOrigin[2])
engfunc(EngFunc_WriteCoord, gOrigin[0])
engfunc(EngFunc_WriteCoord, gOrigin[1])
engfunc(EngFunc_WriteCoord, gOrigin[2] + 555.5)
write_short(exploSpr);
write_byte(0);
write_byte(0);
write_byte(5);
write_byte(60);
write_byte(0);
write_byte(gTeam == TEAM_TERRORIST ? 255 : 0);
write_byte(0);
write_byte(gTeam == TEAM_TERRORIST ? 0 : 255);
write_byte(255);
write_byte(0);
message_end();
}
[AMXX] [0] dr_duels.sma::ChangeAttack (line 657)
[AMXX] [1] dr_duels.sma::fw_attack (line 643)