@RAMA,
say /create - создать/переопределить координаты по взгляду
say /orig - управление координатами
say /rot - управление углами
say /size - управление размерами
say /reset - сброс углов, размеров.
C-подобный:
#include <amxmodx>
#include <fakemeta_util>
new const g_szEntModel[] = "models/pallet.mdl"
new g_iEnt;
public plugin_precache() {
precache_model(g_szEntModel);
}
public plugin_init() {
register_clcmd("say /create", "_ent_create");
register_clcmd("say /orig", "_ent_orig");
register_clcmd("say /rot", "_ent_rot");
register_clcmd("say /size", "_ent_size");
register_clcmd("say /reset", "_ent_reset");
}
public _ent_create(pPlayer) {
if(pev_valid(g_iEnt)) {
new Float: flVecOrigin[3];
fm_get_aim_origin(pPlayer, flVecOrigin);
set_pev(g_iEnt, pev_origin, flVecOrigin);
}
else {
g_iEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
if(pev_valid(g_iEnt)) {
new Float: flVecOrigin[3];
fm_get_aim_origin(pPlayer, flVecOrigin);
engfunc(EngFunc_SetOrigin, g_iEnt, flVecOrigin);
engfunc(EngFunc_SetModel, g_iEnt, g_szEntModel);
register_forward(FM_PlayerPreThink, "CBasePlayer_PreThink");
}
}
}
public _ent_orig(pPlayer) {
if(!pev_valid(g_iEnt)) {
client_print(pPlayer, print_center, "say /create");
}
else{
new Float: flVecOrigin[3];
pev(g_iEnt, pev_origin, flVecOrigin);
new iMenu = menu_create(fmt("ORIG [%..1f %..1f %..1f]", flVecOrigin[0], flVecOrigin[1], flVecOrigin[2]), "_ent_orig_handler");
menu_additem(iMenu, "X-");
menu_additem(iMenu, "X+");
menu_additem(iMenu, "Y-");
menu_additem(iMenu, "Y+");
menu_additem(iMenu, "Z-");
menu_additem(iMenu, "Z+");
menu_display(pPlayer, iMenu);
}
}
public _ent_orig_handler(pPlayer, iMenu, iItem) {
menu_destroy(iMenu);
if(iItem == MENU_EXIT) {
return;
}
new const origAxis[] = { 0, 0, 1, 1, 2, 2 };
new const origValue[] = { -1, 1, -1, 1, -1, 1 };
new Float: flVecOrigin[3];
pev(g_iEnt, pev_origin, flVecOrigin);
flVecOrigin[origAxis[iItem]] += origValue[iItem];
set_pev(g_iEnt, pev_origin, flVecOrigin);
_ent_orig(pPlayer);
}
public _ent_rot(pPlayer) {
if(!pev_valid(g_iEnt)) {
client_print(pPlayer, print_center, "say /create");
}
else{
new Float: flVecAngles[3];
pev(g_iEnt, pev_angles, flVecAngles);
new iMenu = menu_create(fmt("ROT [%..1f %..1f %..1f]", flVecAngles[0], flVecAngles[1], flVecAngles[2]), "_ent_rot_handler");
menu_additem(iMenu, "X-");
menu_additem(iMenu, "X+");
menu_additem(iMenu, "Y-");
menu_additem(iMenu, "Y+");
menu_additem(iMenu, "Z-");
menu_additem(iMenu, "Z+");
menu_display(pPlayer, iMenu);
}
}
public _ent_rot_handler(pPlayer, iMenu, iItem) {
menu_destroy(iMenu);
if(iItem == MENU_EXIT) {
return;
}
new const origAxis[] = { 0, 0, 1, 1, 2, 2 };
new const origValue[] = { -1, 1, -1, 1, -1, 1 };
new Float: flVecAngles[3];
pev(g_iEnt, pev_angles, flVecAngles);
flVecAngles[origAxis[iItem]] += origValue[iItem];
set_pev(g_iEnt, pev_angles, flVecAngles);
_ent_rot(pPlayer);
}
public _ent_size(pPlayer, iMenuPage) {
if(!pev_valid(g_iEnt)) {
client_print(pPlayer, print_center, "say /create");
}
else{
new Float: flVecMins[3], Float: flVecMaxs[3];
pev(g_iEnt, pev_mins, flVecMins);
pev(g_iEnt, pev_maxs, flVecMaxs);
new iMenu = menu_create(fmt("[%..1f %..1f %..1f] [%..1f %..1f %..1f]", flVecMins[0], flVecMins[1], flVecMins[2], flVecMaxs[0], flVecMaxs[1], flVecMaxs[2]), "_ent_size_handler");
menu_additem(iMenu, "mins: X-");
menu_additem(iMenu, "mins: X+");
menu_additem(iMenu, "mins: Y-");
menu_additem(iMenu, "mins: Y+");
menu_additem(iMenu, "mins: Z-");
menu_additem(iMenu, "mins: Z+");
menu_addblank2(iMenu);
menu_additem(iMenu, "maxs: X-");
menu_additem(iMenu, "maxs: X+");
menu_additem(iMenu, "maxs: Y-");
menu_additem(iMenu, "maxs: Y+");
menu_additem(iMenu, "maxs: Z-");
menu_additem(iMenu, "maxs: Z+");
menu_display(pPlayer, iMenu, iMenuPage);
}
}
public _ent_size_handler(pPlayer, iMenu, iItem) {
switch(iItem) {
case 0..5: {
new const origAxis[] = { 0, 0, 1, 1, 2, 2 };
new const origValue[] = { -1, 1, -1, 1, -1, 1 };
new Float: flVecMins[3];
pev(g_iEnt, pev_mins, flVecMins);
if(iItem % 2 != 0) {
if(flVecMins[origAxis[iItem]] != 0) {
flVecMins[origAxis[iItem]] += origValue[iItem];
set_pev(g_iEnt, pev_mins, flVecMins);
}
}
else {
flVecMins[origAxis[iItem]] += origValue[iItem];
set_pev(g_iEnt, pev_mins, flVecMins);
}
_ent_size(pPlayer, 0);
}
case 7..12: {
new iSubItem = iItem - 7;
new const origAxis[] = { 0, 0, 1, 1, 2, 2 };
new const origValue[] = { -1, 1, -1, 1, -1, 1 };
new Float: flVecMaxs[3];
pev(g_iEnt, pev_maxs, flVecMaxs);
if(iSubItem % 2 == 0) {
if(flVecMaxs[origAxis[iSubItem]] != 0) {
flVecMaxs[origAxis[iSubItem]] += origValue[iSubItem];
set_pev(g_iEnt, pev_maxs, flVecMaxs);
}
}
else {
flVecMaxs[origAxis[iSubItem]] += origValue[iSubItem];
set_pev(g_iEnt, pev_maxs, flVecMaxs);
}
_ent_size(pPlayer, 1);
}
}
}
public _ent_reset(pPlayer) {
if(!pev_valid(g_iEnt)) {
client_print(pPlayer, print_center, "say /create");
}
else{
set_pev(g_iEnt, pev_angles, NULL_VECTOR);
set_pev(g_iEnt, pev_mins, NULL_VECTOR);
set_pev(g_iEnt, pev_maxs, NULL_VECTOR);
}
}
public CBasePlayer_PreThink(pPlayer) {
new Float: flGameTime = get_gametime();
static Float: flNextTime[MAX_PLAYERS+1];
if(flNextTime[pPlayer] > flGameTime) {
return;
}
flNextTime[pPlayer] = flGameTime + 0.1;
if(pev_valid(g_iEnt)) {
new Float: flVecOrigin[3];
pev(g_iEnt, pev_origin, flVecOrigin);
new Float: flVecMins[3];
pev(g_iEnt, pev_mins, flVecMins);
new Float: flVecMaxs[3];
pev(g_iEnt, pev_maxs, flVecMaxs);
xs_vec_add(flVecOrigin, flVecMins, flVecMins);
xs_vec_add(flVecOrigin, flVecMaxs, flVecMaxs);
message_begin(MSG_ONE, SVC_TEMPENTITY, .player = pPlayer);
write_byte(TE_BOX);
write_coord_f(flVecMins[0]);
write_coord_f(flVecMins[1]);
write_coord_f(flVecMins[2]);
write_coord_f(flVecMaxs[0]);
write_coord_f(flVecMaxs[1]);
write_coord_f(flVecMaxs[2]);
write_short(5);
write_byte(255);
write_byte(0);
write_byte(0);
message_end();
}
}
say /create - создать/переопределить координаты по взгляду
say /orig - управление координатами
say /rot - управление углами
say /size - управление размерами
say /reset - сброс углов, размеров.