[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Форум » Уроки SourceMod (SourcePawn) Скриптинга » Создание/Поиск объектов (entity) (Взято с world-source.ru)
Создание/Поиск объектов (entity)
rootДата: Воскресенье, 03.02.2013, 00:10 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 561
Статус: Offline
Каждая карта состоит из множества объектов (entity), многие из которых можно изменять/добавлять/удалять. 
Информацию о многих объектах можете найти здесь: 

https://developer.valvesoftware.com/wiki/Category:Entities 

Например, func_buyzone, weapon_awp, player, env_beam - всё это объекты, их довольно много. У каждого из них есть свои параметры, подробнее узнать о которых вы можете благодаря этим ссылкам: 

http://world-source.ru/datamaps.txt 
http://world-source.ru/netprops.txt 

Пример создания weapon_awp

Код
#include <sourcemod>  
#include <sdktools>  

new Float:wS_Pos[3];  

public OnPluginStart()  
{  
      HookEvent("player_say", player_say);  
}  

public player_say(Handle:event, const String:name[], bool:dontBroadcast)  
{  
      new client = GetClientOfUserId(GetEventInt(event, "userid"));  
      decl String:f[5];  
      GetEventString(event, "text", f, 5);  
      if (StrEqual(f, "1"))  
      {  
         GetClientAbsOrigin(client, wS_Pos);  
         wS_Pos[2] += 55.0;  
         PrintToChat(client, "Координаты получены. Введите 2 чтобы создать awp.");  
      }  
      else if (StrEqual(f, "2")) CreateEnt();  
}  

CreateEnt()  
{  
      new index = CreateEntityByName("weapon_awp");  
      if (index < 1)  
      {  
         LogError("Ошибка при создании weapon_awp");  
         return;  
      }  
      DispatchKeyValueVector(index, "origin", wS_Pos);  
      DispatchKeyValue(index, "spawnflags", "1");  
      DispatchSpawn(index);  
}

Сначала введите в чат 1, чтобы сохранить позицию, затем отойдите и введите 2, чтобы создать awp. 
spawnflags - флаги. Перейдите по ЭТОЙ ссылке и найдите 'Flags'. Вот что там: 

Код
1 : Start Constrained     
Prevents the model from moving.

Это значит, что если установить флаг 1, то awp не будет двигаться. Часто есть несколько флагов у объектов и бывает нужно установить несколько сразу. Для это нужно просто сложить числа нужных вам флагов. 

Если вы знаете, что на карте есть только 1 какой-либо объект, и вы хотите узнать его индекс, то вам поможет команда FindEntityByClassname, которая может найти индекс по classname объекта. Например, после установки бомбы это уже не weapon_c4, а planted_c4, вот как легко можно получить индекс: 

Код
new index = FindEntityByClassname(-1, "planted_c4");

Если индекс не был получен, то будет возвращено -1 (просто делайте проверку, если index > 0, значит это то, что нужно). 

С этим разобрались. Но часто объект на карте не один и нам нужен только какой-то конкретный - тут опять поможет данная команда, но использовать ее уже будем немного по-другому. Например, ищем func_buyzone: 

Код
new index = -1;  
while ((index = FindEntityByClassname(index, "func_buyzone")) > 0)  
{  
      PrintToServer("Найден индекс: %d", index);  
}

FindEntityByClassname(index - это индекс объекта, после которого будем искать func_buyzone. 
Чтобы начать поиск с самого начала, пишут -1 (0 это worldspawn). 

CreateEntityByName(const String:classname[], ForceEdictIndex=-1); 

Создаёт объект (но не рождает, см. DispatchSpawn) и возвращает его индекс, или -1, если не удалось создать. 
ForceEdictIndex - индекс, который будет у этого объекта (игнорируется в Orangebox). 

bool:DispatchKeyValue(entity, const String:keyName[], const String:value[]); 
Настройка параметров объекта, например, origin и angles (у всех), BoltWidth и Radius у env_beam (см. datamaps.txt) 

bool:DispatchKeyValueFloat(entity, const String:keyName[], Float:value); 
То же самое, только устанавливаемое значение это Float 

bool:DispatchKeyValueVector(entity, const String:keyName[], const Float:vector[3]); 
Устанавливает вектор 

bool:DispatchSpawn(entity_index); - создает (оживляет) объект на карте в origin позиции. 
ActivateEntity(entity_index); - активация (CBaseAnimating :: Activate) 

SetEntityModel(entity, const String:model[]); - установить модель. 
Указывается полный путь models/...mdl, но перед этим, модель должна быть кэширована - обычно в OnMapStart(). 

Код
PrecacheModel("models/...mdl", true);
 
Форум » Форум » Уроки SourceMod (SourcePawn) Скриптинга » Создание/Поиск объектов (entity) (Взято с world-source.ru)
  • Страница 1 из 1
  • 1
Поиск: