Вот и у игровых объектов тоже есть размер, руками мы его конечно пощупать не можем, но разработчики игры постарались, что бы создать хоть какую то реалистичность объемных объектов. Что бы мы могли на них запрыгнуть или упереться ( в рамках игрового мира разумеется)
Инфо из engine.inc:
/* Set entity bounds. */
native entity_set_size(index, const Float:mins[3], const Float:maxs[3]);
Синтаксис:
entity_set_size ( index, Float:mins[3], Float:maxs[3] )
- index - id объекта
- Float:mins[3] - Минимальный размер
- Float:maxs[3] - Максимальный размер
Это дословный перевод, но что бы вам было понятней, представьте себе как вы рисуете объемный прямоугольник или куб в пространстве, вот это и есть минимальный и максимальные координаты. Могу и ошибаться в своих суждениях.
Тип функции:
Native
Пример:
entity_set_size(Ent,Float:{0.0,0.0,0.0},Float:{30.0,30.0,30.0})
Описание:
Так как эта функция сама по себе не особо интересная, писать для нее целый пример я не стал.
Можете посмотреть пример кода здесь:http://amxmodx.su/forum/viewtopic.php?p=2796#p2796
С помощью этого плагина вы будите видеть как изменяется размер объекта. очень наглядный плагин.
Код плагина от PomanoB
Наглядно показывающий работу функции размера
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <hamsandwich>
#include <xs>
#define PLUGIN "DeathRun Zone Creating"
#define VERSION "0.1.0"
#define AUTHOR "PomanoB"
new g_maxplayers
new g_confgisFile[64]
new g_point_entuty
new g_creating_menu, g_menu_move, g_menu_size
new g_creating
new g_touch[33]
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_forward(FM_Touch, "fwdTouch")
register_forward(FM_Think, "fwdThink")
register_clcmd("say /point", "cmdPoint", ADMIN_IMMUNITY, " - display create point menu")
register_event("HLTV", "roundStart", "a", "1=0", "2=0")
g_maxplayers = get_maxplayers()
g_creating_menu = menu_create("Create Point", "creatingMenu")
menu_additem(g_creating_menu, "Move", "1")
menu_additem(g_creating_menu, "Size", "2")
menu_additem(g_creating_menu, "Save", "3")
menu_additem(g_creating_menu, "Delete", "4")
g_menu_move = menu_create("Move Point", "menuMove")
menu_additem(g_menu_move, "X->", "1")
menu_additem(g_menu_move, "<-X", "2")
menu_additem(g_menu_move, "Y->", "3")
menu_additem(g_menu_move, "<-Y", "4")
menu_additem(g_menu_move, "Z->", "5")
menu_additem(g_menu_move, "<-Z", "6")
menu_addblank(g_menu_move)
menu_addblank(g_menu_move)
menu_addblank(g_menu_move)
menu_additem(g_menu_move, "Main menu", "0")
menu_setprop(g_menu_move, MPROP_EXIT, MEXIT_NEVER)
g_menu_size = menu_create("Size Point", "menuSize")
menu_additem(g_menu_size, "<-X->", "1")
menu_additem(g_menu_size, "->X<-", "2")
menu_additem(g_menu_size, "<-Y->", "3")
menu_additem(g_menu_size, "->Y<-", "4")
menu_additem(g_menu_size, "<-Z->", "5")
menu_additem(g_menu_size, "->Z<-", "6")
menu_addblank(g_menu_size)
menu_addblank(g_menu_size)
menu_addblank(g_menu_size)
menu_additem(g_menu_size, "Main menu", "0")
menu_setprop(g_menu_size, MPROP_EXIT, MEXIT_NEVER)
}
public plugin_precache()
{
get_configsdir(g_confgisFile, 63)
add(g_confgisFile, 63, "/koth/")
if (!dir_exists(g_confgisFile))
mkdir(g_confgisFile)
new temp[64]
get_mapname(temp, 63)
format(g_confgisFile, 63, "%s/%s.ini", g_confgisFile, temp)
new Float:origin[3], Float:mins[3], model[64]
if (file_exists(g_confgisFile))
{
new file = fopen(g_confgisFile, "rt")
if (file)
{
while (!feof(file))
{
fgets(file, temp, 63)
new buff[3][64], key[10]
parse(temp, key, 9, buff[0], 63, buff[1], 63, buff[2], 63)
if (equal(key, "ORIGIN"))
{
origin[0] = str_to_float(buff[0])
origin[1] = str_to_float(buff[1])
origin[2] = str_to_float(buff[2])
}
else
if (equal(key, "MINS"))
{
mins[0] = str_to_float(buff[0])
mins[1] = str_to_float(buff[1])
mins[2] = str_to_float(buff[2])
}
else
if (equal(key, "MODEL"))
copy(model, 63, buff[0])
}
fclose(file)
g_point_entuty = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
dllfunc(DLLFunc_Spawn, g_point_entuty)
set_pev(g_point_entuty, pev_solid, SOLID_TRIGGER)
set_pev(g_point_entuty, pev_movetype, MOVETYPE_FLY)
if (model[0])
{
precache_model(model)
engfunc(EngFunc_SetModel, g_point_entuty, model)
}
set_pev(g_point_entuty, pev_maxs, mins)
mins[0] = -mins[0]
mins[1] = -mins[1]
mins[2] = -mins[2]
set_pev(g_point_entuty, pev_mins, mins)
engfunc(EngFunc_SetOrigin, g_point_entuty, origin)
set_pev(g_point_entuty, pev_nextthink, get_gametime() + 0.1)
}
}
}
public fwdTouch(ent, id)
{
if (!id || id > g_maxplayers || !g_point_entuty || ent != g_point_entuty || g_touch[id])
return
g_touch[id] = 1
}
public cmdPoint(id, level, cid)
{
if (!cmd_access(id, level, cid, 1))
return PLUGIN_HANDLED
g_creating = id
if (!g_point_entuty)
{
new Float:origin[3]
pev(id, pev_origin, origin)
g_point_entuty = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
dllfunc(DLLFunc_Spawn, g_point_entuty)
set_pev(g_point_entuty, pev_solid, SOLID_BBOX)
set_pev(g_point_entuty, pev_movetype, MOVETYPE_FLY)
set_pev(g_point_entuty, pev_maxs, Float:{64.0, 64.0, 64.0})
set_pev(g_point_entuty, pev_mins, Float:{-64.0, -64.0, -64.0})
engfunc(EngFunc_SetOrigin, g_point_entuty, origin)
set_pev(g_point_entuty, pev_nextthink, get_gametime() + 0.1)
}
menu_display(id, g_creating_menu)
return PLUGIN_HANDLED
}
public fwdThink(ent)
{
if (ent == g_point_entuty)
{
if (g_creating)
{
static Float:mins[3], Float:origin[3], Float:maxs[3]
pev(ent, pev_origin, origin)
pev(ent, pev_mins, mins)
pev(ent, pev_maxs, maxs)
xs_vec_add(origin, mins, mins)
xs_vec_add(origin, maxs, maxs)
message_begin(MSG_ONE, SVC_TEMPENTITY, _, g_creating)
write_byte(TE_BOX)
engfunc(EngFunc_WriteCoord, mins[0])
engfunc(EngFunc_WriteCoord, mins[1])
engfunc(EngFunc_WriteCoord, mins[2])
engfunc(EngFunc_WriteCoord, maxs[0])
engfunc(EngFunc_WriteCoord, maxs[1])
engfunc(EngFunc_WriteCoord, maxs[2])
write_short(1)
write_byte(255)
write_byte(0)
write_byte(0)
message_end()
}
set_pev(ent, pev_nextthink, get_gametime() + 0.1)
}
}
public client_disconnect(id)
{
if (id == g_creating)
g_creating = 0
}
public creatingMenu(id, menu, item)
{
if (g_creating != id)
return PLUGIN_HANDLED
if(item == MENU_EXIT)
{
g_creating = 0
return PLUGIN_HANDLED
}
new data[6]
new _access, value
menu_item_getinfo(menu, item, _access, data,5, _, _, value)
value = str_to_num(data)
switch(value)
{
case 1:
{
menu_display(id, g_menu_move)
return PLUGIN_HANDLED
}
case 2:
{
menu_display(id, g_menu_size)
return PLUGIN_HANDLED
}
case 3:
{
savePoint()
return PLUGIN_HANDLED
}
case 4:
{
deletePoint()
return PLUGIN_HANDLED
}
}
return PLUGIN_HANDLED
}
public menuMove(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_display(id, g_creating_menu)
return PLUGIN_HANDLED
}
new data[6]
new _access, value
menu_item_getinfo(menu, item, _access, data,5, _, _, value)
new Float:origin[3]
pev(g_point_entuty, pev_origin, origin)
value = str_to_num(data)
switch(value)
{
case 1:
{
origin[0] += 10.0
}
case 2:
{
origin[0] -= 10.0
}
case 3:
{
origin[1] += 10.0
}
case 4:
{
origin[1] -= 10.0
}
case 5:
{
origin[2] += 10.0
}
case 6:
{
origin[2] -= 10.0
}
}
set_pev(g_point_entuty, pev_origin, origin)
menu_display(id, g_menu_move)
return PLUGIN_HANDLED
}
public menuSize(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_display(id, g_creating_menu)
return PLUGIN_HANDLED
}
new data[6]
new _access, value
menu_item_getinfo(menu, item, _access, data,5, _, _, value)
new Float:maxs[3]
pev(g_point_entuty, pev_maxs, maxs)
value = str_to_num(data)
switch(value)
{
case 1:
{
maxs[0] += 10.0
}
case 2:
{
maxs[0] -= 10.0
}
case 3:
{
maxs[1] += 10.0
}
case 4:
{
maxs[1] -= 10.0
}
case 5:
{
maxs[2] += 10.0
}
case 6:
{
maxs[2] -= 10.0
}
}
set_pev(g_point_entuty, pev_maxs, maxs)
maxs[0] = -maxs[0]
maxs[1] = -maxs[1]
maxs[2] = -maxs[2]
set_pev(g_point_entuty, pev_mins, maxs)
menu_display(id, g_menu_size)
return PLUGIN_HANDLED
}
public savePoint()
{
delete_file(g_confgisFile)
new Float:vector[3], line[64]
pev(g_point_entuty, pev_origin, vector)
format(line, charsmax(line), "ORIGIN %d %d %d",
floatround(vector[0]),
floatround(vector[1]),
floatround(vector[2]))
write_file(g_confgisFile, line)
pev(g_point_entuty, pev_maxs, vector)
format(line, charsmax(line), "MINS %d %d %d",
floatround(vector[0]),
floatround(vector[1]),
floatround(vector[2]))
write_file(g_confgisFile, line)
}
public deletePoint()
{
g_point_entuty = 0
delete_file(g_confgisFile)
}
public roundStart()
{
arrayset(g_touch, 0, 33)
}