Недавно я сталкнулся с проблемой спавна "custom item" в плагине "Weapon Physics",
в общем в этом плагине есть возможность добавить свою ентити для обработки физики,
или установить своей ентити предложеный "classname":
Code
// What the entity's classname is changed to after it's created, e.g. set_pev(ent, pev_classname, "fakeweapon")
new const custom_classname[][] = { "fakeweapon" }
Но проблема в том что нужные параметры для ентити ставятся на спавне, а спавн
своей ентити не происходит.
Для выхода из этого положения я создал ещё дополнительный плагин (SpawnCustomItem.sma)
и include файл (SpawnCustomItem.inc) с помощью которых можно это исправить.
Кидаете всё по нужным папкам, далее нужно сделать так:
в плагине "Weapon Physics" нужно добавить
Code
#include <SpawnCustomItem>
потом заменить существующие функции на эти
Code
public do_ham_hooks()
{
new count = 0
for (new i; i < sizeof persistant; i++)
{
hamhooks[count++] = RegisterHam(Ham_Spawn, persistant[i], "spawn_persistant_item", 1)
hamhooks[count++] = RegisterHam(Ham_Touch, persistant[i], "touch_item")
hamhooks[count++] = RegisterHam(Ham_TakeDamage, persistant[i], "damage_item")
hamhooks[count++] = RegisterHam(Ham_TraceAttack, persistant[i], "shoot_item")
}
for (new x; x < sizeof classes; x++)
{
hamhooks[count++] = RegisterHam(Ham_Spawn, classes[x], "spawn_item", 1)
hamhooks[count++] = RegisterHam(Ham_Touch, classes[x], "touch_item")
hamhooks[count++] = RegisterHam(Ham_TakeDamage, classes[x], "damage_item")
hamhooks[count++] = RegisterHam(Ham_TraceAttack, classes[x], "shoot_item")
}
for (new n; n < sizeof custom_base; n++)
{
//hamhooks[count++] = RegisterHam(Ham_Spawn, custom_base[n], "spawn_custom_item", 1)
hamhooks[count++] = RegisterHam(Ham_Touch, custom_base[n], "touch_custom_item")
hamhooks[count++] = RegisterHam(Ham_TakeDamage, custom_base[n], "damage_custom_item")
hamhooks[count++] = RegisterHam(Ham_TraceAttack, custom_base[n], "shoot_custom_item")
}
}
public update_hooks_and_forwards()
{
if (get_pcvar_num(physics_pcvar))
{
for (new i; i < sizeof hamhooks-1; i++)
{
EnableHamForward(hamhooks[i])
}
}
else
{
for (new i; i < sizeof hamhooks-1; i++)
{
DisableHamForward(hamhooks[i])
}
}
if (get_pcvar_num(shootweapons_pcvar) && get_pcvar_num(physics_pcvar) && !traceline_fid)
{
traceline_fid = register_forward(FM_TraceLine, "fw_traceline")
}
if ((!get_pcvar_num(shootweapons_pcvar) || !get_pcvar_num(physics_pcvar)) && traceline_fid)
{
unregister_forward(FM_TraceLine, traceline_fid)
traceline_fid = 0
}
if(get_pcvar_num(physics_pcvar) && !is_enabled_spawn_custom_item())
{
enable_spawn_custom_item()
}
else
{
disab le_spawn _custom_ item()
}
}
p ublic spawn_custom_item(ent)
{
if (is_custom_ent(ent))
{
return spawn_item(ent)
}
return PLUGIN_CONTINUE
}
Ну и конечно добавить свой "classname" или использовать предложеный
Code
new const custom_classname[][] = { "fakeweapon", "my_classname" }
Теперь переходим к своему плагину и добавляем нужные строки:
Code
#include <SpawnCustomItem> // эту строку
// это к примеру
public create_my_entity(Float:crwforigin[3], Float:crwfangles[3]) {
new crent = fm_create_entity("info_target")
if(!pev_valid(crent))
return 0
set_pev(crent, pev_classname, "my_classname")
set_pev(crent, pev_solid, SOLID_TRIGGER)
set_pev(crent, pev_movetype, MOVETYPE_TOSS)
set_pev(crent, pev_origin, crwforigin)
set_pev(crent, pev_angles, crwfangles)
fm_entity_set_model(crent, "my_model")
fm_entity_set_size(crent, {-12.0, -12.0, -0.5}, {12.0, 12.0, 0.5})
execute_spawn_custom_item(crent) // эту строку
return crent
}
В файле "configs\plugins.ini" нужно обязательно чтобы перед вашим плагином и
перед плагином "Weapon Physics" стоял "SpawnCustomItem.amxx"
Теперь всё компилируем, всё должно работать, а если у кого нет плагина
"Weapon Physics" или неполучается сделать, то можно ниже скачать уже передланый
плагин, вам останется только добавить в свой плагин нужные строки и в плагине
"Weapon Physics" добавить свой "classname" или использовать предложеный.
Добавлено (2009-06-25, 4:11 Pm)
---------------------------------------------
Забыл ещё добавить, в описании плагина написано что при выстрелах по оружию оно
должно отскакивать, к примеру у меня оно не отскакивает, я понял проблему, нужно
чтобы у ентити солид был установлен на "SOLID_BBOX" или "SOLID_SLIDEBOX"
(set_pev(ent, pev_solid, SOLID_BBOX) или set_pev(ent, pev_solid, SOLID_SLIDEBOX),
к сожелению на "натуральное" оружие солид неустанавливается, но зато можно установить
на свою ентити (custom item), поставить в своём плагине при создании ентити или в
плагине "Weapon Physics" на спавне "custom item":
Code
public spawn_custom_item(ent)
{
if (is_custom_ent(ent))
{
set_pev(ent, pev_solid, SOLID_BBOX)
return spawn_item(ent)
}
return PLUGIN_CONTINUE
}
Теперь при выстрелах по своей ентити она будет отскакивать.
Добавлено (2009-06-27, 8:43 Pm)
---------------------------------------------
Нашёл способ чтобы при выстреле по ентити отскакивало даже неимея солид
"SOLID_BBOX" или "SOLID_SLIDEBOX" или "SOLID_BSP" достаточно "SOLID_TRIGGER"
и желательно размер установить, а то без размера почти вообще нибудет замечать, и
на "натуральное" оружие тоже действует.
Долго описывать что там изменил и добавил просто перезалил переделаный плагин,
смысл добавления своей ентити такойже, только за место #include <SpawnCustomItem>
надо #include <WeaponPhysicsNatives>
Добавлено (2009-06-28, 4:40 Pm)
---------------------------------------------
Плагин перезалил, теперь при ударе ножом по ентити тоже будет отскакивать.