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);
|
|
| |