Создание/Поиск объектов (entity)
| |
_wS_
|
Дата: Пятница, 13.01.2012, 09:44:51 | Сообщение # 1 |
|
Каждая карта состоит из множества объектов (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);
|
|
| |
Санчоус
|
Дата: Среда, 08.08.2012, 03:00:24 | Сообщение # 2 |
|
Сообщений: 1
Репутация: 0 [ +/- ]
|
|
Скажите пожалуйста, как сделать чтобы энтити удалялось не у всех а выборочно?
Code new Kills[MAXPLAYERS+1];
public OnPluginStart() { HookEvent("player_spawn", player_spawn); HookEvent("player_death", player_death); }
public Action:Command_Trail(client) { CreateTimer(10.0, Kill_Effects, client); дальше спавн трейла }
public Action:Kill_Effects(Handle:timer, any:client) { new index = -1; while ((index = FindEntityByClassname(index, "env_spritetrail")) > 0) { AcceptEntityInput(index, "Kill"); // вот здесь он убивает все трейлы } }
public player_spawn(Handle:event, const String:name[], bool:dontBroadcast) { new client = GetClientOfUserId(GetEventInt(event, "userid")); CreateTimer(0.1, Kill_Effects, client); }
public player_death(Handle:event, const String:name[], bool:dontBroadcast) { new h_attacker = GetClientOfUserId(GetEventInt(event, "attacker")); if (h_attacker > 0 && GetClientTeam(h_attacker) != GetClientTeam(h_victim)) { Kills[h_attacker] += 1; } if (Kills[h_attacker] == 3) { Command_Trail(h_attacker); } }
*** Кое-что вырезал Если сделать 3 кила вызывается трейл на 10 секунд. После смерти трейл остается, мне его нужно убрать, для этого делаю CreateTimer(0.1, Kill_Effects, client) - это работает, но трейлы убираются все, то есть убитый тобой человек вызовет этот таймер и убъет сразу тебе трейл. Как сделать чтобы убиралось только на том, кого убили? =) Набыдлокодил, конечно, но, надеюсь, понятно объяснил - хочу научиться, активно читаю тут уроки. Помогите исправить, пожалуйста!
Сообщение отредактировал Санчоус - Среда, 08.08.2012, 03:02:00 |
|
| |
_wS_
|
Дата: Среда, 08.08.2012, 03:54:16 | Сообщение # 3 |
|
Сохраняй индекс trail'а игрока в глобальной переменной. И когда он умирает, покидает сервер, переходит в spec - убивай его trail.
Code new MyTrail[MAXPLAYERS+1];
new index = CreateEntityByName("env_spritetrail"); // ....... MyTrail[client] = index;
player_spawn { MyTrail[client] = 0; } Хотя может есть и проще вариант. Например, сделать родителем (parent) trail'а нож игрока, чтобы нож удалялся вместе с trail'ом - вроде нож убивается в случае смерти/выхода/перехода в спек и тд - нужно тестировать.
|
|
| |
Naykon
|
Дата: Вторник, 09.10.2012, 19:47:13 | Сообщение # 4 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
А можно на карте без зоны покупак создать зону покупок???
|
|
| |
scorpion2904
|
Дата: Суббота, 17.11.2012, 10:48:12 | Сообщение # 5 |
|
Сообщений: 68
Репутация: 5 [ +/- ]
|
|
А можно сделать, чтобы объект исчезал при нажатии на него?
|
|
| |
Nailain
|
Дата: Четверг, 14.02.2013, 13:44:41 | Сообщение # 6 |
|
Сообщений: 19
Репутация: 1 [ +/- ]
|
|
А как найти индекс объекта не по classname а по его имени?
Сообщение отредактировал Nailain - Четверг, 14.02.2013, 13:45:31 |
|
| |
king(rus)
|
Дата: Понедельник, 04.11.2013, 16:19:56 | Сообщение # 7 |
|
Сообщений: 109
Репутация: 2 [ +/- ]
|
|
_wS_, как на счет того, чтоб вводя 1, мог создавать предмет, допустим props/cs_office/vending_machine.mdl?
|
|
| |
dron216
|
Дата: Четверг, 23.01.2014, 18:57:40 | Сообщение # 8 |
|
Сообщений: 151
Репутация: 18 [ +/- ]
|
|
Цитата Nailain ( ) А как найти индекс объекта не по classname а по его имени? Знает кто? Тоже интересует этот вопрос...
|
|
| |
tolik1231
|
Дата: Пятница, 13.01.2017, 12:54:58 | Сообщение # 9 |
|
Сообщений: 71
Репутация: -1 [ +/- ]
|
|
CreateEntityByName("info_particle_system"); - пожалуйста расскажите поподробней по этому Обьекту.
|
|
| |
|