AMX MOD X
Пятница, 26.04.2024, 19:50:50



Приветствую Вас Гость | RSS
[ Главная ] [ Вопрос новечка по созданию объекта. - AMX Mod X Форум ] [ Регистрация ] [ Вход ]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]

Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/

  • Страница 1 из 1
  • 1
Модератор форума: slogic, AlMod  
AMX Mod X Форум » Скриптинг » Помощь по скриптингу » Вопрос новечка по созданию объекта.
Вопрос новечка по созданию объекта.
ghomДата: Воскресенье, 08.11.2009, 00:53:31 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 3
Репутация: 0
Статус: Не в сети
Я никогда не писал плагины для контры и впринципе не собираюсь. Знаю си/си++ и метод научного тыка)
Мне нужно немного поправить уже готовый плагин.
Плагин создаёт модельку на карте, моя цель её повернуть под нужным углом.
Я пытался сделать это так
entity_set_vector(entbase, EV_VEC_angles, a) (a вектор с углами поворота)
модель поворачивается, но физическая модель нет(задавал её с помощью entity_set_size(entbase, mins, maxs))
Щас я уже забил на полноценный поворот и решил сделать 2 положения по осям.
Я сумел совместьть область столкновения с облостью модельки при повороте на 90 градусов, но с областью для стрельбы творится какаято жопа.
Подскажите как это сделать.
 
KokaДата: Воскресенье, 08.11.2009, 01:51:56 | Сообщение # 2
Полковник
Группа: Пользователи
Сообщений: 169
Репутация: 1
Статус: Не в сети
сморя для чего ето нужно, если вообще нужно, достаточно "видимости" модели что она смотрит в нужном вам направлении через set_pev(ent, pev_angles, Float:{ .., .., .. })

стал ощущать рефлексы тоньше, оставаясь как всегда с идеей той же...
 
ghomДата: Воскресенье, 08.11.2009, 03:08:11 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 3
Репутация: 0
Статус: Не в сети
нужно чтоб её было видно(эт я сам уже сумел сделать)и чтоб по ней можно было нормально стрелять и ходить.
До поворота с объектом всё норм.
После модель поворачивается зона стрельбы тоже, часть , отвечающая за столкновение нет. В итоге пуля поподает в модель, только если пролетает через физические части модели до поворота и после.


Сообщение отредактировал ghom - Воскресенье, 08.11.2009, 03:15:14
 
KokaДата: Воскресенье, 08.11.2009, 18:22:10 | Сообщение # 4
Полковник
Группа: Пользователи
Сообщений: 169
Репутация: 1
Статус: Не в сети
чтобы по ней можно было ходить "не дергаясь" надо правельно указать размеры entity, а если entity поворачивать, соответственно поворачивается и её box (по идее), если box неповорачивается, нужно писать большие вычисления... вроде при повороте entity, hl1 engine сама поворачивает box. А стрельбу ловить через touch forward (если она особенная (стрельба)) либо просто указать health у entity.

стал ощущать рефлексы тоньше, оставаясь как всегда с идеей той же...
 
ghomДата: Воскресенье, 08.11.2009, 19:53:11 | Сообщение # 5
Рядовой
Группа: Пользователи
Сообщений: 3
Репутация: 0
Статус: Не в сети
А что значит правильно указать размеры, я создаю коробку, наврятли я ошибся с её координатами, но при прыжке на неё я всёравно дёргаюь.
Расчитать координаты вершин для меня не проблема, но то как их задать для модели я хз. У тя нет случайно примера создания полноценного объекта.
 
AnOrangeJuiceДата: Понедельник, 09.11.2009, 17:59:06 | Сообщение # 6
Лейтенант
Группа: Пользователи
Сообщений: 62
Репутация: 2
Статус: Не в сети
вот ladder maker, мб чем-нибудь поможет
Code
/* thx for Exolent and xpaw for making their ladders */

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <fakemeta_util>

#define ADMIN_LADDER    ADMIN_BAN

enum (+= 1000)
{
  TASK_ID_MOVE = 1000,
  TASK_ID_CHECK
};

enum _:Angles
{
  ANGLE_VERT1,
  ANGLE_VERT2,
  ANGLE_HORIZ
};

new const LADDER_CLASS[] =  "ladder";

#define MODEL "models/blockmaker/bm_block_default.mdl"  

// ladder dimensions  
new Float:gLadderMinY[3] = {-32.0,-4.0,-32.0};  
new Float:gLadderMaxY[3] = { 32.0, 4.0, 32.0};  

new bool:gOnLadder[33];  

#define IsFakeLadder(%1) fm_is_ent_classname(%1, LADDER_CLASS)

new const Float:LADDER_MINS[Angles][3] =
{
  { -4.0, -32.0, -32.0},
  {-32.0,  -4.0, -32.0},
  {-32.0, -32.0,  -4.0}
};

new const Float:LADDER_MAXS[Angles][3] =
{
  {  4.0,  32.0,  32.0},
  { 32.0,   4.0,  32.0},
  { 32.0,  32.0,   4.0}
};

new const Float:LADDER_ANGLES[Angles][3] =
{
  { 90.0,   0.0,   0.0},
  { 90.0,   0.0,  90.0},
  {  0.0,   0.0,   0.0}
};

new g_ladder_file[64];

new bool:g_snapping[33];
new Float:g_move_dist[33];
new Float:g_move_offset[33][3];

public plugin_precache()
{
  precache_model(MODEL);
}

public plugin_init()
{
  register_plugin("Ladder Maker", "1.0", "Juice");
   
  register_clcmd("say /ladder", "CmdLadder");
   
  register_clcmd("+move_ladder", "CmdStartMove");
  register_clcmd("-move_ladder", "CmdStopMove");
   
  register_forward(FM_Touch, "FwdTouch");
  register_forward(FM_PlayerPreThink, "FwdPlayerPreThink");
   
  get_datadir(g_ladder_file, sizeof(g_ladder_file) - 1);
  add(g_ladder_file, sizeof(g_ladder_file) - 1, "/laddermaker");
   
  if( !dir_exists(g_ladder_file) )
  {
   mkdir(g_ladder_file);
  }
   
  new mapname[64];
  get_mapname(mapname, sizeof(mapname) - 1);
  strtolower(mapname);
   
  format(g_ladder_file, sizeof(g_ladder_file) - 1, "%s/%s.txt", g_ladder_file, mapname);
   
  Load(false);
}

public client_connect(client)
{
  g_snapping[client] = true;
}

public client_disconnect(client)
{
  remove_task(client + TASK_ID_MOVE);
}

public CmdLadder(client)
{
  ShowLadderMenu(client);
   
  return PLUGIN_HANDLED;
}

public CmdStartMove(client)
{
  if( !access(client, ADMIN_LADDER) ) return PLUGIN_HANDLED;
   
  new taskid = client + TASK_ID_MOVE;
  if( task_exists(taskid) ) return PLUGIN_HANDLED;
   
  new ent, body;
  g_move_dist[client] = get_user_aiming(client, ent, body);
   
  if( IsFakeLadder(ent) )
  {
   new Float:aim_origin[3];
   fm_get_aim_origin(client, aim_origin);
    
   pev(ent, pev_origin, g_move_offset[client]);
    
   xs_vec_sub(g_move_offset[client], aim_origin, g_move_offset[client]);
    
   new params[2];
   params[0] = ent;
   set_task(0.1, "TaskMoveLadder", taskid, params, 2, "b");
  }
   
  return PLUGIN_HANDLED;
}

public CmdStopMove(client)
{
  if( !access(client, ADMIN_LADDER) ) return PLUGIN_HANDLED;
   
  remove_task(client + TASK_ID_MOVE);
   
  return PLUGIN_HANDLED;
}

public FwdTouch(ent, id) {  
     if (is_user_alive(id) && isLadder(ent)) {  
         set_pev(id, pev_movetype, MOVETYPE_FLY);  
           
         gOnLadder[id] = true;  
           
         // Velocity way  
         new Float:velocity[3];  
         pev(id, pev_velocity, velocity);  
           
         if ( ( pev(id, pev_button ) & IN_FORWARD || IN_BACK || IN_LEFT || IN_RIGHT ) && (velocity[0] == 0.0 || velocity[1] == 0.0) ) {  
             velocity[2] = 250.0;  
             set_pev(id, pev_velocity, velocity);  
         }  
           
     }  
}  

public FwdPlayerPreThink( id ) {  
  if ( is_user_alive( id ) ) {  
   if( gOnLadder[ id ] ) {  
   new Float:velocity[ 3 ];  
   pev(id, pev_velocity, velocity);  

   if ( ( pev( id, pev_button ) & IN_FORWARD || IN_BACK || IN_LEFT || IN_RIGHT ) && ( velocity[ 0 ] == 0.0 || velocity[ 1 ] == 0.0 ) ) {  
    velocity[2] = 250.0;  
    set_pev(id, pev_velocity, velocity);  
   }

   gOnLadder[id] = false;  
   }  
           
   new ent, body;  
   get_user_aiming(id, ent, body, 320);  
  }  
}  

#if defined USE_TASK
public TaskRemoveLadder(client)
{
  g_ladder_ent[client - TASK_ID_CHECK] = 0;
}
#endif

public TaskMoveLadder(params[], taskid)
{
  new ent = params[0];
   
  if( !pev_valid(ent) )
  {
   remove_task(taskid);
   return;
  }
   
  new client = taskid - TASK_ID_MOVE;
   
  new Float:head_origin[3], Float:aim_origin[3];
  engfunc(EngFunc_GetBonePosition, client, 8, head_origin, aim_origin);
  fm_get_aim_origin(client, aim_origin);
   
  new Float:ent_origin[3];
  xs_vec_sub(aim_origin, head_origin, ent_origin);
  xs_vec_normalize(ent_origin, ent_origin);
  xs_vec_mul_scalar(ent_origin, g_move_dist[client], ent_origin);
  xs_vec_add(ent_origin, head_origin, ent_origin);
  xs_vec_add(ent_origin, g_move_offset[client], ent_origin);
  ent_origin[2] = float(floatround(ent_origin[2], floatround_floor));
   
  if( g_snapping[client] )
  {
   new Float:start[3], Float:end[3], Float:ret[3];
    
   new Float:mins[3], Float:maxs[3];
   pev(ent, pev_mins, mins);
   pev(ent, pev_maxs, maxs);
    
   new Float:dist, Float:closestDist = 9999.9;
   new trace, closestEnt;
    
   new side;
    
   for( new i = 0; i < 6; i++ )
   {
    xs_vec_copy(ent_origin, start);
     
    start[i / 2] += ((i % 2) == 0) ? mins[i / 2] : maxs[i / 2];
     
    xs_vec_copy(start, end);
     
    end[i / 2] += ((i % 2) == 0) ? -10 : 10;
     
    trace = fm_trace_line(ent, start, end, ret);
     
    if( IsFakeLadder(trace) )
    {
     dist = get_distance_f(start, ret);
     if( dist < closestDist )
     {
      closestDist = dist;
      closestEnt = trace;
       
      side = i;
     }
    }
   }
    
   if( closestEnt )
   {
    pev(closestEnt, pev_origin, ent_origin);
    pev(closestEnt, pev_mins, start);
    pev(closestEnt, pev_maxs, end);
     
    ent_origin[side / 2] += ((side % 2) == 0) ? (end[side / 2] + maxs[side / 2]) : (start[side / 2] + mins[side / 2]);
   }
  }
   
  engfunc(EngFunc_SetOrigin, ent, ent_origin);
  SetRotation(ent, GetLadderAngle(ent));
}

ShowLadderMenu(client)
{
  new menu = menu_create("Ladder Menu", "MenuLadder");
   
  menu_additem(menu, "Create Ladder", "1", ADMIN_LADDER);
  menu_additem(menu, "Delete Ladder", "2", ADMIN_LADDER);
  menu_additem(menu, "Rotate Ladder^n", "3", ADMIN_LADDER);
  menu_additem(menu, "Move Menu", "4", ADMIN_LADDER);
  menu_additem(menu, "Save Menu", "5", ADMIN_LADDER);
   
  menu_display(client, menu);
}

public MenuLadder(client, menu, item)
{
  if( item == MENU_EXIT )
  {
   menu_destroy(menu);
   return;
  }
   
  new _access, info[2], callback;
  menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
  menu_destroy(menu);
   
  switch( str_to_num(info) )
  {
   case 1:
   {
    if (get_user_flags(client) & ADMIN_LADDER) {  
    new Float:vOrigin[3];  
    new origin[3];  
           
    //get the origin of the player and add Z offset  
    get_user_origin(client, origin, 3);  
    IVecFVec(origin, vOrigin);  
    vOrigin[2] += 4.0;  
    
    CreateLadder( vOrigin );  
  }  
   }
   case 2:
   {
    if (get_user_flags(client) & ADMIN_LADDER) {  
    new ent, body;  
    get_user_aiming(client, ent, body);  
    
    if (isLadder(ent)) {  
    fm_remove_entity(ent);   
    }  
   }  
   }
   case 3:
   {
    new ent = fm_get_aim_ent(client);
    if( ent && IsFakeLadder(ent) )
    {
     SetRotation(ent, (GetLadderAngle(ent) + 1) % Angles);
    }
    else
    {
     client_print(client, print_chat, "[HB] Failed to find the fake ladder entity.");
    }
   }
   case 4:
   {
    ShowMoveMenu(client);
    return;
   }
   case 5:
   {
    ShowSaveMenu(client);
    return;
   }
  }
   
  ShowLadderMenu(client);
}

ShowMoveMenu(client)
{
  new menu = menu_create("Move Menu", "MenuMove");
   
  menu_additem(menu, g_snapping[client] ? "Snapping: \yOn^n" : "Snapping: \rOff^n", "1", ADMIN_LADDER);
  menu_additem(menu, "Move X+", "2", ADMIN_LADDER);
  menu_additem(menu, "Move X-", "3", ADMIN_LADDER);
  menu_additem(menu, "Move Y+", "4", ADMIN_LADDER);
  menu_additem(menu, "Move Y-", "5", ADMIN_LADDER);
  menu_additem(menu, "Move Z+", "6", ADMIN_LADDER);
  menu_additem(menu, "Move Z-", "7", ADMIN_LADDER);
   
  menu_setprop(menu, MPROP_EXITNAME, "Ladder Menu");
   
  menu_display(client, menu);
}

public MenuMove(client, menu, item)
{
  if( item == MENU_EXIT )
  {
   menu_destroy(menu);
   ShowLadderMenu(client);
   return;
  }
   
  new _access, info[2], callback;
  menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
  menu_destroy(menu);
   
  new num = str_to_num(info);
  if( num == 1 )
  {
   g_snapping[client] = !g_snapping[client];
  }
  else
  {
   num -= 2;
    
   new ent = fm_get_aim_ent(client);
   if( ent && IsFakeLadder(ent) )
   {
    new Float:origin[3];
    pev(ent, pev_origin, origin);
     
    origin[num / 2] += ((num % 2) == 0) ? 1 : -1;
     
    set_pev(ent, pev_origin, origin);
   }
  }
   
  ShowMoveMenu(client);
}

ShowSaveMenu(client)
{
  new menu = menu_create("Save Menu", "MenuSave");
   
  menu_additem(menu, "Save All Ladders", "1", ADMIN_LADDER);
  menu_additem(menu, "Load Saved Ladders", "2", ADMIN_LADDER);
  menu_additem(menu, "Delete All Ladders", "3", ADMIN_LADDER);
   
  menu_setprop(menu, MPROP_EXITNAME, "Ladder Menu");
   
  menu_display(client, menu);
}

public MenuSave(client, menu, item)
{
  if( item == MENU_EXIT )
  {
   menu_destroy(menu);
   ShowLadderMenu(client);
   return;
  }
   
  new _access, info[2], callback;
  menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
  menu_destroy(menu);
   
  switch( str_to_num(info) )
  {
   case 1:
   {
    Save();
    new name[32];
    get_user_name(client, name, sizeof(name) - 1);
    client_print(0, print_chat, "[HB] %s saved all of the fake ladders!", name);
   }
   case 2:
   {
    Load(true);
   }
   case 3:
   {
    new ent = -1;
    while( (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", LADDER_CLASS)) )
    {
     engfunc(EngFunc_RemoveEntity, ent);
    }
     
    new name[32];
    get_user_name(client, name, sizeof(name) - 1);
    client_print(0, print_chat, "[HB] %s deleted all of the fake ladders!", name);
   }
  }
   
  ShowSaveMenu(client);
}

CreateLadder( Float:vOrigin[3] ) {  
  new ent = fm_create_entity( "info_target" );  
       
  if ( fm_is_valid_ent( ent ) )  
  {  
   set_pev( ent, pev_classname, "ladder" );  
   set_pev( ent, pev_solid, SOLID_BBOX );  
   set_pev( ent, pev_movetype, MOVETYPE_NONE );  
           
   new Float:vSizeMin[ 3 ];  
   new Float:vSizeMax[ 3 ];  
   new Float:vAngles[ 3 ];  

   vSizeMin = gLadderMinY;  
   vSizeMax = gLadderMaxY;  
   vAngles[ 0 ] = 90.0;  
   vAngles[ 2 ] = 90.0;  
           
   //adjust size min/max vectors depending on scale  
   for (new i = 0; i < 3; ++i) {  
   if ( vSizeMin[ i ] != 4.0 && vSizeMin[i] != -4.0 )  
    vSizeMin[ i ] *= 1.0;  

   if ( vSizeMax[ i ] != 4.0 && vSizeMax[i] != -4.0 )  
    vSizeMax[ i ] *= 1.0;  
  }  
   fm_entity_set_model( ent, MODEL );  
   set_pev( ent, pev_angles, vAngles );  
   fm_entity_set_size( ent, vSizeMin, vSizeMax );  
   fm_entity_set_origin( ent, vOrigin );  
           
   return ent;  
  }  
  return 0;  
}  

SetRotation(ent, angle)
{
  set_pev(ent, pev_angles, LADDER_ANGLES[angle]);
  engfunc(EngFunc_SetSize, ent, LADDER_MINS[angle], LADDER_MAXS[angle]);
}

GetLadderAngle(ent)
{
  new Float:angles[3];
  pev(ent, pev_angles, angles);
   
  for( new angle = 0; angle < Angles; angle++ )
  {
   if( xs_vec_equal(LADDER_ANGLES[angle], angles) )
   {
    return angle;
   }
  }
   
  return 0; // should never happen, but use 0 so "index out of bounds" doesnt occur
}

Load(bool:deleteall)
{
  if( deleteall )
  {
   new ent = -1;
   while( (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", LADDER_CLASS)) )
   {
    engfunc(EngFunc_RemoveEntity, ent);
   }
  }
   
  if( !file_exists(g_ladder_file) ) return -1;
   
  new count;
   
  new f = fopen(g_ladder_file, "rt");
   
  new data[64];
  new origin[3][16];
  new Float:_origin[3];
  new angle[2];
  new ent;
   
  while( !feof(f) )
  {
   fgets(f, data, sizeof(data) - 1);
   if( !data[0] ) continue;
    
   parse(data,\
    origin[0], sizeof(origin[]) - 1,\
    origin[1], sizeof(origin[]) - 1,\
    origin[2], sizeof(origin[]) - 1,\
    angle, sizeof(angle) - 1
    );
    
   for( new i = 0; i < 3; i++ )
   {
    _origin[i] = str_to_float(origin[i]);
   }
    
   ent = CreateLadder(_origin);
   if( ent )
   {
    SetRotation(ent, str_to_num(angle));
     
    count++;
   }
  }
   
  fclose(f);
   
  return count;
}

Save()
{
  new f = fopen(g_ladder_file, "wt");
   
  new Float:origin[3];
   
  new ent = -1;
  while( (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", LADDER_CLASS)) )
  {
   pev(ent, pev_origin, origin);
    
   fprintf(f, "%f %f %f %i^n",\
    origin[0],\
    origin[1],\
    origin[2],\
    GetLadderAngle(ent)
    );
  }
   
  fclose(f);
}

// modified fm_get_aim_origin
stock fm_get_aim_ent(index) {
  new Float:start[3], Float:view_ofs[3]
  pev(index, pev_origin, start)
  pev(index, pev_view_ofs, view_ofs)
  xs_vec_add(start, view_ofs, start)

  new Float:dest[3]
  pev(index, pev_v_angle, dest)
  engfunc(EngFunc_MakeVectors, dest)
  global_get(glb_v_forward, dest)
  xs_vec_mul_scalar(dest, 9999.0, dest)
  xs_vec_add(start, dest, dest)

  engfunc(EngFunc_TraceLine, start, dest, 0, index, 0)
   
  new ent = get_tr2(0, TR_pHit);
  return pev_valid(ent) ? ent : 0;
}

bool:isLadder(ent) {  
  if (fm_is_valid_ent(ent)) {  
   new szClassname[32];  
   pev(ent, pev_classname, szClassname, 32);  
           
   if (equal(szClassname, "ladder"))  
   return true;  
  }  
  return false;  
}
 
defaultNick8433Дата: Понедельник, 09.11.2009, 19:51:12 | Сообщение # 7
Генерал-полковник
Группа: Скриптеры
Сообщений: 806
Репутация: 19
Статус: Не в сети
Quote (AnOrangeJuice)
вот ladder maker, мб чем-нибудь поможет

Это вобще здесь не причём,написано же,что проблема в области стрельбы


Раскручиваю сайты,ставлю трекера на хостинг.Всё бесплатно.Если заинтересовало,то моя аська 400538001
 
AnOrangeJuiceДата: Вторник, 10.11.2009, 03:46:01 | Сообщение # 8
Лейтенант
Группа: Пользователи
Сообщений: 62
Репутация: 2
Статус: Не в сети
OK
 
AMX Mod X Форум » Скриптинг » Помощь по скриптингу » Вопрос новечка по созданию объекта.
  • Страница 1 из 1
  • 1
Поиск:

AMX Mod X Russian Community © 2006-2024