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

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

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

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

2 страниц V   1 2

Помощь с блокировкой убийста с машин.

, Добавить 1 код...
Статус пользователя CH0CAPIC
сообщение 27.8.2014, 17:45
Сообщение #1


Стаж: 12 лет

Сообщений: 388
Благодарностей: 19
Полезность: < 0

Здравствуйте. У меня есть код блокировки убийства игроков с помощью машин. Можете чуток изменить его так, чтобы блокировка распространялась только на свою команду? (чтобы игрок мог задавить врага, но не смог бы задавить своего) Заранее благодарен.

Код:
#include <amxmodx> 
#include <hamsandwich>
#include <fakemeta>

public plugin_init() {
register_plugin("Block Vehicle Damage", "1.0", "OnePL");

RegisterHam(Ham_TakeDamage, "player", "TakeDamageVehicle");
}

public TakeDamageVehicle(id, ent) {
static name[32]; pev(ent, 1, name, 31);
if(equal(name, "func_vehicle")) {
SetHamParamFloat(4, 0.0);
return 2;
}
return 1;
}


Отредактировал: CH0CAPIC, - 27.8.2014, 17:48
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя Legenda
сообщение 27.8.2014, 18:37
Сообщение #2


Иконка группы

Стаж: 16 лет

Сообщений: 3619
Благодарностей: 1706
Полезность: 1010

Меценат Меценат

насколько я знаю так сделать нельзя
так как машина вообще без водителя может ехать....
если только получать как-то последнего водителя и хранить его, а потом сравнивать с тем, кого давят....
да и не понятно как узнать кто взял руль...
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 3 раз
   + Цитировать сообщение
Статус пользователя CH0CAPIC
сообщение 27.8.2014, 18:45
Сообщение #3


Стаж: 12 лет

Сообщений: 388
Благодарностей: 19
Полезность: < 0

Цитата(Legenda @ 27.8.2014, 17:37) *
насколько я знаю так сделать нельзя
так как машина вообще без водителя может ехать....
если только получать как-то последнего водителя и хранить его, а потом сравнивать с тем, кого давят....
да и не понятно как узнать кто взял руль...

Понятно...Плагин вообще запрещает убийство с помощью машин, даже если за ним нет водителя. Значит, невозможно применить действие относительно игроку, так ли ?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Legenda
сообщение 27.8.2014, 18:47
Сообщение #4


Иконка группы

Стаж: 16 лет

Сообщений: 3619
Благодарностей: 1706
Полезность: 1010

Меценат Меценат

Цитата(CH0CAPIC @ 27.8.2014, 20:45) *
Понятно...Плагин вообще запрещает убийство с помощью машин, даже если за ним нет водителя. Значит, невозможно применить действие относительно игроку, так ли ?

можно в принципе

просто не представляю такого алгоритма, которые правильно бы работал с точки зрения логики и давал бы 100% надежность определения того, из-за кого задавали...
но склоняюсь к мысли, что такое не реально
ведь есть карты где несколько машин, и эти машины могут друг друга толкать....

мое скромное мнение, - это не реально....
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя wadim21
сообщение 27.8.2014, 19:02
Сообщение #5


Стаж: 11 лет

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

Я с этим не сталкивался, и думаю что это сделать нельзя.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя csnet
сообщение 27.8.2014, 19:19
Сообщение #6
Стаж: 12 лет

Сообщений: 4808
Благодарностей: 3849
Полезность: 690

можно конечно у тебя просто неполная функция takedamage
у тебя чекается inflictor - то есть то что причиняет урон.
а сама функция зарегана на player- на игрока. т.е мы можем все делать с игроками тоже



Код:




public TakeDamageVehicle(id, ent,victim) {
static name[32]; pev(ent, 1, name, 31)
new owner = pev(ent, pev_owner)
if(equal(name, "func_vehicle")){
if (get_user_team(owner) == get_user_team(victim))
SetHamParamFloat(4, 0.0)
else user_kill(victim)
}



semiclolon 1 ? убрал ;

на коленке, не тестил, т.е если в entity когда садятся за руль сразу передается owner то легко. или пользуйся
т.е надо чекнуть if user_alive(owner) - т.е человек, дальше его команду. и убивать или нет

/* Returns different values depending on if user is driving a vehicle - and if so at what speed.
* 0: no driving
* 1: driving, but standing still
* 2-4: driving, different positive speeds
* 5: driving, negative speed (backing)
* Note: these values were tested quickly, they may differ.
*/
native cs_get_user_driving(index);
}

Отредактировал: csnet, - 27.8.2014, 19:21


go v cs:go
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Safety1st
сообщение 27.8.2014, 19:25
Сообщение #7
Стаж: 14 лет
Город: Moscow

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

Думаю, достаточно будет блокировать урон только от управляемой игроком тележки. А если неуправляемая задавила - это судьба
Тогда задача решается просто.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Legenda
сообщение 27.8.2014, 19:41
Сообщение #8


Иконка группы

Стаж: 16 лет

Сообщений: 3619
Благодарностей: 1706
Полезность: 1010

Меценат Меценат

Цитата(Safety1st @ 27.8.2014, 21:25) *
Думаю, достаточно будет блокировать урон только от управляемой игроком тележки. А если неуправляемая задавила - это судьба
Тогда задача решается просто.

а если одна тележка толкнула другую тележку, и та задавила игрока...?)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя admir
сообщение 27.8.2014, 19:47
Сообщение #9
Стаж: 13 лет

Сообщений: 192
Благодарностей: 31
Полезность: 138

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

#include <amxmodx>
#include <cstrike>
#include <hamsandwich>
#include <fakemeta>

new vehicleOwner[255];

public plugin_init()
{
register_plugin("Block Vehicle Damage", "1.0", "OnePL");
RegisterHam(Ham_TakeDamage, "player", "TakeDamageVehicle");
RegisterHam(Ham_Touch, "func_vehiclecontrols", "VehicleControlsTouch");
}

public VehicleControlsTouch(ent, id)
{
vehicleOwner[ent] = id;
}

public TakeDamageVehicle(id, ent)
{
static name[32]; pev(ent, 1, name, 31);
if(equal(name, "func_vehicle") && vehicleOwner[ent] && (cs_get_user_team(id) == cs_get_user_team(vehicleOwner[ent])))
{
SetHamParamFloat(4, 0.0);
return 2;
}
return 1;
}

@csnet, а разве урон не сама машина наносит?

Цитата(Legenda @ 27.8.2014, 19:41) *
а если одна тележка толкнула другую тележку, и та задавила игрока...?)

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

Отредактировал: admir, - 27.8.2014, 19:52
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Safety1st
сообщение 27.8.2014, 20:00
Сообщение #10
Стаж: 14 лет
Город: Moscow

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

Legenda, видимо, ты не понял мою мысль)

admir, ваш код работает?
Форвард правильнее в Post. Лучше ловить Ham_Use. Команду игрока сохраняйте, например, в iuser1 ... iuser4 поле entity: на момент урона игрок может уже отключиться и натива вернёт ошибку.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя CH0CAPIC
сообщение 27.8.2014, 20:00
Сообщение #11


Стаж: 12 лет

Сообщений: 388
Благодарностей: 19
Полезность: < 0

csnet,
admir,
Спасибо вам за помощь, но у варианта csnet-а нет реакции (на убийство врага, ну всё как было, так и осталось). А вариант admir-а только лишил способности плагина блокировать убийства.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 27.8.2014, 20:08
Сообщение #12
Стаж: 14 лет
Город: Moscow

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

admir мб допилит свой еще, у него есть перспективы good.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя s1lent
сообщение 27.8.2014, 21:06
Сообщение #13
Стаж: 16 лет

Сообщений: 440
Благодарности: выкл.

Код:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

#define VEHICLE_CLASSNAME "func_vehicle"

/*
((CFuncVehicle *)pTrain)->m_pDriver = NULL;

window *(_DWORD *)(v33 + 340) = 0;
340 / 4 = 85

linux *(_DWORD *)(v38 + 356) = 0;
356 / 4 = 89
*/

new maxplayers;

const m_iTeam = 114;
const m_pDriver = 85;

public plugin_init() {

if(!engfunc(EngFunc_FindEntityByString,-1,"classname",VEHICLE_CLASSNAME)) {
pause("d");
}

RegisterHam(Ham_Blocked,VEHICLE_CLASSNAME,"CFuncVehicle__Blocked");

maxplayers = get_maxplayers();
}
public CFuncVehicle__Blocked(ent,id)
{
new pDriver = get_pdata_cbase(ent,m_pDriver,4);

if(pDriver == id) {
return HAM_IGNORED;
}

if(pDriver < 1 || pDriver > maxplayers) {
return HAM_IGNORED;
}
return (get_pdata_int(pDriver,m_iTeam) == get_pdata_int(id,m_iTeam)) ? HAM_SUPERCEDE : HAM_IGNORED;
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя CH0CAPIC
сообщение 27.8.2014, 21:29
Сообщение #14


Стаж: 12 лет

Сообщений: 388
Благодарностей: 19
Полезность: < 0

Цитата(s1lent @ 27.8.2014, 20:06) *
Код:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

#define VEHICLE_CLASSNAME "func_vehicle"

/*
((CFuncVehicle *)pTrain)->m_pDriver = NULL;

window *(_DWORD *)(v33 + 340) = 0;
340 / 4 = 85

linux *(_DWORD *)(v38 + 356) = 0;
356 / 4 = 89
*/

new vehicleAlloc;
const m_iTeam = 114;
const m_pDriver = 85;//89 +4

public plugin_init() {

new iNum = 0;
new iEnt = -1;

vehicleAlloc = engfunc(EngFunc_AllocString,VEHICLE_CLASSNAME);

if(vehicleAlloc) {

while((iEnt = engfunc(EngFunc_FindEntityByString,iEnt,"classname",VEHICLE_CLASSNAME))) {

iNum++;
set_pev(iEnt,pev_iuser4,vehicleAlloc);
}
}
if(!iNum) {
pause("d");
}

register_forward(FM_Blocked,"DispatchBlocked");
}

public DispatchBlocked(ent,id) {

if(pev(ent,pev_iuser4) != vehicleAlloc) {
return FMRES_IGNORED;
}

new pDriver = get_pdata_cbase(ent,m_pDriver,4);

if(!pDriver) {
return FMRES_IGNORED;
}

return (get_pdata_int(pDriver,m_iTeam) == get_pdata_int(id,m_iTeam)) ? FMRES_SUPERCEDE : FMRES_IGNORED;
}

Спасибо s1lent ! Хоть с неупрявляемой тачки можешь задавить, но всё равно это пустяки, главное работает.
ps.gif Извини, что вопрос чуток не по теме, но будет ли в твоём whblocker-е интеграция бага с падением сервера, когда заводишь механизм?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя s1lent
сообщение 27.8.2014, 21:40
Сообщение #15
Стаж: 16 лет

Сообщений: 440
Благодарности: выкл.

да я уже исправил, на днях обновлю.
ps.gif поправил исходник, pDriver == -1 проскакивал.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя admir
сообщение 27.8.2014, 21:45
Сообщение #16
Стаж: 13 лет

Сообщений: 192
Благодарностей: 31
Полезность: 138

@s1lent, скажите если не трудно, будет ли работать данная версия? как оптимизировать может, если работает вдруг
Код:
#include <amxmodx>
#include <cstrike>
#include <hamsandwich>
#include <fakemeta>

new vehicleOwner[256];

public plugin_init()
{
register_plugin("Block Vehicle Damage", "1.0", "OnePL");
RegisterHam(Ham_TakeDamage, "player", "TakeDamageVehicle");
RegisterHam(Ham_Use, "func_vehiclecontrols", "VehicleControlsTouch");
}

public VehicleControlsTouch(ent, id)
{
vehicleOwner[ent] = cs_get_user_team(id);
}

public TakeDamageVehicle(id, ent)
{
static name[32]; pev(ent, 1, name, 31);
if(equal(name, "func_vehicle") && (cs_get_user_team(id) == vehicleOwner[ent]))
{
SetHamParamFloat(4, 0.0);
return 2;
}
return 1;
}


Цитата(Safety1st @ 27.8.2014, 20:00) *
admir, ваш код работает?
Форвард правильнее в Post. Лучше ловить Ham_Use. Команду игрока сохраняйте, например, в iuser1 ... iuser4 поле entity: на момент урона игрок может уже отключиться и натива вернёт ошибку.

как оказалось не работает :) Учту, кроме того что, увы не силён, не понял: про Post, и про поля entity.

Отредактировал: admir, - 27.8.2014, 21:48
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя s1lent
сообщение 27.8.2014, 21:50
Сообщение #17
Стаж: 16 лет

Сообщений: 440
Благодарности: выкл.

admir, а чем вам мой вариант не устроил?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя admir
сообщение 27.8.2014, 21:55
Сообщение #18
Стаж: 13 лет

Сообщений: 192
Благодарностей: 31
Полезность: 138

Цитата(s1lent @ 27.8.2014, 21:50) *
admir, а чем вам мой вариант не устроил?

всем устроил, просто интересно возможно ли заставить работать то что дописал к изначальному коду я :)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя CH0CAPIC
сообщение 27.8.2014, 21:59
Сообщение #19


Стаж: 12 лет

Сообщений: 388
Благодарностей: 19
Полезность: < 0

s1lent,
Упс, плагин жалуется:

Код
L 08/27/2014 - 23:57:48: [FAKEMETA] Invalid entity
L 08/27/2014 - 23:57:48: [AMXX] Displaying debug trace (plugin "block_tkill_vehicle.amxx")
L 08/27/2014 - 23:57:48: [AMXX] Run time error 10: native error (native "get_pdata_int")
L 08/27/2014 - 23:57:48: [AMXX]    [0] block_tkill_vehicle.sma::DispatchBlocked (line 55)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя s1lent
сообщение 27.8.2014, 22:00
Сообщение #20
Стаж: 16 лет

Сообщений: 440
Благодарности: выкл.

Цитата(CH0CAPIC @ 28.8.2014, 2:59) *
s1lent,
Упс, плагин жалуется:

Код
L 08/27/2014 - 23:57:48: [FAKEMETA] Invalid entity
L 08/27/2014 - 23:57:48: [AMXX] Displaying debug trace (plugin "block_tkill_vehicle.amxx")
L 08/27/2014 - 23:57:48: [AMXX] Run time error 10: native error (native "get_pdata_int")
L 08/27/2014 - 23:57:48: [AMXX]    [0] block_tkill_vehicle.sma::DispatchBlocked (line 55)


потому и написал, что поправил исходник, логично нужно перекомпилировать еще раз.

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