Плагином заменить все ентити func_ladder на func_detail

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
Приветствую всех еще раз.
Вопрос следует из заголовка темы, необходим плагин, который при запуске циклом проходит все ентити и меняет func_ladder на func_detail.
Буду рад помощи, очень надо)
 
Решение
Вот Вы говорите, что где-то давно на ам лежит туториал, я пробовал искать подобные темы в русском сегменте, но как понимаете не нашел.
Прошу реализовать это, чтобы самому понять как это чудо работает. И все также буду рад ссылочке темы на ам.
Я понимаю, что это сложно, но я попытаюсь объяснить.
У раздела в описании сказано следующее:
Обсуждение вопросов связанных с написанием плагинов и скриптов для amx, sm, es и других модов
Помощь с редактированием и созданием плагинов
Я бы сделал ударение на слово "Помощь". Это когда человек что-то пытается сам сделать и спрашивает в чем он ошибся. По сути этой темой нарушаются правила форума. Так как ты просишь вместо тебя что-то реализовать. Ведь ты не видишь смысла платить за это...

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
ну обходишь циклом через FindEntityByClassname, берешь mins/maxs у объекта и его позицию, создаешь нужный объект и текущий убиваешь.
 

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
ну обходишь циклом через FindEntityByClassname, берешь mins/maxs у объекта и его позицию, создаешь нужный объект и текущий убиваешь.
Буду рад, если кто-то это реализует плагином. Не совсем понимаю, что за mins/maxs, как мне убить и заново создать новый объект.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
C-подобный:
    GetEntPropVector(ent, Prop_Data, "m_vecMins", min);
    GetEntPropVector(ent, Prop_Data, "m_vecMaxs", max);
как мне убить и заново создать новый объект
C-подобный:
AcceptEntityInput(entity, "kill");
...
int ent = CreateEntityByName("func_detail");
...
DispatchSpawn(ent);
 

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
C-подобный:
    GetEntPropVector(ent, Prop_Data, "m_vecMins", min);
    GetEntPropVector(ent, Prop_Data, "m_vecMaxs", max);
C-подобный:
AcceptEntityInput(entity, "kill");
...
int ent = CreateEntityByName("func_detail");
...
DispatchSpawn(ent);
Спасибо, получается должно все быть так?:
PHP:
public void OnPluginStart()
{
    int ent = FindEntityByClassname(-1, "func_ladder");
    AcceptEntityInput(ent, "kill");
    DispatchSpawn(ent);
}
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
В этом разделе принято указывать на ошибки когда человек пытается что-либо сделать.
Цикл должен иметь вид
C:
int ladder = -1;
while( (ladder = FindEntityByClassname(ladder, "func_ladder")) != -1)
{
    // actions
}
 

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
В этом разделе принято указывать на ошибки когда человек пытается что-либо сделать.
Цикл должен иметь вид
C:
int ladder = -1;
while( (ladder = FindEntityByClassname(ladder, "func_ladder")) != -1)
{
    // actions
}
Все равно до конца не понял, для чего мы искали mins/max у объекта и что это вообще?
И явно, если я вставлю этот код в цикл ничего не получится:
PHP:
AcceptEntityInput(ladder, "kill");
DispatchSpawn(ladder);
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Все равно до конца не понял, для чего мы искали mins/max у объекта и что это вообще?
И явно, если я вставлю этот код в цикл ничего не получится:
PHP:
AcceptEntityInput(ladder, "kill");
DispatchSpawn(ladder);
Это браш ентити. Она должна иметь позицию и размер. Чтобы создать новый объект на том же месте и с тем же размером - нужно выполнить определенные действия.
По всей видимости, ты понятия не имеешь даже что именно ты пишешь, по этому советую обратиться в раздел услуг.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
Дык, ты убиваешь энтити, а потом пытаешься её заспавнить
Вот ничего и не появляется
Нуно удалять func_ladder, потом создавать func_detail и спавнить её.
И нуно не забыть скопировать куда-то параметры перед удалением func_ladder, чтобы потом их применить к func_detail.
 

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
С энтити ни разу в жизни не работал.
Что сохранять, как использовать сохраненные данные, никто пока толком не объяснил.
нужно выполнить определенные действия.
Дак вот тема эта и создана, чтобы узнать конкретные вещи.
советую обратиться в раздел услуг.
Это мне что даст? Лишний раз деньги потратить, когда можно попросить направить на цель.
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
@MrChester да вроде бы все понятно.
Сравните ент с объектом на примере яблока.

В данном случае вы ищете "яблоко", съедаете его(убиваете) и пытаетесь, тоже яблоко, заспавнить. Вы прям как мой кот...
C-подобный:
public void OnPluginStart()
{
    int ent = FindEntityByClassname(-1, "func_ladder");
    AcceptEntityInput(ent, "kill");
    DispatchSpawn(ent);
}
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Это мне что даст? Лишний раз деньги потратить, когда можно попросить направить на цель.
В таком случае, ты уже получил необходимую помощь. На ам давным давно лежит туториал по созданию браш ентити. Если бы ты хотел чему-то учиться, то хотя бы пытался что-то читать.
Я давний пользователь данного форума, и немного печально, когда в данном разделе видишь фразы на подобие "Буду рад, если кто-то это реализует плагином.".
Довольно сложно направлять человека, который сам ничего не хочет делать.
 

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
В таком случае, ты уже получил необходимую помощь. На ам давным давно лежит туториал по созданию браш ентити. Если бы ты хотел чему-то учиться, то хотя бы пытался что-то читать.
Я давний пользователь данного форума, и немного печально, когда в данном разделе видишь фразы на подобие "Буду рад, если кто-то это реализует плагином.".
Довольно сложно направлять человека, который сам ничего не хочет делать.
Вот Вы говорите, что где-то давно на ам лежит туториал, я пробовал искать подобные темы в русском сегменте, но как понимаете не нашел.
Прошу реализовать это, чтобы самому понять как это чудо работает. И все также буду рад ссылочке темы на ам.
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Вот Вы говорите, что где-то давно на ам лежит туториал, я пробовал искать подобные темы в русском сегменте, но как понимаете не нашел.
Прошу реализовать это, чтобы самому понять как это чудо работает. И все также буду рад ссылочке темы на ам.
Я понимаю, что это сложно, но я попытаюсь объяснить.
У раздела в описании сказано следующее:
Обсуждение вопросов связанных с написанием плагинов и скриптов для amx, sm, es и других модов
Помощь с редактированием и созданием плагинов
Я бы сделал ударение на слово "Помощь". Это когда человек что-то пытается сам сделать и спрашивает в чем он ошибся. По сути этой темой нарушаются правила форума. Так как ты просишь вместо тебя что-то реализовать. Ведь ты не видишь смысла платить за это деньги и тебя надо всего лишь направить. Но направления не дают абсолютно никакого результата. Но ладно, допустим.
C++:
#pragma semicolon 1

#include <sourcemod>
#include <sdktools>

#pragma newdecls required

#define ZONE_MODEL "models/props/de_train/barrel.mdl"

public void OnMapStart()
{
    PrecacheModel(ZONE_MODEL);
}

void ReplaceEnts()
{
    float fOrigin[3], fMins[3], fMaxs[3];
    int ladder = -1;
    while( (ladder = FindEntityByClassname(ladder, "func_ladder")) != -1)
    {
        GetEntPropVector(ladder, Prop_Send, "m_vecOrigin", fOrigin);
        GetEntPropVector(ladder, Prop_Send, "m_vecMins", fMins);
        GetEntPropVector(ladder, Prop_Send, "m_vecMaxs", fMaxs);
        
        AcceptEntityInput(ladder, "Kill");
        
        CreateFuncDetail(fOrigin, fMaxs, fMins);
    }
}

int CreateFuncDetail(
    const float fOrigin[3],
    const float fMaxs[3],
    const float fMins[3]
)
{
    int entity = CreateEntityByName("func_detail");
    if(entity == -1)
        return -1;
    
    SetEntityModel(entity, ZONE_MODEL);
    
    DispatchSpawn(entity);
    ActivateEntity(entity);
    
    SetEntProp(entity, Prop_Send, "m_nSolidType", 2);
    SetEntProp(entity, Prop_Send, "m_fEffects", GetEntProp(entity, Prop_Send, "m_fEffects") | 32);
    
    SetEntPropVector(entity, Prop_Send, "m_vecMins", fMins);
    SetEntPropVector(entity, Prop_Send, "m_vecMaxs", fMaxs);
    
    TeleportEntity(entity, fOrigin, NULL_VECTOR, NULL_VECTOR);
    
    return entity;
}
И так, тебе явно показали как это примерно должно быть (сделали все вместо тебя, как ты и хотел). Любопытно, как ты это используешь.
 
Решение

White Wolf

🍉
Сообщения
2,382
Реакции
2,187
  • Команда форума
  • #17
Вопрос следует из заголовка темы, необходим плагин
Тут вы ошиблись разделом однозначно, если вам необходим плагин, то вы его или заказываете или оставляете запрос в треде Написание плагинов
Если возник вопрос, в первую очередь задайте его гуглу, вот так
я пробовал искать подобные темы в русском сегменте, но как понимаете не нашел.
Не ограничивайтесь русским сегментом, копайте глубже, если вам интересна деятельность, которой вы занимаетесь.

@MrChester , не забывайте отметить Лучший ответ.
 

Nico Yazawa

Бывший MrChester =(
Сообщения
326
Реакции
303
Я понимаю, что это сложно, но я попытаюсь объяснить.
У раздела в описании сказано следующее:

Я бы сделал ударение на слово "Помощь". Это когда человек что-то пытается сам сделать и спрашивает в чем он ошибся. По сути этой темой нарушаются правила форума. Так как ты просишь вместо тебя что-то реализовать. Ведь ты не видишь смысла платить за это деньги и тебя надо всего лишь направить. Но направления не дают абсолютно никакого результата. Но ладно, допустим.
C++:
#pragma semicolon 1

#include <sourcemod>
#include <sdktools>

#pragma newdecls required

#define ZONE_MODEL "models/props/de_train/barrel.mdl"

public void OnMapStart()
{
    PrecacheModel(ZONE_MODEL);
}

void ReplaceEnts()
{
    float fOrigin[3], fMins[3], fMaxs[3];
    int ladder = -1;
    while( (ladder = FindEntityByClassname(ladder, "func_ladder")) != -1)
    {
        GetEntPropVector(ladder, Prop_Send, "m_vecOrigin", fOrigin);
        GetEntPropVector(ladder, Prop_Send, "m_vecMins", fMins);
        GetEntPropVector(ladder, Prop_Send, "m_vecMaxs", fMaxs);
      
        AcceptEntityInput(ladder, "Kill");
      
        CreateFuncDetail(fOrigin, fMaxs, fMins);
    }
}

int CreateFuncDetail(
    const float fOrigin[3],
    const float fMaxs[3],
    const float fMins[3]
)
{
    int entity = CreateEntityByName("func_detail");
    if(entity == -1)
        return -1;
  
    SetEntityModel(entity, ZONE_MODEL);
  
    DispatchSpawn(entity);
    ActivateEntity(entity);
  
    SetEntProp(entity, Prop_Send, "m_nSolidType", 2);
    SetEntProp(entity, Prop_Send, "m_fEffects", GetEntProp(entity, Prop_Send, "m_fEffects") | 32);
  
    SetEntPropVector(entity, Prop_Send, "m_vecMins", fMins);
    SetEntPropVector(entity, Prop_Send, "m_vecMaxs", fMaxs);
  
    TeleportEntity(entity, fOrigin, NULL_VECTOR, NULL_VECTOR);
  
    return entity;
}
И так, тебе явно показали как это примерно должно быть (сделали все вместо тебя, как ты и хотел). Любопытно, как ты это используешь.
Спасибо за код, буду разбирать его по частям через API
У меня пока один вопрос, для чего нужно ZONE_MODEL?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
Чтобы не искать модель в коде для её замены.
В дефайне в начале кода плагина меняешь и везде при компиляции подставляется значение из дефайна.
 

Madness aka null138

Участник
Сообщения
713
Реакции
739
Сверху Снизу