Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

> Правила форума

Этот раздел, как вы могли заметить по названию, предназначен для решения вопросов по поводу уже существующих модов и плагинов.
Пожалуйста, если у вас проблема с написанием плагина, не путайте этот раздел с разделом по скриптингу.
Для поиска плагинов и модов существует соответствующий раздел.

Название темы должно соответствовать содержанию. Темы с названием типа "Помогите", "Вопрос", "парни подскажите..." - будут удалены.
Все темы, не относящиеся к "Вопросам по модам и плагинам", будут удалены или перемещены в соответствующий раздел.

Правила оформления темы:
1. Помимо заголовка не забудьте верно сформулировать свой вопрос.
2. Выложите исходник (в тег кода + ) или ссылку на плагин который вызывает у вас вопросы.
3. Выложите лог с ошибками (если имеется) под спойлер
2 страниц V   1 2

[Knife Duel] Вырезать ф-цию

, Удалить принудительное переключение на нож при ожидании ответа.
Статус пользователя X*CaHeK*X
сообщение 12.11.2013, 12:54
Сообщение #1
Стаж: 17 лет

Сообщений: 705
Благодарностей: 225
Полезность: 561

Пытался разобраться сам, но не осилил. Нужно убрать код, отвечающий за принудительное переключение на нож, когда вызываешь противника на дуэль и ждешь ответа (пока он не даст ответа - игроки будут принудительно с ножами).

Скрытый текст
Код:
        #include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

#define PLUGIN "Knife Duel"
#define VERSION "1.0"
#define AUTHOR "Alka"

#define CBASE_CURRWPN_ENT 373
#define OFFSET_ENT_TO_INDEX 43

new const g_szKnifeSound[] = "weapons/knife_hitwall1.wav";
new const g_szSpawnClassname[] = "info_player_deathmatch";

new Float:g_fHit[33];
new iHitCount[33];
new g_iChallenged, g_iChallenger;

new Float:g_vKnifeOrigin[2][3];
new bool:g_bInChallenge;
new bool:g_bProtect;
new g_iTimer;

enum _:max_cvars {

CVAR_COUNT = 0,
CVAR_TIMER,
CVAR_MAXDISTANCE,
CVAR_PROTECTION,
CVAR_ANNOUNCE,
CVAR_RESET
};
new g_Pcvar[max_cvars];

new g_iFwdSpawn;
new g_iMaxPlayers;

public plugin_init() {

register_plugin(PLUGIN, VERSION, AUTHOR);

register_forward(FM_EmitSound, "fwd_EmitSound", 1);
register_forward(FM_PlayerPreThink, "fwd_PlayerPreThink_post", 1);
RegisterHam(Ham_Killed, "player", "fwd_Killed", 1);
unregister_forward(FM_Spawn, g_iFwdSpawn, 1);

register_logevent("logevent_RoundEnd", 2, "1=Round_End", "1=Round_Draw");

g_Pcvar[CVAR_COUNT] = register_cvar("kd_knifecount", "3");
g_Pcvar[CVAR_TIMER] = register_cvar("kd_preparetime", "3");
g_iTimer = get_pcvar_num(g_Pcvar[CVAR_TIMER]);
g_Pcvar[CVAR_PROTECTION] = register_cvar("kd_protection", "1");
g_Pcvar[CVAR_MAXDISTANCE] = register_cvar("kd_maxdistance", "600");
g_Pcvar[CVAR_ANNOUNCE] = register_cvar("kd_announce", "0");
g_Pcvar[CVAR_RESET] = register_cvar("kd_resethp", "1");

g_iMaxPlayers = get_maxplayers();
}

public plugin_precache()
g_iFwdSpawn = register_forward(FM_Spawn, "fwd_Spawn", 1);

public client_disconnect(id)
{
if((id == g_iChallenged) || (id == g_iChallenger))
{
g_bInChallenge = false;
g_bProtect = false;
}
}

public fwd_Spawn(ent)
{
if(!pev_valid(ent))
return FMRES_IGNORED;

static szClassname[32];
pev(ent, pev_classname, szClassname, sizeof szClassname - 1);

if(equal(szClassname, g_szSpawnClassname))
{
if(vec_null(g_vKnifeOrigin[0]))
{
pev(ent, pev_origin, g_vKnifeOrigin[0]);
}
else if(!vec_null(g_vKnifeOrigin[0]) && vec_null(g_vKnifeOrigin[1]))
{
static Float:vTmp[3];
pev(ent, pev_origin, vTmp);

if((300.0 <= vector_distance(g_vKnifeOrigin[0], vTmp) < 600.0))
g_vKnifeOrigin[1] = vTmp;
}
}
return FMRES_IGNORED;
}

public fwd_EmitSound(id, channel, const sound[])
{
if(!is_user_alive(id))
return FMRES_IGNORED;

if(!equal(sound, g_szKnifeSound))
return FMRES_IGNORED;

static Float:fGmTime;
fGmTime = get_gametime();

if((fGmTime - g_fHit[id]) >= 1.0)
{
iHitCount[id] = 0;
g_fHit[id] = fGmTime;
}
++iHitCount[id];
g_fHit[id] = fGmTime;

if((iHitCount[id] >= get_pcvar_num(g_Pcvar[CVAR_COUNT])) && check_players() && !g_bInChallenge)
{
new iOpponent = get_opponent(3 - get_user_team(id));
if(!iOpponent)
return FMRES_IGNORED;

fnChallenge(id, iOpponent);

iHitCount[id] = 0;
}
return FMRES_IGNORED;
}

public fwd_PlayerPreThink_post(id)
{
if(!is_user_alive(id) || !g_bInChallenge)
return FMRES_IGNORED;

static iWpn;
iWpn = get_pdata_cbase(id, CBASE_CURRWPN_ENT);

if(pev_valid(iWpn))
{
if(get_pdata_int(iWpn, OFFSET_ENT_TO_INDEX) != CSW_KNIFE)
engclient_cmd(id, "weapon_knife");
}

static iOpponent;
if(id == g_iChallenged)
iOpponent = g_iChallenger;
else
iOpponent = g_iChallenged;

if(!is_user_connected(iOpponent))
return FMRES_IGNORED;

if((fm_get_entity_distance(id, iOpponent) >= get_pcvar_float(g_Pcvar[CVAR_MAXDISTANCE])) && g_bProtect)
{
static Float:vVel[3];
fm_get_speed_vector2(id, iOpponent, 100.0, vVel);

set_pev(id, pev_velocity, vVel);
}
return FMRES_IGNORED;
}

public fwd_Killed(id, idattacker, shouldgib)
{
if(!get_pcvar_num(g_Pcvar[CVAR_ANNOUNCE]))
return HAM_IGNORED;

if(check_players())
{
for(new i = 0 ; i <= g_iMaxPlayers ; i++)
{
if(!is_user_alive(i))
continue;

client_print(i, print_chat, "Вы можете вызвать противника на дуэль на ножах ударив стену ножом %d раза.", get_pcvar_num(g_Pcvar[CVAR_COUNT]));
}
}
return HAM_IGNORED;
}

public fnChallenge(id, opponent)
{
new szName[32], szOppName[32];
get_user_name(id, szName, sizeof szName - 1);
get_user_name(opponent, szOppName, sizeof szOppName - 1);

new szTitle[64];
formatex(szTitle, sizeof szTitle - 1, "\r%s \yвызвал вас на ножах", szName);

new iMenu = menu_create(szTitle, "menu_MainHandler", 0);
menu_additem(iMenu, "Принять", "1", 0, -1);
menu_additem(iMenu, "Отклонить", "2", 0, -1);

menu_setprop(iMenu, MPROP_EXIT, MEXIT_NEVER);
menu_display(opponent, iMenu, 0);

client_print(0, print_chat, "%s вызвал %s на дуэль на ножах!", szName, szOppName);

g_iChallenger = id;
g_iChallenged = opponent;
g_bInChallenge = true;
}

public menu_MainHandler(id, menu, item)
{
if(!is_user_connected(id))
return 1;

new szData[6], iAccess, iCallBack;
menu_item_getinfo(menu, item, iAccess, szData, sizeof szData - 1, _, _, iCallBack);

new iKey = str_to_num(szData);

new szName[32];
get_user_name(id, szName, sizeof szName - 1);

switch(iKey)
{
case 1:
{
client_print(0, print_chat, "%s согласился на дуэль!", szName);
fnStartDuel();
}
case 2:
{
client_print(0, print_chat, "%s отклонил дуэль!", szName);
g_bInChallenge = false;
}
}
return 1;
}

public fnStartDuel()
{
if(!is_user_connected(g_iChallenged) || !is_user_connected(g_iChallenger))
return;

engfunc(EngFunc_SetOrigin, g_iChallenged, g_vKnifeOrigin[0]);
engfunc(EngFunc_SetOrigin, g_iChallenger, g_vKnifeOrigin[1]);

fm_entity_set_aim(g_iChallenged, g_iChallenger, 0);
fm_entity_set_aim(g_iChallenger, g_iChallenged, 0);

fm_set_user_godmode(g_iChallenged, 1);
fm_set_user_godmode(g_iChallenger, 1);

if(get_pcvar_num(g_Pcvar[CVAR_RESET]))
{
set_pev(g_iChallenged, pev_health, 100.0);
set_pev(g_iChallenger, pev_health, 100.0);
}
set_task(1.0, "taskDuelThink", 'x', "", 0, "b", 0);

if(get_pcvar_num(g_Pcvar[CVAR_PROTECTION]))
g_bProtect = true;
}

public taskDuelThink()
{
if(g_iTimer > 0)
{
set_hudmessage(255, 100, 0, -1.0, 0.3, 0, 6.0, 1.0, 0.1, 0.9, 1);
show_hudmessage(0, "До начала: %d", g_iTimer--);
}
else
{
set_hudmessage(255, 100, 0, -1.0, 0.3, 0, 6.0, 1.0, 0.1, 0.5, 1);
show_hudmessage(0, "Дуэль началась!");

g_iTimer = get_pcvar_num(g_Pcvar[CVAR_TIMER]);
remove_task('x');

for(new i = 0 ; i <= g_iMaxPlayers ; i++)
{
if(!is_user_alive(i))
continue;

fm_set_user_godmode(i, 0);
}
}
}

public logevent_RoundEnd()
{
g_bInChallenge = false;
g_bProtect = false;

new i;
for(i = 1; i <= g_iMaxPlayers; i++)
if(is_user_connected(i))
show_menu(g_iChallenged, 0, "^n", 1)
}

stock fm_entity_set_aim(id, ent, bone = 0)
{
if(!is_user_connected(id) || !pev_valid(ent))
return 0;

new Float:vOrigin[3];
pev(ent, pev_origin, vOrigin);

new Float:vEntOrigin[3], Float:vAngles[3];

if(bone)
engfunc(EngFunc_GetBonePosition, id, bone, vEntOrigin, vAngles);
else
pev(id, pev_origin, vEntOrigin);

vOrigin[0] -= vEntOrigin[0];
vOrigin[1] -= vEntOrigin[1];
vOrigin[2] -= vEntOrigin[2];

new Float:v_length;
v_length = vector_length(vOrigin);

new Float:vAimVector[3];
vAimVector[0] = vOrigin[0] / v_length;
vAimVector[1] = vOrigin[1] / v_length;
vAimVector[2] = vOrigin[2] / v_length;

new Float:vNewAngles[3];
vector_to_angle(vAimVector, vNewAngles);

vNewAngles[0] *= -1;

if(vNewAngles[1] > 180.0) vNewAngles[1] -= 360;
if(vNewAngles[1] < -180.0) vNewAngles[1] += 360;
if(vNewAngles[1] == 180.0 || vNewAngles[1] == -180.0) vNewAngles[1] = -179.9;

set_pev(id, pev_angles, vNewAngles);
set_pev(id, pev_fixangle, 1);

return 1;
}

stock vec_null(Float:vec[3])
{
if(!vec[0] && !vec[1] && !vec[2])
return 1;

return 0;
}

stock bool:check_players()
{
new iNum[2];
for(new i = 1 ; i <= g_iMaxPlayers ; i++)
{
if(!is_user_alive(i))
continue;

if(get_user_team(i) == 1)
++iNum[0];
else if(get_user_team(i) == 2)
++iNum[1];
}
if((iNum[0] == 1) && (iNum[1] == 1))
return true;

return false;
}

stock get_opponent(team)
{
for(new i = 0 ; i <= g_iMaxPlayers ; i++)
{
if(!is_user_alive(i))
continue;

if(get_user_team(i) == team)
return i;
}
return 0;
}

stock fm_set_user_godmode(index, godmode = 0)
{
set_pev(index, pev_takedamage, godmode == 1 ? DAMAGE_NO : DAMAGE_AIM);
return 1;
}

stock fm_get_speed_vector2(ent1, ent2, Float:speed, Float:new_velocity[3])
{
if(!pev_valid(ent1) || !pev_valid(ent2))
return 0;

static Float:vOrigin1[3];
pev(ent1, pev_origin, vOrigin1);
static Float:vOrigin2[3];
pev(ent2, pev_origin, vOrigin2);

new_velocity[0] = vOrigin2[0] - vOrigin1[0];
new_velocity[1] = vOrigin2[1] - vOrigin1[1];
new_velocity[2] = vOrigin2[2] - vOrigin1[2];
new Float:fNum = floatsqroot(speed * speed / (new_velocity[0] * new_velocity[0] + new_velocity[1] * new_velocity[1] + new_velocity[2] * new_velocity[2]));
new_velocity[0] *= fNum;
new_velocity[1] *= fNum;
new_velocity[2] *= fNum;

return 1;
}

stock Float:fm_get_entity_distance(ent1, ent2)
{
if(!pev_valid(ent1) || !pev_valid(ent2))
return 0.0;

static Float:vOrigin1[3];
pev(ent1, pev_origin, vOrigin1);
static Float:vOrigin2[3];
pev(ent2, pev_origin, vOrigin2);

return vector_distance(vOrigin1, vOrigin2);
}



Отредактировал: X*CaHeK*X, - 12.11.2013, 12:55
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Safety1st
сообщение 12.11.2013, 13:40
Сообщение #2
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Вот: [attachment=21705:duel.sma]
Также попробуйте эту версию [attachment=21704:duel_test.sma]
и расскажите, что изменилось во время ожидания ответа и во время дуэли.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя X*CaHeK*X
сообщение 12.11.2013, 14:53
Сообщение #3
Стаж: 17 лет

Сообщений: 705
Благодарностей: 225
Полезность: 561

Цитата(Safety1st @ 12.11.2013, 17:40) *
Вот: [attachment=21705:duel.sma]
Также попробуйте эту версию [attachment=21704:duel_test.sma]и расскажите, что изменилось во время ожидания ответа и во время дуэли.

Первый (duel) не работает вовсе. Вызываешь игрока на дуель (сообщение о том что вызвал игрока появляется), но у вызываемого меню с выбором не появляется - т.е не работает вовсе.
Второй (duel_test) Работает частично. Работает все, за исключением того, что у вызываемого (не вызывающего) не запрещается оружие (т.е если он был с пистолетом, так с ним и останется, только если САМ не переключится на нож; тогда уже обратно сменить на пистолет/автомат не сможет). + Ошибка при компиляции.

Прикрепленное изображение

Отредактировал: X*CaHeK*X, - 12.11.2013, 15:15
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 12.11.2013, 15:41
Сообщение #4
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Результаты не полные. Ну да ладно.

Вот 2 варианта в одном, пробуйте: [attachment=21709:duel_ret.sma]
По умолчанию в плагине отсутствует поддержка
Код
kd_protection 1
kd_maxdistance xxx

Там защита от чего-то во время дуэли, зависит от дистанции между противниками. Не понял этот кусок кода. Было бы интересно послушать, что оно даёт в реале.
Если ранее не использовали kd_protection 1 - то стало только лучше (снята, наверное, почти вся 'нагрузка' во время дуэли). Ну а кому 'защита' нужна - включается в sma расскомментированием строки
Код
//#define USE_PROTECTION
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
exec1337
сообщение 12.11.2013, 15:46
Сообщение #5
Стаж: 13 лет

Сообщений: 6490
Благодарностей: 2558
Полезность: 491

Цитата(Safety1st @ 12.11.2013, 16:41) *
Там защита от чего-то во время дуэли, зависит от дистанции между противниками. Не понял этот кусок кода. Было бы интересно послушать, что оно даёт в реале.

Защита от урона на время отсчёта.
Дистанция чекается на предмет избегания дуэли. Т.е. если один из борцов убегает на n-юнитов(или в чём там оно),то его(их) телепортирует опять на точки спауна.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Safety1st
сообщение 12.11.2013, 15:51
Сообщение #6
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

exec1337, вангуете? :)

Цитата(exec1337 @ 12.11.2013, 17:46) *
Защита от урона на время отсчёта.

Неверно) 'Выключенный' кусок этим не занимается.

Цитата(exec1337 @ 12.11.2013, 17:46) *
Дистанция чекается на предмет избегания дуэли. Т.е. если один из борцов убегает на n-юнитов(или в чём там оно),то его(их) телепортирует опять на точки спауна.

Избеганию препятствует, да. Телепортации нет. Делает что-то со скоростью. Меня интересует, как это точно выглядит в игре.
--

Проверяйте плагин и выложу на AM.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
exec1337
сообщение 12.11.2013, 15:59
Сообщение #7
Стаж: 13 лет

Сообщений: 6490
Благодарностей: 2558
Полезность: 491

Safety1st,в моем плагине от этого автора+мелкие фиксы всё работает именно так.

По стандарту функционал описан выше.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 12.11.2013, 16:03
Сообщение #8
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Значит, у вас 'мелкие фиксы' изменили поведение kd_protection 1. Код не врёт)
Может заодно поделитесь инфой, что в плагине стоит пофиксить? ;)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
exec1337
сообщение 12.11.2013, 16:14
Сообщение #9
Стаж: 13 лет

Сообщений: 6490
Благодарностей: 2558
Полезность: 491

really.

Код:
public backp()
{
if(!is_user_connected(g_iChallenged) || !is_user_connected(g_iChallenger))
return;

engfunc(EngFunc_SetOrigin, g_iChallenged, g_vKnifeOrigin[0]);
engfunc(EngFunc_SetOrigin, g_iChallenger, g_vKnifeOrigin[1]);

fm_entity_set_aim(g_iChallenged, g_iChallenger, 0);
fm_entity_set_aim(g_iChallenger, g_iChallenged, 0);

if(get_pcvar_num(g_Pcvar[CVAR_PROTECTION]))
g_bProtect = true;
}


Прошу прощения,что ввёл в заблуждение.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 12.11.2013, 16:39
Сообщение #10
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Мы друг друга не поняли) Меня интересует во время дуэли, а не в начале)

Окончательная версия: [attachment=21711:duel_ret_russian.sma]
Поправил код кого-то из фиксильщиков + пара мелочей.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя X*CaHeK*X
сообщение 12.11.2013, 16:55
Сообщение #11
Стаж: 17 лет

Сообщений: 705
Благодарностей: 225
Полезность: 561

Все работает! Спасибо!
Цитата
* Russian edition xD
* Translated by unknown author.


Translated by me ... boast.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 12.11.2013, 17:05
Сообщение #12
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Okay)
Выложил)


Так как всё-таки выглядит предотвращение избегания дуэли мне кто-нибудь скажет? Или все тупо впрок скачивают, не юзая и не разбираясь? xD
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
exec1337
сообщение 12.11.2013, 21:17
Сообщение #13
Стаж: 13 лет

Сообщений: 6490
Благодарностей: 2558
Полезность: 491

Но я же...

pawn
Код:
public fwd_PlayerPreThink_post(id)
{
if(!is_user_alive(id) || !g_bInChallenge)
return FMRES_IGNORED;

static iWpn;
iWpn = get_pdata_cbase(id, CBASE_CURRWPN_ENT);

if(pev_valid(iWpn))
{
if(get_pdata_int(iWpn, OFFSET_ENT_TO_INDEX) != CSW_KNIFE)
engclient_cmd(id, "weapon_knife");
}

static iOpponent;
if(id == g_iChallenged)
iOpponent = g_iChallenger;
else
iOpponent = g_iChallenged;

if(!is_user_connected(iOpponent))
return FMRES_IGNORED;

if((fm_get_entity_distance(id, iOpponent) >= get_pcvar_float(g_Pcvar[CVAR_MAXDISTANCE])) && g_bProtect)
{
static Float:vVel[3];
backp();

set_pev(id, pev_velocity, vVel);
}
return FMRES_IGNORED;
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 12.11.2013, 21:26
Сообщение #14
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Мм?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя BouHPycu
сообщение 22.5.2015, 17:10
Сообщение #15


Стаж: 12 лет
Город: Запорожье

Сообщений: 88
Благодарностей: 12
Полезность: 98

Safety1st, Вопрос по плагину, хотя конечно плагин не твой, но возможно ты разбирался, ведь даже дорабатывал.
Не пойму где прописано куда телепортировать игроков в начале дуэли?.. потому что на некоторых зонах телепортирует почему-то в стену. Предположительно должно бы телепортировать вроде как на места респаунов на Т или СТ респ.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя BouHPycu
сообщение 22.5.2015, 17:33
Сообщение #16


Стаж: 12 лет
Город: Запорожье

Сообщений: 88
Благодарностей: 12
Полезность: 98

Я так понимаю, что точки куда перемещаются игроки описываются тут
код
Код
public fwd_Spawn(ent)
{
    if(!pev_valid(ent))
        return FMRES_IGNORED;
    
    static szClassname[32];
    pev(ent, pev_classname, szClassname, sizeof szClassname - 1);
    
    if(equal(szClassname, g_szSpawnClassname))
    {
        if(vec_null(g_vKnifeOrigin[0]))
        {
            pev(ent, pev_origin, g_vKnifeOrigin[0]);
        }
        else if(!vec_null(g_vKnifeOrigin[0]) && vec_null(g_vKnifeOrigin[1]))
        {
            static Float:vTmp[3];
            pev(ent, pev_origin, vTmp);
            
            if((300.0 <= vector_distance(g_vKnifeOrigin[0], vTmp) < 600.0))
                g_vKnifeOrigin[1] = vTmp;
        }
    }
    return FMRES_IGNORED;
}



может что-то тут не срабатывает?

Отредактировал: BouHPycu, - 22.5.2015, 17:47
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя BouHPycu
сообщение 22.5.2015, 18:45
Сообщение #17


Стаж: 12 лет
Город: Запорожье

Сообщений: 88
Благодарностей: 12
Полезность: 98

Эксперементально определил, что g_vKnifeOrigin[0] и g_vKnifeOrigin[1] не всегда существуют. т.е.не определяются плагином...
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя BouHPycu
сообщение 22.5.2015, 23:57
Сообщение #18


Стаж: 12 лет
Город: Запорожье

Сообщений: 88
Благодарностей: 12
Полезность: 98

Вопрос снимается... поменял способ нахождения класса, все заработало как надо.

Отредактировал: BouHPycu, - 22.5.2015, 23:58
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 23.5.2015, 0:44
Сообщение #19
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Почему бы не поделиться информацией?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя BouHPycu
сообщение 4.6.2015, 19:39
Сообщение #20


Стаж: 12 лет
Город: Запорожье

Сообщений: 88
Благодарностей: 12
Полезность: 98

Цитата(Safety1st @ 23.5.2015, 0:44) *
Почему бы не поделиться информацией?

потому что я "чайник" в скриптинге и основываюсь на примерах. А следовательно то что я подправил больше похоже на костыль, чем на лечени
В принципе я оставил оригинал, но если при старте дуэли оказывается, что точки таки не найдены вставил данный набор строк:
Код
    if(vec_null(g_vKnifeOrigin[0]))
    {
        new ent
        while((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", g_szSpawnClassname)))
        {
                if(vec_null(g_vKnifeOrigin[0]))
            {
                pev(ent, pev_origin, g_vKnifeOrigin[0]);
            }
            else if(!vec_null(g_vKnifeOrigin[0]) && vec_null(g_vKnifeOrigin[1]))
            {
                static Float:vTmp[3];
                pev(ent, pev_origin, vTmp);
            
                if((300.0 <= vector_distance(g_vKnifeOrigin[0], vTmp) < 600.0))
                    g_vKnifeOrigin[1] = vTmp;
            }
        }      
    }

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

Код
    if(!vec_null(g_vKnifeOrigin[0])){
        engfunc(EngFunc_SetOrigin, g_iChallenged, g_vKnifeOrigin[0]);
    }
    if(!vec_null(g_vKnifeOrigin[1])){
        engfunc(EngFunc_SetOrigin, g_iChallenger, g_vKnifeOrigin[1]);
    }

и тут проверку (чтобы не притягивало издалека)
Код
if((fm_get_entity_distance(id, iOpponent) >= get_pcvar_float(g_Pcvar[CVAR_MAXDISTANCE])) && g_bProtect && !vec_null(g_vKnifeOrigin[0]))


Кроме того, для себя я добавил отлов установки бомбы и невозможность предложить дуэль или отмену дуэли при установленной бомбе. Чтобы не возникало ситуаций, когда поставили бомбу и потом дуэль перенесет далеко от нее.
Могу скинуть исходник целиком со всеми моими костылями, может кто конечно их доработает.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
2 страниц V   1 2
 
Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: