Уважаемые гости и новички, приветствуем Вас на нашем форуме
Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».
Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
Удачи!
Друзья, доброго времени суток!
Стартовал новый литературный конкурс от "Ордена Хранителей" - "Пираты Миртанского моря". Каждый может принять в нём участие и снискать славу и уважение, а в случае занятия призового места ещё и получить награду. Дерзайте
Дорогие друзья, год подходит к концу, и пришло время подвести его итоги и наградить достойных
Не ленитесь, голосуйте в этой теме за тех форумчан, которые по вашему мнению больше всех проявили себя в этом году
По желанию, аргументировать свой выбор можете в теме обсуждения голосования.
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
Mefiu123, that mean when you go too far the second NPC removes from the world by the Spawn manager.
You need to activate your NPC after teleportation. For example you can check NPC states and push NPC in the world to the player position:
И еще один вопрос, можно ли откуда-то достать аргументы в функцию? Потому что трудно понять, как у меня есть такая функция, как Foo(int, int), и что это за 1 аргумент int, а что за другой.
zCView* view = new zCView();
screen->InsertItem(view); // place drawable object on display
view->InsertBack("image1.tga"); // only tga from _work/data/textures
// Only after place this view to
// screen or other zCView objects
view->SetPos(2048, 2048); // 8192 is a maximum virtual coordinate of window
view->SetSize(zPixelX(300), zPixelY(200)); // 300x200px - zPixel is a macro to convert virtual coordinate from screen to pixel
C++:
void game_loop()
{
if (zKeyToggled(KEY_Y)) // or zKeyPressed
{
// TODO
}
}
Хей! Есть такой вот вопрос... Я тут накатил "vs10", и при попытке ещё раз нажать (установить сдк) у меня идёт установка на vs19. Хз, может такая хрень из-за того что я при установке не оставил всё по дефолту, то есть путь установки поставил на диск "D". В мыслях остался последний вариант поставить сдк вручную, только вот хз куда пихать.
Подскажите как быть, пожалуйста-
p.s. проблему решил.
Hello,
I really enjoy working with this SDK, it is amazing!
I have few questions:
Is there a way to get the version of Union? I want to give a warning to the user, that he is using older version of Union and ask him to update.
Is there a way to perform checks for other Union plug-ins? In case I want to give a warning to a user, that this plug-in is not fully compatible.
And one last, perhaps a bit more technical, question:
If I want to extend named enum - to contain more values - is there a different way than editing the header files? I know, I shouldn't really edit them, since they get rewritten by the updater, so my question is how would you approach this?
Example:
I want to add a enum member to the oEIndexDamage enum
But that results in problems with the updater, as I stated above. I know, those are integers, so I could just define my own, but that doesn't look as neat. Is there a way to overload the first enum in user API inl file?
[CODE lang="cpp" title="NiceNewForumFeature.h"]for (const CList<CPlugin>* list = CPlugin::GetPluginList().GetNext(); list; list = list->GetNext())
if (const CPlugin* plugin = list->GetData())
if (plugin->GetName().HasWordI("zMarkItems"))
Message::Info("Plugin zMarkItems is unsupported. Remove the plugin!!!");[/CODE]
If I want to extend named enum - to contain more values - is there a different way than editing the header files? I know, I shouldn't really edit them, since they get rewritten by the updater, so my question is how would you approach this?
By editing this enum (or any other entry in ZenGin API) you only break the binary compatibility between Union and ZenGin classes.
There is no easy way to add new damage type. To do so you at least need:
Create new oEDamageIndexEx and oEDamageTypeEx enumerations
Create new oSDamageDescriptorEx class
Extend oCItem and oCNpc classes with the new extended damage arrays
Force parser to use new arrays when it accesses C_ITEM.damage or C_NPC.damage
Intercept damage messages in order to convert oSDamageDescriptor and create oSDamageDescriptorEx as wise copy + addition entry
Write your own damage handling function that works with extended descriptor. For G2A you can use this as a start point: https://worldofplayers.ru/threads/42513/
Maybe there are some other important engine functions which rely on old damage arrays...
Пытаюсь разобраться в написании плагина на Union. Очень долго ищу информацию\пример того как можно создать своего npc.
Не полностью с нуля - используя визуал из игры.
Пытался копать в сторону использовании существующего npc как донора, например через player->GetFocusNpc(); но не влиять на npc донора не вышло)
Если есть пример какой-нибудь фабрики - было бы круто.
В идеале я хочу добиться генератора случайного персонажа, со случайной внешностью, которого можно будет безболезненно удалить из мира.
Пока все что мне удалось - это немного адаптировать пример из генерации статичного vob'а куста (нашел где то в этой теме).
Как я понял из-за того что я использую визуал донора по ссылке npc->GetVisual() - созданная кукла влияет и на донора. В итоге оба моба начинают валяться как трупы xD Но как создать собственный визуал (zCVisual) я так и не понял.
Если подобный вопрос уже задавали или где то есть пример - прошу тыкнуть меня лицом туда) Потому что я уже наверное неделю читаю форум в поиске примера)
Так же мне интересно как созданному npc
1) прописать текстовые диалоги
2) управлять его анимациями (mob->GetModel()->StartAnimation("BABE-S_DANCE1"); - не вышло)
3) заставить его бегать за игроком и самому инициировать диалог
Насколько я понимаю в таком случае на лету я создавать npc не смогу? Только создать пул и спанить их.
Но со спавном у меня тоже проблемы)
Нашел зацепку в 4м примере тут https://worldofplayers.ru/threads/40173/ . Вот таким образом получилось добавить нового npc, но заставить его хотя бы делать хоть что то не вышло.
C++:
zSTRING str_instance = "grd_254_orry"; // любой существующий npc
int idx = parser->GetIndex(str_instance);
oCNpc* pNpc = dynamic_cast<oCNpc*>(ogame->GetGameWorld()->CreateVob(zTVobType::zVOB_TYPE_NSC, idx));
if (pNpc && player) {
zVEC3 vp = player->GetPositionWorld();
zVEC3 vdir = player->GetAtVectorWorld();
ogame->spawnman->InsertNpc(pNpc, vp);
/*
В перебирал публичные методы, которые звучат как то что мне бы помогло запустить npc
*/
//pNpc->ResetToHumanAI();
//pNpc->AI_Follow(player);
//pNpc->Follow();
//pNpc->GetModel()->StartAnimation("S_DANCE1");
//pNpc->GetEM(false)->SetActive(false);
}
pNpc->Release();
Сначала посмотри как это в обычных скриптах делается. На крайний случай можешь из плагина нужные функции вызвать.
Обычно функции ИИ добавляют сообщение в очередь:
Насколько я понимаю скрипт создаст мне npc с определенным id и будет присутствовать всегда в мире и в сейве. Рандом отработает при новой игре или загрузке игры, не знаю точно как это работает. Мне что бы сделать хотя бы имитацию рандома придется сделать пул таких npc (штук 20 к примеру), что бы уже рандомом выбирать из этого пула.
В моем случае это в принципе применимо, но было бы удобнее, если бы можно было брать за основу существующего npc, брать его visual и немного крутить его рандомом. Например другое тело и голову, а все остальное не важно. В таком случае рандом был бы динамический, а не ограничен пулом заготовок.
Мне нужны персонажи массовки. Например сценарий такой: По динамическому событию (например по нажатию кнопки F12) появляется рандомный селянин где то сзади персонажа, бежит к персонажу, начинает с ним диалог и сообщает рандомный факт о котах xD После этого убегает, а затем выпиливается из мира навсегда.
На данном сайте используются файлы cookie, чтобы персонализировать контент и сохранить Ваш вход в систему, если Вы зарегистрируетесь.
Продолжая использовать этот сайт, Вы соглашаетесь на использование наших файлов cookie.