Все, что связанно со скриптами, постить СЮДА.
Вот бы мне кто разъяснил как катсцены писать... Если будут желающие - пришлю пример с описанием... Интересно очень...
Хм... Что именно ты хочешь узнать, Plut ?
вот у меня вопрос: (уже зажовал)
можно ли с помощю скрипта сделать такую фичу:
когда герой вынимает из инветаря определенный итем в руки должен появлятся источник непрерывного звука от героя, а при уберании предмета - должен пропадать звук.
Можно сделать ОДИН звук на всю арену и кретить его в каждой новой арене, такой что бы гонялся за РС с оружием можно, но ужасно геморно, дестрой-креет.
Прива. Как сделать рельную проклятую вещь(которая не снимается вообще, а не снимается и тут же ождивается. Пртмер- в кампании друид , превращаясь в минотавра, получает топорик, а снять его не може ВООБЩе). Пока есть вот что:
Neverwinter Script Source |
//вставить в onUnequip int isCursed(object oItem) { if (!GetIsObjectValid(oItem)) { return FALSE; } if (GetLocalInt(oItem,"ImmediateUncursed")) { return FALSE; } else if (GetLocalInt(oItem,"Cursed")) { return TRUE; } else if (GetStringRight(GetTag(oItem),6) == "Cursed") { return TRUE; } else { return FALSE; } } void main() { object oItem = GetPCItemLastUnequipped(); object oPC = GetPCItemLastUnequippedBy(); if (isCursed(oItem)) { object oCopy = CopyItem(oItem,oPC,TRUE); int nSlot = GetLocalInt(oItem,"InventorySlot"); if (nSlot != -1) { if (nSlot == INVENTORY_SLOT_RIGHTHAND) { object oRightHand = GetItemInSlot(nSlot,oPC); object oLeftHand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC); if (isCursed(oRightHand)) { if (isCursed(oLeftHand)) { SetLocalInt(oRightHand,"ImmediateUncursed",1); DelayCommand(0.05, AssignCommand(oPC, ActionEquipItem(oCopy, INVENTORY_SLOT_RIGHTHAND))); DelayCommand(0.1, SetLocalInt(oRightHand, "ImmediateUncursed", 0)); } else { DelayCommand(0.05, AssignCommand(oPC, ActionEquipItem(oCopy, INVENTORY_SLOT_LEFTHAND))); } } else { DelayCommand(0.05, AssignCommand(oPC, ActionEquipItem(oCopy, nSlot))); } } else { object oCurrent = GetItemInSlot(nSlot,oPC); if (isCursed(oCurrent)) { SetLocalInt(oCurrent,"ImmediateUncursed",1); DelayCommand(0.1, SetLocalInt(oCurrent, "ImmediateUncursed", 0)); } DelayCommand(0.05, AssignCommand(oPC, ActionEquipItem(oCopy, nSlot))); } } DestroyObject(oItem,0.01); } } //вставить в onEquip void main() { object oItem = GetPCItemLastEquipped(); object oPC = GetPCItemLastEquippedBy(); //AssignCommand(oPC,SpeakString("Item Equipped!",TALKVOLUME_SILENT_SHOUT)); if ((GetLocalInt(oItem,"Cursed") == 1) || (GetStringRight(GetTag(oItem),6) == "Cursed")) { effect eCurse = EffectLinkEffects(EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE), EffectCurse(2, 2, 2, 2, 4, 2)); ApplyEffectToObject(DURATION_TYPE_PERMANENT,eCurse,oPC); ApplyEffectToObject(DURATION_TYPE_INSTANT, SupernaturalEffect(EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY)), oPC); int nSlot = 0; int nSlotEquipped = -1; while ((nSlot < 18) && (nSlotEquipped == -1)) { if (GetItemInSlot(nSlot,oPC) == oItem) { nSlotEquipped = nSlot; } nSlot++; } SetLocalInt(oItem,"InventorySlot",nSlotEquipped); FloatingTextStringOnCreature(GetName(oPC) + " equipped a cursed item.",oPC); } } //а этот файл сохраните под именем nw_s0_remeffect #include "X0_I0_SPELLS" #include "x2_inc_spellhook" void main() { if (!X2PreSpellCastCode()){} int nSpellID = GetSpellId(); object oTarget = GetSpellTargetObject(); int nEffect1; int nEffect2; int nEffect3; int bAreaOfEffect = FALSE; effect eVis = EffectVisualEffect(VFX_IMP_REMOVE_CONDITION); if(nSpellID == SPELL_REMOVE_BLINDNESS_AND_DEAFNESS) { nEffect1 = EFFECT_TYPE_BLINDNESS; nEffect2 = EFFECT_TYPE_DEAF; bAreaOfEffect = TRUE; } else if(nSpellID == SPELL_REMOVE_CURSE) { nEffect1 = EFFECT_TYPE_CURSE; int nSlot = 0; object oItem; object oUncursed; string sUncursedForm; while (nSlot < 18) { oItem = GetItemInSlot(nSlot,oTarget); if ((GetLocalInt(oItem,"Cursed") == 1) || (GetStringRight(GetTag(oItem),6) == "Cursed")) { sUncursedForm = GetLocalString(oItem,"UncursedVersion"); if (sUncursedForm == "") { sUncursedForm = GetStringLeft(GetStringLowerCase(GetTag(oItem)),GetStringLength(GetTag(oItem)) - 6); } oUncursed = CreateItemOnObject(sUncursedForm,oTarget); if (GetIdentified(oItem)) { SetIdentified(oUncursed,TRUE); } SetLocalInt(oItem,"ImmediateUncursed",1); DestroyObject(oItem,0.1); FloatingTextStringOnCreature(GetName(oItem) + " is no longer cursed.",oTarget,FALSE); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_PULSE_HOLY_SILENT), oTarget); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_PULSE_HOLY_SILENT), oTarget); } nSlot++; } } else if(nSpellID == SPELL_REMOVE_DISEASE || nSpellID == SPELLABILITY_REMOVE_DISEASE) { nEffect1 = EFFECT_TYPE_DISEASE; nEffect2 = EFFECT_TYPE_ABILITY_DECREASE; } else if(nSpellID == SPELL_NEUTRALIZE_POISON) { nEffect1 = EFFECT_TYPE_POISON; nEffect2 = EFFECT_TYPE_DISEASE; nEffect3 = EFFECT_TYPE_ABILITY_DECREASE; } if (bAreaOfEffect == TRUE) { effect eImpact = EffectVisualEffect(VFX_FNF_LOS_HOLY_30); effect eLink; spellsGenericAreaOfEffect(OBJECT_SELF, GetSpellTargetLocation(), SHAPE_SPHERE, RADIUS_SIZE_MEDIUM, SPELL_REMOVE_BLINDNESS_AND_DEAFNESS, eImpact, eLink, eVis, DURATION_TYPE_INSTANT, 0.0, SPELL_TARGET_ALLALLIES, FALSE, TRUE, nEffect1, nEffect2); return; } SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, nSpellID, FALSE)); RemoveSpecificEffect(nEffect1, oTarget); if(nEffect2 != 0) { RemoveSpecificEffect(nEffect2, oTarget); } if(nEffect3 != 0) { RemoveSpecificEffect(nEffect3, oTarget); } ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget); } // чтобы создать проклЯтую(неснимаемую) вещь, надо просто присвоить ей тэг 39;XCursed39;, где Х - уникальное имя //шмотки. Авторство - CelestialRyan. |
2All: как вы уже наверное прочитали мы сейчас начали внутренее тестирование мультиплеерного модуля... и вылез очень наприятный баг... в начале модуля камера глючит и как будто привязана к НПС... короче говоря она не привязана к перцу... А это сами понимаете черевато...
ПОМОГИТЕ НАРОД... А то блин этот глюк ваще не к месту..
С мультискриптами никто из нас не работал
Рамна или Вирус могут помочь.
__________________________________
с катсценами: уже ОЧЕНЬ мого раз поднималась эта тема. Более того, на рельсах лежит скрипт ДБ начального мультика. (не в базе, а где-то еще)
__________________________________
о проклятых вещах: знаю только снял - тут-же оделась. Чтобы вообще не снималось..незнаю.
Вообщем описываю ситуацию. Это про с-му смерти. Предположим ПС умирает и на сервере случается рестарт. После него он опять заходит и должен телепортнуться со стартовой зоны на кладбище например. У меня он заходит и лежит мертвый сразу на старте. Ничаво не получается. Я стока уже вариантов перепробывал и ничего=(( Как сделать? Еще вопрос: когда ставлю на он клентер вот такое условие:
if (GetArea(oPC)==GetObjectByTag("lc_startzone"))
Возвращает ли GetArea локацию, где стоит точка старта?
Насчет мульта ДБ: он там хитренько запрятан даже не помню где нашел его... Кому надо - могу выложить... хотя смысл: если ДБ против-все равно удалит, если за-может выложитьб и целый(там только первых строчек 60)
Добавлено в [mergetime]1082385478[/mergetime]
Auren[LFL] Зачем тебе это? Не проще ли создать локэйшн на месте старта ПС(через ГетЛокэйшН)? А если так, то зачем проверка?
Добавлено в [mergetime]1082385697[/mergetime]
про прокляты вещицы: на рилмсах добрый человек(Каа вроде) подсказал, что можно не скриптово, а 2да-шно- полиморфить в ПС но в графе веапн писать нужное оружие. Попробую, хотя времени нет ни... вообще нет, короче
Сенк, я уже разобрался=)
Tarre Talliorne, дай ссылку на тот пост Каа, пожалуйста
Tarre Talliorne я могу выложить мульты в теме наших скриптов, если надо. Но они не влазят, там например в финале 600 строк кода, а сколько знаков так что кусок могу выложить, вернее два варианта как можно писать.
Aiwan, неа, мне зачем-то, я сам могу катсцену написать (сейчас кстати пишу одну.... шедевр - уже 22000(!) символов). Лучше, чтоли, статью напиши(иногда поражаюсь своей наглости ). Что-тто типа Основы Создания КатСцен.
Lex Извини, ссылку кинуть не могу, поищи в теме скрипты на стр. 19(рельсы, конечно).
И парочка моих вопрософф:
1. Можно ли определять момент кражи как-нибудь иначе, чем через хертбитные проверки наличия итема в инвентор НПС?
2. Можно ли определять уровень ПС проще, чем суммируя все его уровни в разных областях?
3. Точно ли в НВН воспроизведены правила 3 редакции относительно возраста ПС?
1. если ворует Игрок то можно. Модульные скрипты - получение предмета. (не помню, как на инглиш)
2. Имхо, самый простой способ это просумировать левелы по классам (их всего-то три. Слот 1, Слот 2, Слот 3)
3. Нет. Там вообще возраст нафиг не нужен. Даже функции нет GetAge()
Lex помоги со скриптами для AI бота...
Tomb у Лекса работы по ... Лучше Баал попроси Он помогет, наверняка.
На рельсах уже просил такой скрипт, но попрашу и тут
Нужен такой скриптик:
Когда нпц ведет игрока он должен останавливатся если игрок находится от него в четырех метрах и подгонять игрока.
Могу дать свой код, где Стинки ведет игрока к пролому в стене. Годится?
Годится.
2Tarre Talliorne.
Вейпов должно быть столько сколько я нарисовал, но либо меньше 10 ли бо больше чем у меня. Почему? Не знаю, неделю гонял Стинки по вейпам и он гад прыгал на некоторые из них при количестве 10, а так нет. Идет как миленький.
и расчитай скорость так, что бы НПС НЕ ЗАСТРЯЛ и не опаздал на 15 сек до точки. Иначе вы просто прыгнете на следующий вейп и диалог прервется. А так он остановится и продолжите диалог.
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: Copyright © 2004 WRG! www.wrg.ru //:: am_pc_stinki_go2 //::////////////////////////////////////////////// /* ПЕРЕДВИЖЕНИЕ оРС ЗА НПС, СКРИПТ СТАВИТСЯ НА СТРОКУ В ДИАЛОГЕ oPC (!) */ //::////////////////////////////////////////////// //:: Created By: Aiwan Aiwan@e-mail.ru //:: Created On: 20.03.2004 //::////////////////////////////////////////////// void main() { object oPC = GetPCSpeaker(); object oStinki = GetObjectByTag("MM_STINKI"); object oWp01 = GetObjectByTag("WP_STINKI_01"); object oWp02 = GetObjectByTag("WP_STINKI_02"); object oWp03 = GetObjectByTag("WP_STINKI_03"); object oWp04 = GetObjectByTag("WP_STINKI_04"); object oWp05 = GetObjectByTag("WP_STINKI_05"); object oWp06 = GetObjectByTag("WP_STINKI_06"); object oWp07 = GetObjectByTag("WP_STINKI_07"); object oWp08 = GetObjectByTag("WP_STINKI_08"); object oWp09 = GetObjectByTag("WP_STINKI_09"); object oWp10 = GetObjectByTag("WP_STINKI_10"); object oWp11 = GetObjectByTag("WP_STINKI_11"); object oDoor = GetObjectByTag("AM_DOOR_FLEG_NO"); effect eHaste = EffectHaste(); // ЧТО БЫ ИГРОК НЕ ОТСТАВАЛ! SetLocalInt(oPC, "STINKI", 3); AssignCommand(oStinki, ActionPauseConversation()); AssignCommand(oPC, ActionForceFollowObject(oStinki, 4.0f)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eHaste, oPC, 9999.0); AssignCommand(oStinki, ActionDoCommand(SetCommandable(FALSE, oPC))); AssignCommand(oStinki, ActionForceMoveToObject(oWp02, TRUE, 4.0)); AssignCommand(oStinki, ActionDoCommand(SetFacingPoint(GetPosition(oPC)))); AssignCommand(oStinki, ActionDoCommand(SpeakString("Не отставай!"))); AssignCommand(oStinki, ActionWait(1.0)); AssignCommand(oStinki, ActionForceMoveToObject(oWp03, TRUE, 4.0)); AssignCommand(oStinki, ActionWait(2.0)); AssignCommand(oStinki, ActionForceMoveToObject(oWp04, TRUE, 4.0)); AssignCommand(oStinki, ActionDoCommand(SetFacingPoint(GetPosition(oPC)))); AssignCommand(oStinki, ActionDoCommand(SpeakString("Не сильно быстро?"))); AssignCommand(oStinki, ActionWait(2.0)); AssignCommand(oStinki, ActionForceMoveToObject(oWp05, TRUE, 4.0)); AssignCommand(oStinki, ActionWait(2.0)); AssignCommand(oStinki, ActionForceMoveToObject(oDoor, TRUE, 4.0)); AssignCommand(oStinki, ActionDoCommand(SpeakString("Не обращай внимание, нас никто не тронет."))); AssignCommand(oStinki, ActionForceMoveToObject(oWp06, TRUE, 4.0)); AssignCommand(oStinki, ActionWait(2.0)); AssignCommand(oStinki, ActionForceMoveToObject(oWp07, TRUE, 4.0)); AssignCommand(oStinki, ActionWait(2.0)); AssignCommand(oStinki, ActionForceMoveToObject(oWp08, TRUE, 1.0)); AssignCommand(oStinki, ActionDoCommand(SpeakString("Мы почти пришли!"))); AssignCommand(oStinki, ActionForceMoveToObject(oWp09, TRUE, 1.0)); AssignCommand(oStinki, ActionWait(2.0)); AssignCommand(oStinki, ActionForceMoveToObject(oWp10, TRUE, 1.0)); AssignCommand(oStinki, ActionWait(2.0)); AssignCommand(oStinki, ActionForceMoveToObject(oWp11, TRUE, 1.0)); AssignCommand(oStinki, ActionDoCommand(SetFacingPoint(GetPosition(oPC)))); AssignCommand(oStinki, ActionDoCommand(RemoveEffect(oPC, eHaste))); AssignCommand(oStinki, ActionDoCommand(SetCommandable(TRUE, oPC))); AssignCommand(oStinki, ActionResumeConversation()); } |
Ну спасибо!
Теперь опять вопросик, даже два
1. Как сделать так чтобы когда все враги в локе будут мертвы, в журнале появляется запись... это наверное просто, но я не догоняю.
2. Непись стоит в хайде, но когда ПК отходит на пять метров, то НПЦ подкрадывается к нему и атакует, как это реализовать?
2Elven king
1. Сделать всех врагов в локе в какой-нить пометкой допустим в поле Deity. Проверить всех существ с наличием этой метки GetDeity.
Можно вообще по всякому, и фракцию проверить и еще че-нить...
2. Это сложно. Надо писать скрипт поведения в UserDefined событии. Сейчас нет времени его написать, правлю баги первой части Левора... А вообще если сам прорвешься, то научишься кой-чему в скриптинге AI. Кстати, самая сложная часть скриптинга... Попробуй начать сам. Когда появятся более детальные вопросы - с удовольствием ответим .
Neverwinter Script Source |
SetLocalInt(oPC, "KILL", GetLocalInt(oPC, "KILL") + 1); // На каждом НПС при смерти будет для оРС +1 переменная Как только она будет равна количеству твоих враггов, например их 10 в локации... if (GetLocalInt(oPC, "KILL") >= 10) { AddJournalQuestEntry("TAG_JRNALA", 1, оPC); } |
Neverwinter Script Source |
{ object oNPC = GetFirstObjectInShape(SHAPE_CUBE, 250.0, GetLocation(GetFirstPC())); object oBOSS = GetObjectByTag("KRUSHIMORDA_FACTION_LEADER"); while (GetIsObjectValid(oNPC)) { if (GetFactionEqual(oNPC, oBOSS)) { return FALSE; } oNPC = GetNextObjectInShape(SHAPE_CUBE, 250.0, GetLocation(GetFirstPC())); } return TRUE; } // КОД DBColl-a |
Neverwinter Script Source |
// GetFirstObjectInShape // ВЗЯТЬ GetFirstObjectInArea object oArea= GetArea(OBJECT_SELF); // ТИПА ТУТА |
Заинтерисовала идея Элвен Кинга... Начал реализовывать...
Атакует не из хайда (хотя в хайд на долю секунды уходит - когда двигается ко мне - из хайда опять же выходит).
Не подскажите как написать чтобы моб из хайда долбил?
Код писал сам.
Попробуй через SetSpawnInCondition(NW_FLAG_STEALTH_MODE); вроде так пишется...
А еще у тебя ошибка в определении Perception. Надо делать дополнительную проверку на GetIsPerseptionSeen();.
GetLastPerceived срабатывает, когда объект увиден-услышан-перестал быть видимым-перестал быть слышимым. Поэтому надо дополнительно проверять.
Окей, спасибо!
Будем разбираться дальше
Народ, всвязи с моим не оч хорошим знанием правил AD&D, разъясните глупому, как правильно кидаются кости. Например, на убеждение при диалоге.
хм... На убеждение при диалоге? Это типа в тех что в Сингле? (обычно кубики там кидаются как укажешь).
Это система зовется d20(). Кидается d20() + скилл, против d20() непися.
Ага...
1. Как попросить своего вора обокрасть какого-нибудь гражданина?
А как самому обокрасть его? Я воров обычно не перевариваю, но сделал
как-то для проверки вора 15 уровня, нарастил ему воровство по максимуму,
а все равно при попытке ограбить происходит облом.
(Спросил в другом месте, но тут вроде более по теме)
Как сделать так, что бы sir/madam (и т.п.) выдавали не "sir" или "мадам",
а другие определенные мной слова?
Конкретизирую про вора:
У вас есть хенчмен Томми. Вы сами воровать не умеете.
1) Вы говорите "Томми, проверь этого господина". И он кидается
проверять господина, на которого укажешь мышкой. Либо, если это невозможно,
то он сам определяет ближайшего господина в радиусе 1-5 метров либо
вообще ближайшего. Примерно так.
2) Дополнительное условие - чтобы не было
обломов. То биш Томми, получив приказ, кидает кости. Если результат не в его
пользу, то он говорит "облом, сир". Если нормально, то {ворует колечко и т.д.}
Сарлес, я когда-то начинал писать эту системку, но боюсь не дописал и она де-то у меня потерялась... На самом деле здесь ничего сложного нет. Один диалоговый скриптик средних размеров. Скажу сразу, кликать мышой, указывая цель вора, не получится. Придется делать что-то вроде "поиска ближайшего нейтрала к PC" и броски костей. Сам я сейчас не сяду писать этот скрипт (банально нет времени), ты уж попробуй сам. Что будет в упор непонятно - спрашивай. Если надо могу расписать по броскам:
[d20 + скилл PickPocket за вора] против [d20 за непися].
Как называются функции "украсть что-то у кого-то" и "получить результат броска?"
Начал разбираться в днём и ночью. в OnSP простолюдинов повесил скрипт
#include "NW_O2_CONINCLUDE"
#include "NW_I0_GENERIC"
void main()
{
SetSpawnInCondition(NW_FLAG_DAY_NIGHT_POSTING);
SetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS);
SetSpawnInCondition(NW_FLAG_ESCAPE_RETURN);
SetListeningPatterns();
WalkWayPoints();
}
Осталось дело за малым, создать дневные и ночные POST-ы, а вот как это сделать я не понимаю. Помогите пожалуйста.
Спасибо.
Sir_Sarles А зачем тебе это???
ActionUseSkill(SKILL_PICKPOCKET, ...), но я бы писал собственную функцию с ActionTakeItem(...) с посылом далее кастомного Event'а этому неписю, у которого крадут. Этот эвент и сам процесс кражи обрабатывается уже само собой неписем (можно даже подвязать к OnDisturb непися). Результат броска делаешь сам, внешний. Пример:
В моем модуле, у одного типа есть кольцо регенерации, которое следует украсть. На весь модуль это единственный предмет, поддающийся краже, поэтому надо бросить игроку подсказку на эту тему.
Спасибо, попробую разобраться
Тогда 100% тебе надо писать единичный (не универсальный скрипт!). Это проще. Ты можешь вообще привязаться жестко к скиллу игрока или хенча и написать скрипт через диалог, всплывающий в том месте локи, де ты планируешь украсть это кольцо. Через триггер всплывет . Помоему проще и быстрее всего. В конце диалога проверка скиллов и прочего и соответственно результирующие ветки. Удачи!
Вот http://docfeert.narod.ru/z_cont.html есть пара скриптов.
Вот вопрос. Какая функция(если такая есть) возвращает тип робы. Вообщем ситуация такая: нужен скрипт, который запрещал бы использование предмета, если на ПС одета роба не первого типа.
Такой функции нет.
Нужен ну ооочень простой скрипт, но я не знаю как его сделать
Вобщем игрок наступает на тригер и у него начинается разговор с неписем (это я знаю как сделать)
После разговора этот тригер должен удаляться для того чтобы повторное наступление на тригер не привело к повторному разговору, как это сделать?
удали триггер сразу после наступания
Добавлено в [mergetime]1086971357[/mergetime]
те так:
.....
AssignCommand(oNPC,ActionStartConversation(..));
DestroyObject(OBJECT_SELF,0.5);
.....
Добавлено в [mergetime]1086971480[/mergetime]
надеюсь система триггер-диалог у тебя универсальна, не под каждого НПС отдельный скрипт?
Нет, скрипт вобще так выгледет:
из
object oNPC = GetObjectByTag("TAG_SIGILSTUDENT");
сделай
object oNPC = GetNearestObjectByTag(GetTrapKeyTag(OBJECT_SELF));
тогда этот скрипт будет для любого НПС, если в поле KeyTag ты запишешь ТЭГ нужного тебе НПС для ДАННОГО тригера
Elven king вот простое решение твоей проблемы.
Айв, не говори ерунды, если все через Assign то никакого удаления нет, так как очередь на НПС. Главное удалить триггер не сразу-же а с небольшой задержкой. полсекунды вполне хватает, чтобы длинющую очередь выстроить.
Ну это ты знаешь. А он не волокет в тонкостях. Ему нужно просто и что бы было понятно и работало. Дальше он сам сделает как поймет.
Вопрос по анимации. Как сделать анимацию атаки? Именно анимацию, а не заставить PC нападать. Констант таких я не нашел, возможно ли это?
Стандартными способами нельзя. Можно поменять саму анимацию, на одной из существующих констант. То есть выдрать анимацию одиночной атаки (допустим с длинным мечом) и заменить ею одну из существующих анимаций. Само собой без хака не обойтись. Подробнее я к сожалению не смогу объяснить. Надеюсь Айс это сделает . [гы, глядя в сторону Айса...]
Не, спасибо. Либо просто - либо никак
да, к сожалению констант нет.
Такой вот вопрос, как вам кажется, как легче создать расовые плюшки для Дроу тоесть чтобы он мог сразу использовать темноту и как сделать волшебный огонь, который просто появляется как эффект вокруг жертвы?
Мне кажется здесь надо переписать чуток 2да по фитам и магии... По-другому вроде новые спеллы не дать...
Ну... это то да, а вот как быть с тем чтобы магия Darkness была врождена, тоесть как бы использовалась к примеру два раза в день?
Elven king слишком пространнственный вопрос. Конкретней ситуацию опиши. Про спелл, можно надеть шкурку на РС. Но для шарда это не очень
Нет, тут не для Шарда, а так для одиночной игры, вся ситуация сосотит в том, что мне нужно реализовать суб расу Дроу, которая как известно обладает двумя способностями(на даный момент хватает только спела).
И можетете ктонибудь сказать какой командой можно одеть эту шкуру?
Такой вопрос:
можно ли каким нибудь образом восстановить игроку запомненные, но уже использованные спеллы (без отдыха)?
Ато я в тулсете знаю только возможность уменьшить количество кастов запомненного спелла, а вот обратной возможности так и не нашел...
2 Vestel
Этот скрипт ставишь на OnEnter локации. Делаешь невидимого монстра с нейтральной фракцией ко всем и делаешь его плотовым. Для диалога немного переделай. Сможешь?
Вопрос первый.
При первом входе персонажа на сервер, должен срабатывать скрипт, который начинает с ним диалог (вроде как на Энтарионе "система именных оружий" и т.д). Этот же диалог должен начинаться после каждого ЛевелАпа. Проверка на первость входа идет через стандартное Deity по факту наличия зарезервированных символов в котором и должен запускаться диалог.
С подсказки Aiwan'a была создана НПС (таг: "MCS_TALKMAN"), которой было заданно имя, которая будет вести диалог. Она спрятана в дальнюю локацию с названием "Секретная Лока" (таг: "SECRET_AREA").
При использывании конструкции:
2 Elven king делаешь шкурку со свойствами. Код впихивай хоть куда.
В догонку:
как в том же диалоге сделать, чтобы до тех пор пока пользователь не выбрал "Выход" у него были одни и те же фразы?
Скрипт работает, только НПС почему-то не невидимый.. Как сделать? Я в непонятках.. Пробывал на него Перманентный Импрувнутый Инвиз вешать - не помогает..
Вестель как ты представляешь диалог, если твой персонаж за три девять земель? Тогда уж так:
Создаваю, дестрою..
Токены устанавливаются через SetCustomToken(400, "стринг"); // 400 - это пример номера
Затем в диалоге ты просто пишешь <CUSTOM400> и вместо него в игре в диалоге появляется "стринг".
Вот и все .
Я для вот думал как сделать такой скриптик ...
Заходит игрок в гостиницу отдохнуть, снимает номерок. Заходит туда и жмет рест. на ресте с него снимаются все шмотки и кладуться в шкаф а сам он рухает спать на коврик. Вокруг него темнеет сон длится минуту. Но это я все знаю как реализовать. Я вот что хотел:
Значит пока он спит рандомно в случае 1 из 40 допустим, включается SetCutScene то несть он не может отменить сон и управлять не может. В коридоре гостиницы появляется воришка, камера переходит к нему, он делает вид что ковыряется в двери, дверка открывается, он вскрывает шкаф со шмотом ПС копается там. После этого воришка убегает, CutScene заканчивается перс в стает и недощитывается в шкафу рандомно 2х вещей.
З.Ы. Но шмотки удалятся только если воришка откроет сундук, потому что вдруг там засаду устроят))
Аваддон это можно реализовать, достаточно просто. Во время отдыха запускай функцию Random и как только получишь нужный вариант просто на задержку ставь скрипт, вот кусок кода:
Ага, я вот еще что хотел спросить.
У меня GetObjectByTag отлично работает, а вот GetNearestObjectByTag вообще НОЛЬ! Не работает. Или надо это делать как AssignCommand?
Добавлено в [mergetime]1087585512[/mergetime]
P.S. 1. Зачем нужна задержка?
2.Как я понял Инта рандомно выпадает от 0 до 100, и если она меньше 5 то скрипт пускается? А как сделать чтобы вероятность была 1 из 40?
Да, только Nearest я так к слову спросил потому что, у меня такая вещь на отдыхе - когда костер разжигаешь - дрова должны изчезнуть. Когда я пишу DestroyObject(GetNearestObjectByTag("rest_wood")); дрова не изчезают хотя я стою рядом с ними, но стоит мне написать DestroyObject(GetObjectByTag("rest_wood")); и бац - все работает.. Не понимаю в чем дело.
А, все допер в чем ошибка. Там надо же еще писать от кого ближайший объект
А теперь другой вопрос как сделать чтобы объект создавался с задержкой?
Ну например я срубил дерево а через 500сек там еще одно выросло?
Я пытался совместить DelayCommand и CreateObject - бестолку. Написал отдельную функцию - и поставил ее на дилэй - тоже не появляется..вот фигня какая.
Вот кусок моей инклюды, работает все как часы. Хочешь просто объект, хочешь с новым тегом крееть.
Спасибо Так так, а кто у нас тут специалист по бд? Или может это не с БД связано...
Вообщем очень заинтересовался, как можно сделать сейф предметов для мультика? Тоесть человек положил в сейф предмет, ззакрыл, получил расписку и ушел. Сервак перезагрузился, он зашел отдал расписку, сказал кодовое слово и получил обратно свои предметы...
Если конечно ни у кого ничего такого не написано, то подайте хотябы идею как реализовать это. Вписывать теги всех вещей - исключено! Их там столько...
Интересная идея посетила. Вот воры крадут - это нормально ведь у кого то спот не прокачен. Но когда воры крадут в городе где полно охраны это уже прям не охрана а музей восковых фигур. Как можно прописать чтобы охрана становилась хостайл для вора если увидит что вор у кого то крадет?
Может OnHeartBit арены города поставить проверку -какие навыки используются и если используются PickPocket выставлять хостайл?
на дистурб НПС напиши скрипт, чтобы он заорал Воры! Хватаешь ближайшего стражника и атакуешь им игрока. Не надо делать репутацию 0. Это не очень логично.
Да но это будет работать если воры обносят НПС а если они обносят других игроков?
тогда незнаю
Тогда пусть другой игрок ему и стучит по голове, если заметил кражу. Гы.
О да))
Каа, а почему нельзя ходить с крадеными вещами? Стражники ведь не досматривают! Прикинь картину: ты идешь себе, идешь, появляется патрульный стражник и вдруг набрасывается с криком: "ВОР! Замочу гада!". Достает АК-47 и начинает палить... Хм... понесло...
Все бы ничего, да вот я-то эту вещь поднял с брошеного трупика какого-то игрока... (что сделаешь, если я отыгрываю свой LE). Гы. :ss:
Хм а почему на OnUnAquire это же наоборот когда сбрасываешь вещь?! А тогда можно я думаю вот как сделать: Значит на OnAquire ставим проверку приобретенной вещи - если stolen, то проверяем арену, если это город - проверяем расстояние он человека который получил эту вещь до Nearest гварда. Если расстояние там допустим менее 10 то берем этого гварда и Assign ему чтоб он кричал "Воры! Полетят клочки по закоулочкам нашей славного града..." и аттачит вора... Или нет...Даже вот что лучше - он вора атачит и на каждом ударе проверяет здоровье. Если здоровье вора <0>-10 то есть вор уже на земле корячится то он типа говорит - пройдемте в отделение, тут ему прибаляется 10хп чтоб ожил и телепортится в камеру тюрьмы
Во, Айван ты всегда что то клевое подаешь А если игрок просто закроет диалог?! Есть такая фишка? что тогда делать - нападать?
Ты имеешь ввиду это?:
Ребят, а вы не думали, что можно проверять и устанавливать на каждую приобретенную вещь (в OnAcquire) переменную = Тэг(OBJECT_SELF) + ID хозяина. Тем самым можно дополнительно проверить краденая ли вещь... Но это идея... Возможно и не очень правильная для шарда, но все же...
Кстати - с реакцией гварда можно сделать проще: фит нокдаун и через 0.1 сек эффект нокдаун - потом изменение отношения на нейтральное и разговор - плати штраф за то-то и то-то. Проще тем, что можно обойтись без тюрьмы... Даже если у игрока нет денег - берут шмотом и дают сдачу :-) , а если и шмоток нет, у игрока начинают рости ДОЛГИ . А если при диалоге перс нарывается на агрессию и нападает, его всегда можно выруюить заново и удвоить штраф . Могу кинуть код (сыроват он еще, но ...) - просто у нас в модуле у части охраны такое поведение .
в базу кидай
Отшлифую - кину...
Вопроссс: мне нужно определить, висит ли на ПС эффект увеличение КБ, вроде все в порядке - перебираю все эффекты и т.д. но все равно в результате скрипт возвращает 0... Никак не допру, в чем проблема.
Tarre
А кто ж так эффекты сканирует?
effect eEff = EffectACIncrease(...) - создает новый "экземпляр" эффекта. Это не нужно тебе в данной ситуации.
Надо делать так:
Спасибо... хех, прикол в том, что с визулками все отлимчно работало... Да, кстати, сразу написаля инлюд - через пять минут выложу в базе скриптов
у меня эта функция называется DestroyEffect(). уже давно обитает в моей библиотеке.
toLex - у меня тоже есть такая вещица, только до этого часа она была написана неправильно и действовала лишь на визуалы...
все, выложил я в базе скриптов... смотрите.
Привет. Может кто подскажет чего: у меня есть прейсибл типа "Факел". Оч красивый, надо заметить. Крепится к стенам домов. Так вот. Я пытаюсь сделать так, чтобы он загорался на ночь и гас днем. Все, соответственно, делается через:
Ты вот что. Воспользуйся SignalEvent'ом. То есть на Хертбите(HB) арены ставишь лишь проверки дня/ночи. Если "что-то" наступило, то сигнал эвент зажигается (к примеру 3000-день/4000-ночь).
Далее пишешь скрипт в UserDefined арены, где идет разбор: если это эвент 3000, то циклом тушим все факелы. Если эвент 4000, то, соотв, зажигаем в цикле.
Тормозит все это из-за "массовой" команды в один момент RecomputeStaticLighting. Сделай, чтобы каждый факел зажигался/тушился через DelayCommand(n/2, RecomputeStaticLighting()), где n - это циклическая переменная, увеличивающаяся для каждого объекта-факела на 1. Этим ты дашь возможность движку просчитывать освещение и в то же время плавно обрабатывать остальные события (эвенты). Удачи!
Ой, ой, ой. Какие вы все умные =р
---------------
Сорри, просто я удрючен portal serverom=((
Auren[LFL]
Че за оффтоп?!
Конечно умные! Пост завтра удалю. :cruel:
ставится на OnLevelingPlayer(помойму так )
Несколько вопрософф:
1. Как убрать только один вид уммуна, если наложен, скажем, 2 или 3? ActionRemoveEffect из базы скриптов убирает все.
2. Какой стандартный скрипт управляет поведением барда в таверне(есть только TalentBardSong из nw_i0_generic, но если использовать этот талант, бард просто использует умение... Просто стоит с эффектом нот над головой. Смотрится не очень. Может, в официале есть то же, но с анимацией, подходящей для пения?)
3. Как лечится катсценовский баг, когда после окончания оной сцены камера переносится внутрь игрока (в позицию 0, -1, -1)
4. Можно ли вешать локалки на вейпы?
3. Нет такого бага.
4. Можно
Проверял однако)
Интересно, а как сделана система языков?
ну например стоят два полурослика один пишет в толке:
"-halfing: Привет Братишка как дела?"
Другой полурослик это так и видит, а эльф стоящий рядом это видит как:
"Ghbdtn <hfnbirf rfr ltkf?"
Хм... Народ, как на ваш взгяд лучше всего организвоавать поведение простолюдинов(имитация рассудочной деятельности в действиях, не связанных с ПС). Моя идея: он спавн составляется список(требование: все простолюдины должны иметь одинаковый тэг и диалог) типа:
Tarre
А чем тебе не нравится стандартный AMBIENT_ANMATION?
Тот, что отвечает за треп? Он используется, но в другом месте. И вообще хочется до всего дойти самому и создать имитацию кастомный событийности. И сделать лучше, чем биовар (хотя почти ни у кого это не получилось)
Там достаточно гибко ее можно настроить. Взимодействие непися с другими неписями, с плэйсэблами, районы "гуляния"... Чего не хватает?
Если ты за принципиальность нового, то я тебя понимаю. В свое время сам хотел сделать это... но... подумал, сколько времени на это уйдет и решил, что не надо . С меня хватило полного AI хенчши, который, кстати, отлично уже работает ...
У меня такой вопрос:
Можно ли скриптами поменять APPEARANCE брони? Например сменить Neck? Ну как то био-твари это при крафте делают ведь...
Нет, про SetSpawnInCondition() знал и раньше, но с моим английским :-). Лана, попробую. Спасибо.
ЗЫ: EffectDisappearAppear() - попробуй с драконом. Вот такм рельная тема :-)
Долго думал куда притулить этот вопрос решил не плодить тем т.к. вопрос то как раз к скриптам, причем мучает меня довольно таки давно и не только как оказалось меня... (Текст подготавливал заранее - как поему )
{Сподвигло меня на задание сего вопроса две вещи : а) окончание работы над такими веселыми вещами как дульные газы и выброс гильз в огнестреле - вроде работает нормально и б) высказанные некоторыми участниками форумов ВРГ мыслей о модерн-модах в различных темах :ss:}
Итак, я долго думал над этой проблеммой ну и не токо думал пытался даже коечто сам сворганить но это нечто что выше моих сил. Итак, цель наша (надеюсь что наша а пока моя) - достичь полного или частичного реализъма стрельбы из автоматического оружия за счет введения стрельбы очередями. Требования к скрипту :
1) объяснить куда и как его совать ! т.е. не сказать "на он-хит боеприпаса" а именно разъяснить как т.к. в редакторе никакой вкалдки скриптов у Айтемов я вообще не нашол
2) рассчитан на тяжелый/легкий арбалет (соотв. автомат, пистолет-пулемет)
3) что делает : при выстреле первой стрелы (пули) выстреливает рандомно от 2 до 3-4 пуль (кол-во неважно это легко настроить) причем не точно в противника а (по возможности) так ну... кучно вокруг первой причем желательно чтобы они поражали сразу нескольких неписей (ну это уже наверное грань ненаучной фантастики, т.е. сделать можно но выглядеть будет малореалистично, хотя в реале такое конечно возможно. дело в визуальном воплощении сего) и при этом НЕ все стрелы ТОЧНО попадали в целевого НПС (как например стрела мельфа которая всегда бьет в цель даже огиьая препятствия - от так быть не должно)
4) скрипт должен проверять есть ли в ТЭГЕ оружия (т.е. есть ли вы нем ЭТА СТРОЧКА а не сам тэг такой) строчка "avtomat" или "PP" (например 762_akm_avtomat или 9_mp40_PP - это моя система обозначения оружия и патронов)- ну ясно что это значит - и срабатывать только при наличии этой строчки.
5) если будет удовлетворены хотьябы основные запросы (выпуск нескольких стрел после одной) я буду очень рад.
Варианты релиза как ЙА их вижу :
а) фитом типа быстрого выстрела. Тогда все почти пучком только надо приспособить этот фит к арбалетам, в общем неплохая вещь, я могу даж сам сделать наверно, если вы мне скажете в каком файле находится скрипт фита Рапид Схот и как ввести свой новый фит.
б) спеллом. Вариант не лишен своей харизмы чтоли но имеет (разделяя его с первым вариантом) недостаток : все стрелы-пули только ОДНОМУ неписю, а это имхо нехорошо как-то, зачем тогда очередь - не по груповушке ли пулять ? Спелл надо делать естественно свой по типу той ж стрелы мельфа но вопрос : надо чтоб стрела (пуля) летела точно по прямой. Как ?
в) моделью стрелы-в виде нескольких пуль. Идея прожективная, выглядит этот кентавр не очень. Пробовал. Можно конечно но плохо как-то, в том числе из-за соображения опять же попадания всех пуль в одного челокантропа (без промахов) и годится наверно только для дробовика (там уж выхода нет).
г) какй нето ваш собственный вариант даже не берусь сказать какой.
Подозреваю что вещь для опытного скриптера несложная, но беда в том что я не отношусь к ним Плюс объясните или дайте плиз ссылку где сказано где лежат фиты - особенно естественно интересует фит РапидШот и как ихъ клепать.
{Я бросил донимать моделлеров теперь возьмуся за скриптеров }
Фиты если я не ошибаюсь лежат в feats.2da
Ясно что в feats.2da я имел в виду не сами фиты а их скрипты, то как они действуют.
Dark Lord Ни фига то себе... Неа, я, конечно, НВН поковыряю, но... думаю этот вопрос к ДБКоллу и Айс Блейду. Блин. Ужас.
А чо ужас то чо ужас то хочу просто переписать скрипт быстрого выстрела чтобы распространить его на арбалет и увеличить число выстреливаемых стрел... Что такого ужасного ?
Добавлено в [mergetime]1089540633[/mergetime]
А при чем тут АйсБлэйд ? Я не совсем понял, таварищ Айс сам вэд сказал : "Я нэ скриптэр, таварищи !"
Не, просто варианты (а) и (б) явно для 2да специалиста а (в) для моделлера. Скриптерам остается только гипотетический (г)... Ужас в том, что ни обна мылсь насчет этого самого (г) так и не приходит :-)
Хм..у меня тут возник вопрос.
Ситуация такая: небольшая (2х4) локация. Дорога между двумя округами. Хочу, чтобы каждый раз, когда там появлялся игрок появлялась группа бандитов.
Сейчас сделал так: положил энкаунтер. Но проблема в том, что срабатывает только один раз, что меня не устраивает.
вопросы:
- Можно ли решить проблему только энкаунтером, не создавая скрипт спавна бандитов?
- Что происходит с энкаунтером типа "single shot" после спавна? Удаляется? Убирается флажок "active"?
Лекс, можно настроить с интервалом 10 секунд табун орков.
Мне как раз это НЕ НАДО. Надо так: наступил - появились и пока из локи не ушел дальнейшие наступания ни к чему не приводят. Ушел, снова, как попадаешь, наступаешт и дерешся. Во как
imho пока энкаунтер не перебит полностью - новая партия спавниться не должна.
Но в стандартных энкаунтерах есть одна неприятная вещь - если мобы отспавнились, их никто не уберет. Так что хорошей идеей будет доработать стандартный скрипт спавна мобов, чтобы по прошествии некоторого времени проверять - если игроков тут давно не было - убирать мобов. Иначе очень напряжно для шарда, ведь у каждого моба нехилый по объему список скриптов, которые в холостую крутятся. Для примера - посмотри модуль Cormyr'а, там _куча_ спавнов и через сутки-двое сервак просто загибается.
Многие шарды НЕ используют стандартные энкаунтеры (хотя дизайнерам куда проще работать с ними) по причинам глюков и переполнений, которые до сих пор не пофиксили.
Вопрос такой: МОжно ли в НВНе как-то обрабатывать стринги? (то есть отделять от начала стринга 3 символа, добавлять и т.п.)
Да, там есть что то вроде GetStringLeft и Right. Там надо стринг вписать и число. Это число отсчитывает буквы слева или справа стринга
отсчитывает - это значит типа присваивает в переменную букву N слева или справа? Или же она удаляет все до... ?
2GoDoom, скачай лексикон и почитай
Neverwinter Script Source |
GetStringLeft(sYourString, 3); |
Neverwinter Script Source |
SpeakString(GetStringLeft(sYourString, 3)); |
Еще есть функция GetSubString(...) - она более привычна для тех кто учился скриптам на основе Си .
Вообще в NWN-скриптинге достаточно гибкая система работы со стрингами. Так что по сути любая проблема с ними решаема .
ОФФТОП: ДБ, ты знаешь, появилась такая штука(hak), как SetName. Рильная вещь. Теперь можно делать отбивание памяти ПС :-)
ГДЕ???? КОГДА??? В ЧЕМ??? Какой хак?
Я тоже о такой фишке не слышал
Не... GetSubString - я слышал но мне не привычнее... Мне привычнее str_replace и т.д.
Еще вопрос:
Neverwinter Script Source |
string sCheck = "1234567890"; int iCheck1 =GetStringLenght(sCheck); |
С помощью С++ проникают под оболочку НВН и делают такие функции как SetTag, SetName, редактировагние описание и т.д. На ваульте набери SetName.
Если так - то это супер! Облегается много фишек (и тоже самое создание стац. квестов)
Neverwinter Script Source |
string sCheck = "1234567890"; int iCheck1 = GetStringLength(sCheck); |
хы... прокатило
а в слудеющей строчке? (та жа ошибка)
int iCheck2 = GetStringLenght(GetTag(GetItemActivatedTarget()));
хыхы
дык правильно написано (если рядом поставить - один в один)
Добавлено в [mergetime]1089729395[/mergetime]
string sCheck2 = GetStringRight(GetTag(GetItemActivatedTarget(), iCheck2-iCheck1-1);
Терь тута
UNKNOWN STATE IN COMPILER
Neverwinter Script Source |
string sCheck2 = GetStringRight(GetTag(GetItemActivatedTarget()), iCheck2-iCheck1-1); |
Ну привык я к вашему темному фону - на белом ничег оне вижу
ЗЫ
Зато повод получить +ННое кол-во постов
Лекс, ты мне скажи, тебе нужна глобальная карта в модуле? Можно подключить... Тогда проще и случайные боевки прилепить будет...
Нет, мне карта не нужна...если только Айс не сделает большую карту Тсурла и окрестностей, чтобы можно было по ней ходить...
Скрипты стычек мне нужны (точнее просто локи пришли, я гляну). Надеюсь там ты не руками писал спавн-скрипт! Потому как так я тоже могу. Я хочу через энкаунтер.
А мой скромный постинг на предыдущей странице так и остался незамеченным... ДБ будь человеком объясни мне неразумному где ж лежат чертовы фиты вернее их скрипты а лучше - ознакомся с моим постингом выше. Надеюсь на понимание.
Скорее всего это все же движковое... Скриптов на фиты нету... Обрати внимание сам и сделай вывод:
Анимация при некоторых фитах есть такая, которой нет даже среди анимационных констант. Среди скриптов я тоже не нашел ничего, что было бы похоже на "обрисовку" фитов...
Так что надо ждать Айса или орать в Гильдии...
ФЕрштайн. Я пришел к таким же виводам после ОСНОВАТЕЛЬНОГО потрошения в Биф-анпакере. Тогда хоть расскажи как свой фит сделать такой как я просил...
АЙС!
Что нужно делать,чтобы наёмник присоединялся к герою?
См. www.nwnlexicon.com
Lyceum->Tutorial->Advanced Scripting-> Celowin part X Henchmen
Гы...
// Add oHenchman as a henchman to oMaster
// If oHenchman is either a DM or a player character, this will have no effect.
void AddHenchman(object oMaster, object oHenchman=OBJECT_SELF)
Так понятно ? Только это из стандартной помощи Тулсета (там где подсказки в редакторе скрипта), мог бы и поиском по слову henchman или открыв любой модуль кампаний НвН.
Итак, очередные мои вопросы:
1. Есть скрипт:
Neverwinter Script Source |
void main() { object oObject = GetFirstObjectInArea(OBJECT_SELF); while (GetIsObjectValid(oObject)&& GetObjectType(oObject)==1) { if (GetTag(oObject)=="bw_prayer") { AssignCommand(oObject, ActionPlayAnimation(ANIMATION_LOOPING_MEDITATE, 1.0, 9999.9)); DelayCommand(1.0, SetCommandable(FALSE, oObject)); } oObject = GetNextObjectInArea(OBJECT_SELF); } } |
Есть скрипт:
void main()
{
object OS = OBJECT_SELF;
object oPC = GetLastPerceived();
if (!GetIsPC(oPC)) return;
string s1 = "69687";
string s2 = "68787";
string s3 = "234234324324";
string s4 = "24323324";
string sResult;
while (GetDistanceBetween(OS, oPC)<50.0)
{
switch (Random(4))
{
case 0: sResult = s1; break;
case 1: sResult = s2; break;
case 2: sResult = s3; break;
case 3: sResult = s4; break;
}
float fDelay = IntToFloat(Random(5));
DelayCommand(fDelay, SpeakString(sResult));
DelayCommand(fDelay, PlayAnimation(ANIMATION_FIREFORGET_TAUNT));
}
}
но как сделать чтоб строки появлялись с интервалом 15 секунд
пффф... У меня с этим скриптом вообще НВН висит))Попробуй вывод строчек поставить в очередь действий с помощью ActionDoCommand а потом ставь ActionWait(15.0).
Или вообще я не бонял зачем fDelay=IntToFloat ? поставь ее 15 сек.
Т.е. хочешь, чтоб строчки выводились с промежутком в 15 сек, а не по ходу обработки цикла? Тогда делай зарубки на времени: надыбай в базе скриптов на рельсах функцию времени в секундах. Затем заводишь локалку, при начале скрипта присваиваешь ей значение текущего времени в секундах. А к цикул добавляешь условие: если текущее время минус та локалка больше 15. Вот и все.
Добавлено в [mergetime]1090304527[/mergetime]
И вообще зачем тебе это? Разные анимации НПС можно сделать с помощью спавн-флагов, а твоя насмешка ИМХО вообще не нужна...
Тарре, попробуй:
Neverwinter Script Source |
void main() { object oObject = GetFirstObjectInArea(OBJECT_SELF); while (GetIsObjectValid(oObject) && GetObjectType(oObject)==1) { if (GetTag(oObject)=="bw_prayer") { AssignCommand(oObject, ActionPlayAnimation(ANIMATION_LOOPING_MEDITATE, 1.0, 9999.9)); AssignCommand(DelayCommand(1.0, SetCommandable(FALSE, oObject))); } oObject = GetNextObjectInArea(OBJECT_SELF); } } |
Dark Lord & Co Ну вы даёте млин. подобный фит "нормально" сделать в принцепе нельзя:
- Сама система ДнД реализованная в НВН, не позволяет так вести огонь очередями, разве что если стрельба является своего рода mass effect-ом.
- сколько раз можно объяснять, что есть два типа фитов: активные - т.е те что действуют как заклинания (песня барда там, или дыхание дракона) и пасивные - т.е те которые работают сами по себе например та же специализация в оружии или приведённый тобой быстрый выстрел, разница в том что первые имеют скрипт (он же спелл), вторые используют всякие genеric и вызовы движка,- т.е редактированию не подлежат , единственное что позволенно это использовать самопальные константы фитов в модульных скриптах.
Что можно сделать? в теории:
В ХотУ у оружия появилось свойство onHitCastSpell(конечно по умолчанию, никаких арбалетов или луков там не предусмотренно, - но это поправимо ) Суть, идеи - данное свойство выполнит скрипт помимо всего дав нашим скриптерам location цели, с помощью которого они без труда смогут расчитать массовые повреждения в округе. Но возникает проблемма с визуальным оформлением, в частности как заставить заставить все эти пули попасть в цель?.
Выхода я "пока" 2-а:
1. Делать это дело невидимым , помнишь как в старых игрушках огонь из ствола и искры из цели, но ничего между ними.
2. Извращения с системами частиц - что в принцепе может дать тот самый "ожидаемый" результат, но потребует мнооооого гемороя.
В общем ясно сделать полноценно очередь даже в форме быстрого выстрела с увеличенным числом пуль нельзя. Ладно, если понадобится сделаю пулей из нескольких частей (роем пуль) и анимацией самого випона. Кстати, Айс, растолкуй как сделать вот такое :
есть в инвентарике объект, штык, вернее багинет. Есть винтарик. Задача : с помощью УникПауэра на штыке нацепить его на винтарик. Ну все ясно да : проверитьт есть ли в инвентаре винтарик с нужным тегом, удалить штык удаолить винтарик и дать копье сделанное в форме винтарика. У копья УникПауэр который возвращает винтарик и штык. НО ! На одну и ту же винтовку можно надеть разные штыки ! Более того штык и винтарик могут быть КВЕСТОВЫМИ ! Т.е. надо как-то "запоминать" образы винтарика и штыка а затем их восстанавливать в инвентаре причем уже из ДРУГОВО скрипа. ВОТ как ? Заодно расскажи как повесить ЮникПауэр ибо стыдно но до сих пор не допер скрип написать на уник пауэр так-то смог а вот проверить повесив немогу...
У меня такой вопрос: Как сделать так, чтобы стояло 5 камней и от них друг к другу отходил луч, или чтобы он был направлен на NPC.
Подробней, пожалуйста. Вообще, эффект луча - это VFX_BEAM_*** , напр. VFX_BEAM_COLD.
EffectBeam(...);
А как сделать чтобы он от камней был направлен на НПС.
Neverwinter Script Source |
effect EffectBeam( int nBeamVisualEffect, object oEffector, int nBodyPart, int bMissEffect = FALSE ); |
Большое спасибо
Всегда пожалуйста. Приятно иметь дело с вежливым человеком. Все ведь за "спасибо" работаем...
Наверное я прогоняю, но мне пишет "неправильная переменная", если не сложно напишите пример.
Могу ошибаться (пишу в отрыве от тулсета), но вроде так, где oPC - твой ПС, oStone - твой камень.
Neverwinter Script Source |
ApplyEffectToObject(1, EffectBeam(VFX_BEAM_COLD, oStone, 1), oPC); |
Неполучается у меня, или пишет нет точки с запятой, или нет левой скобки,(хотя это всё на месте),или пишет потеря анализатора переменной, или просто ничего в игре не происходит, напишите скрипт уже с переменными, и куда его ставить.
Попробуй на OnHeartbeat камня...
Neverwinter Script Source |
object oPC = GetFirstPC(); ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectBeam(VFX_BEAM_COLD, OBJECT_SELF, BODY_NODE_CHEST), oPC); |
Neverwinter Script Source |
object oPC = GetFirstPC(); ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectBeam(VFX_BEAM_COLD, OBJECT_SELF, BODY_NODE_CHEST), oPC); |
Спасибо, скрипт работает отлично, но мне нужно чтобы он на НПС был направлен, а не на ПК
Тогда
Neverwinter Script Source |
object oNPC = GetNearestObjectByTag("TAG_NPC",OBJECT_SELF); ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectBeam(VFX_BEAM_COLD, OBJECT_SELF, BODY_NODE_CHEST), oNPC); |
Помогите! Срочно! Плиииззз!
Написал совсем детский скрипт на OnUsed стула
Neverwinter Script Source |
void main() { object oPC = GetPCSpeaker(); object oChair = OBJECT_SELF; AssignCommand(oPC, ActionSit(oChair)); } |
object oPC = GetLastUsedBy();
А фапще лучше фот:
Neverwinter Script Source |
void main() { object oPC = GetLastUsedBy(); object oChair = OBJECT_SELF; if (GetIsPC(oPC)) { if (GetIsObjectValid(oChair) && !GetIsObjectValid (GetSittingCreature(oChair))) { AssignCommand(oPC, ActionSit(oChair)); } } } |
Auren, большое сенькс! Заменил GetPCSpeaker на GetLastUsedBy и все заработало! Но я так и не понял в чем разница!
GetPCSpeaker(); - это ПС, участвующий в диалоге.
А GetLastUsedBy(); - это последний использовавший стул.
Для всех:
Обращайте внимание в первую очередь на ее(функции) название и описание (чтобы увидеть его, клините 2 раз по функции, описание появится в субокне редактора). Назначение можно понять уже на этой стадии.
пример: GetPCSpeaker(. . . );
get - вернуть
PC - ПСплейер
Speaker - говорящий.
Итого: вернуть ПС, участвующего в диалоге. Все просто.
Если назначение функции вам непонятно, смотрите в Лексиконе. Если у вас его нет, обязательно скачайте, без него у вас не получиться освоить скриптинг даже на среднем уровне.
ВОПРОС ! Какое событие происходит (если происходит) при ЗАКАНЧИВАНИИ стрел в обойме заряженной в слот и как его отследить ? Очень надою.
Добавлено в [mergetime]1090602099[/mergetime]
Ну или хотя бы при заряжании в СЛОТ очередной обоймы при заканчивании старой.
Хех. Авто перезарядку делаешб? :-)
Как я разумею, каждый раз когда ты берешь стрелу из пучка, срабатывает событие на избятие этой вещи из инвентаря. Тебе надо отследить последнюю стрелу... Хм... Тогда делай так: на это событие ставь фильтр "Если в слоте стрел больше ничего нет", то ДЕЙСТВИЕ. В твоем случае - взять в этот слот еще одну пачку стрел.
Не проверял, но имхо должно работать.
Попробую завтрась. Не, вообще я делаю пятизарядный арбалет. Пока арбалет А то ну что это такое - закончился магазин бластера - а на темпе стрельбы смена магазина не отразилась... Надо ввести смену магазина как полное действие. Почему биотвари не сделали пятизарядный арбалет ?
Добавлено в [mergetime]1090610916[/mergetime]
Да, и еще
У меня есть такой чувак в модуле. Он стреляет по мишени, после 6 выстрелов идет к мишени, "собирает" стрелы, перезаряжается...
(Aiwan: по секрету, этого чувака когда-то делал Баал :ss: )
Эээ... Короче, ты для кого делаешь, для PC или NPC?
Для ПС и для НПС, для всех у кого будет ЗВ-дистантное оружие !
Ну такъ ?
Гмм... Действительно ! Пасиба Тарре за идею
Всегда пожалуйста.
А тогда, как реализовать этакую задержку во время боя ? Имеются идеи как справоцировать ПС произвести некие действия именно когда заканчивается обойма ПРИЧЕМ ИМЕННО С ЦЕЛЬЮ НЕКОТОРОЙ ПАУЗЫ НА "СМЕНУ МАГАЗИНА" - но !желательно конечно чтобы это была своя анимация симены магазина на ! не будет ли эта анимация СРЕДИ БОЯ отображаться как-то не так ? если будет то лучше прросто задержка в действиях ПС (без тайцм-стопа ! просто прекращение атаки на время "перезаряжания" = 1 полное действие !! )
Попробуй так: ловишь событие окончания обоймы, кидаешь на игрока очистку акций, а затем делэй на 1 сек. Все гениальное просто (гениальность не гарантирую, но простота налицо :-) )
Делэй, это задержка относительно того момента, когда срабатывает данный скрипт. Т.е. если в твоем событии стоит:
DelayCommand(3.0, некая команда); то сработает она через 3 секунды.
DelayCommand(3.0, некий Action); попытается занестись в стек акций через 3 секунды.
Вот что хотел спросить. Как можно оорганизовать хотсайл по саб расам? Допустим если в эльфийский городок прибегает игрок с саб расой Drow.
Он юзер дефайнед ставится проверка саб расы? И сразу делать действие - атака?
Хм так ладно, а вот еще что хотел спросить. Можно сделать так чтоб при заходе на шард у игрока с саб расой дроу автоматом выставлялся хостайл на игроков с остальными расами?
Dark Lord
Ну вроде ж как Дроу - враждебная раса. Реализм. Какие секреты?
См. Nordok. Вот смысл
Тут описана хостайловая система на дроу - если дроу видят эльфа то атакуют. ЗЫ: у НПС-дроу должна быть своя фракция.
Используетсямоя система субрасс, которая работает на шарде Энтарион 1.01. Позже, как зпустим 2.0 я выложу всю систему сюда.
Все "SUBRASE_SUB_" заменить на свое... нужное вам =)
Скрипт смотрит стелс, хайд и т.п. и делает чеки.
Ставится на OnPerception дроу...
Используется стандартный AI скрипт "nw_c2_default2".
Neverwinter Script Source |
#include "val_subrace_func" //свою систему субрас void main() { object oPC = GetLastPerceived(); //Check is oPC is PC-Player if(!GetIsPC(oPC) || GetIsDM(oPC)) { ExecuteScript("nw_c2_default2", OBJECT_SELF); return; } int iRacial = GetRacialType(oPC); int iSubRace = SubraseDefineSubrase(oPC); if(GetLastPerceptionSeen() == TRUE) { if(iRacial == RACIAL_TYPE_ELF && iSubRace == SUBRASE_SUB_DROW) { ExecuteScript("nw_c2_default2", OBJECT_SELF); return; } else if(iRacial == RACIAL_TYPE_DWARF && iSubRace == SUBRASE_SUB_DUERGAR) { ExecuteScript("nw_c2_default2", OBJECT_SELF); return; } else if(iRacial == RACIAL_TYPE_ELF) { if(GetStealthMode(oPC) == STEALTH_MODE_ACTIVATED) SpeakString("От менz не спрzчешьсz, трус!"); AdjustReputation(oPC, OBJECT_SELF, -100); AdjustReputation(OBJECT_SELF, oPC, -100); ExecuteScript("nw_c2_default2", OBJECT_SELF); return; } else { if(GetStealthMode(oPC) == STEALTH_MODE_ACTIVATED) { SpeakString("Странно, что это существо нижшей рассы пытаетсzспрzтатьсz! В атаку!"); AdjustReputation(oPC, OBJECT_SELF, -100); AdjustReputation(OBJECT_SELF, oPC, -100); } ExecuteScript("nw_c2_default2", OBJECT_SELF); return; } } else if(GetLastPerceptionHeard() == TRUE) { if(GetStealthMode(oPC) == STEALTH_MODE_ACTIVATED) { SpeakString("Я что то слышал..."); ActionMoveToObject(oPC,TRUE); ActionSpeakString("Вот здесь... Хммм..."); ExecuteScript("nw_c2_default2", OBJECT_SELF); return; } else { ExecuteScript("nw_c2_default2", OBJECT_SELF); return; } } else { ExecuteScript("nw_c2_default2", OBJECT_SELF); return; } } |
Ой ну это ляпнуто у меня клава кривая буквы западают на и в запале чего тока не напечатаешь =)
ЗЫ: а на OnEnter модуля кинуть цикл GetFerstPC....GetNextPC и сверять субрасы??
Пара вопросов по скриптам... рад что нашёл где могу задать:
1. Как в скрипте восстановить количество кастов спелла.//: функцию IncrementRemainingFeatUses() нашёл, есть также DecrementRemainingFeatUses() и DecrementRemainingSpellUses(), а вот IncrementRemainingSpellUses() - такой или подобной почему-то нет, в т. ч. не нашёл и в стандартных инклудах.
2. Как сделать AreaOfEffect, не подверженную диспеллу?// Прописывание её при наложении как ExtraordinaryEffect не помогает...
4. Как узнать, использовался ли при текущем ударе талант-фит Improved Disarm// (например. Power Attack или Expertise легко определить - это режимы...). Это в скрипте для спец-атаки в OnHitCastSpell - одновременно с Дизармом не должно использоваться, по задумке.
При скриптовании и вообще работе с редактором вопросов возникает много, но я выбрал самые труднорешаемые для меня сейчас. Возможно кто уже сталкивался, подскажите.
1. Как в скрипте восстановить количество кастов спелла.//: функцию IncrementRemainingFeatUses() нашёл, есть также DecrementRemainingFeatUses() и DecrementRemainingSpellUses(), а вот IncrementRemainingSpellUses() - такой или подобной почему-то нет, в т. ч. не нашёл и в стандартных инклудах.[QUOTE]
На сколько я знаю, единственный способ (и то в ХотУ) это юзать EffectRest (все эффекты завершенного отдыха, только мгновенно)
У мя тоже вопрос
1. Как узнать ResRef конверсейшна? (если это и есть название которое даешь при создании то см. второе)
2. Почему не запускает конверсейшн:
Neverwinter Script Source |
if(sTag=="FUR_BOSS") { if(GetIsObjectValid(GetItemActivatedTarget())) { SetLocalString(oPC, "furniture", GetResRef(GetItemActivatedTarget())); ActionStartConversation(oPC, "cc_fur_boss", TRUE); //Не пашет } else { FloatingTextStringOnCreature("Данную вещицу можно использовать только на предмет!", oPC, FALSE); //Пашет если не на объект щелкнул } |
Neverwinter Script Source |
AssignCommand(oNPC, ActionStartConversation(oPC, "cc_fur_boss", TRUE)); |
Тут вопрос назрел. Допустим есть сабраса Вампир. Как сделать чтоб он лечился кровью я знаю. А вот как сделать чтоб для него были пагубны вские Healers Kit и Poition'ы ?
Добавлено в [mergetime]1090855183[/mergetime]
Внести изменения в скрипт отвечающий за спелл лечения?
Shad твои вопросы выше среднего. Я с таким не сталкивался, а крутые скриптеры мнрогие отдыхают. Если не ответят на все вопросы сейчас, попозже подними их еще раз. И добро пожаловать к нам на форум
Аваддон, выбирай сабрасу на основе расы андеад.
Или же выдавай шкуру андеда (хотя кажись не в ней дело).
Добавлено в [mergetime]1090869202[/mergetime]
А... Точно.. Упустил из виду
Спасибо, Айв
2GoDoom,
Чего то я вообще не догнал. Конкретнее
Аввадон, запусти обычный модуль (локально) с кучкой зомби (они то UNDEAD по рассе и шкурка UNDEAD'а на них натянута) - и попробуй их полечить клериком
Ну эту фишку что мертвых можно лечить только негативом я еще с балдуры знаю. Ты мне скажи конкретно что с саб расой вампир делать? Это не НПС! Это у игрока такая саб раса. С нпс то все проще.
Так собсна гря также и с поишенами дело обстоит они ведь просто напросто кастуют спелл лечения.
Я тута гляжу собрались такие крутые скриптеры такого уже напридумывали =) А могли бы вы мои ошибки в скриптах подправить, а?
http://www.wrg.ru/forums/index.php?showtopic=370 <== тяпать сюда .... там всё что я написал .... будте добры помогите ошибки в скриптах исправить ... коегде дописать кое где зачеркнуть .... вам это займёт всего нетого - пару минут
А ещё! ищу хорошего скриптера каторому не впадлу написать пару скриптиков - пишите
СПАСИБО ЗА ВНЕМАНИЕ.
Кто-нибудь делал марширующий взвод солдат?
В смысле, чтобы ровно передвигались и не спотыкались
У... Это очень сложно. Помоему почти нельзя, только если натыкать кучу вейпов и пинать каждого к следующему, но это мега геммор ИМХО.
Брр... Сделать всех одним кричем. Лучше плайсом и его двигать. Вот и усе. Не конечно если надо чтобы каждый еще и диалог имел - то ето другое. Ну а так то....
Добавлено в [mergetime]1095157295[/mergetime]
Только анимацию сложно делать, и - учитывая что в НВН поворот осужествляется наскоко я помню *без* анимации - очень интересно посмотреть как такой крич будет поворачиваться А если просто прошагать да по красной плозади клонной - тада именно - одним кричем или плайсом всех солдат.
А мона сделать много тригеров и вейпов. И как солдать на него наступает - проверять че за солдат и направлять его к определенному вейпу
Брррр... Гемор. Не стоит свеч. Имхо.
Самый наименее геморный способ - ActionForceFollowObject
Добавлено в [mergetime]1095177569[/mergetime]
качество не охти, но зато никаких трудностей
В ногу они все равно шагать не будут .
QUOTE |
Сделать всех одним кричем. Лучше плайсом и его двигать. |
QUOTE |
А мона сделать много тригеров и вейпов. И как солдать на него наступает - проверять че за солдат и направлять его к определенному вейпу |
QUOTE |
Брррр... Гемор. Не стоит свеч. Имхо. |
QUOTE |
Самый наименее геморный способ - ActionForceFollowObject |
QUOTE (gor @ Sep 22 2004, 03:17) |
Что есть "кричем?" |
QUOTE (gor @ Sep 22 2004, 03:17) |
Хм, наверное, так что-то получится. Да, геморно |
QUOTE (gor @ Sep 22 2004, 03:17) |
СтОит. Заходишь в город, а там сурово - война, все идут на фронт. Сразу настраивает на нужный лад. |
QUOTE (gor @ Sep 22 2004, 03:17) |
Надо, чтобы просто шла вооруженная группа и было видно, что это организованная единица. Навороченной анимации - не обязательно. |
QUOTE (gor @ Sep 22 2004, 03:17) |
2DBColl. Насчет карты, как в Леворе. Можно сделать так? На плане карта боя, кругом войска - их мышкой перекидываешь, в общем, стратегия. К примеру, оборона города во второй части ХотУ - с такой картой бы смотрелась |
Вот, несколько вопросов возникло... под пол-ворого ночи. Кто знает - подскажите:
1. Как в скрипте восстановить количество кастов спелла.//: функцию IncrementRemainingFeatUses() нашёл, есть также DecrementRemainingFeatUses() и DecrementRemainingSpellUses(), а вот IncrementRemainingSpellUses() - такой или подобной почему-то нет, в т. ч. не нашёл и в стандартных инклудах.
2. Как сделать AreaOfEffect, не подверженную диспеллу?// Прописывание её при наложении как ExtraordinaryEffect не помогает...
3. Как сделать, чтобы Item свободно левитировал в воздухе, и чтобы его из воздуха можно было взять?//Редакторе висит, в игре падает вниз.
4. Как сделать, чтобы работали фиты на Creature Weapon - Improved Critical, Overwhelming Critical, например. У меня не работают.
5. Как сделать, чтобы Creature Weapon наносил одновременно разные типы физического урона (Режущий и колющий и дробящий сразу).// Когда ставлю такие свойства на оружме, или эффект на существо - урон растет но остаетья того же типа, что на базовом предмете оружии.
У меня не работает DelayCommand, если я вызываю его из onDeath и указанное время больше чем примерно 5.0f. Попробуйте вписать себе в onDeath любого НПС следующее:
Neverwinter Script Source |
#include "x2_inc_compon" #include "x0_i0_spawncond" void DoSpawn2(); void main() { int nClass = GetLevelByClass(CLASS_TYPE_COMMONER); int nAlign = GetAlignmentGoodEvil(OBJECT_SELF); object oKiller = GetLastKiller(); // If we're a good/neutral commoner, // adjust the killer's alignment evil if ( nClass > 0 && (nAlign == ALIGNMENT_GOOD || nAlign == ALIGNMENT_NEUTRAL) ) { AdjustAlignment(oKiller, ALIGNMENT_EVIL, 5); } // Call to allies to let them know we're dead SpeakString("NW_I_AM_DEAD", TALKVOLUME_SILENT_TALK); //Shout Attack my target, only works with the On Spawn In setup SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK); DelayCommand( 20.0f, DoSpawn2()); SendMessageToPC(GetFirstPC(), "debug 1"); // NOTE: the OnDeath user-defined event does not // trigger reliably and should probably be removed if ( GetSpawnInCondition(NW_FLAG_DEATH_EVENT) ) { SignalEvent(OBJECT_SELF, EventUserDefined(1007)); } craft_drop_items(oKiller); } void DoSpawn2() { SendMessageToPC(GetFirstPC(), "debug2"); } |
Твоя функция вызывается скорее всего ПОСЛЕ разрушения твоего НПС. Вот посему он ее и не находит после 5 секунд.
Добавлено в [mergetime]1096598585[/mergetime]
Если ты хочешь какой то набор действий, то лучше запускай через DelayCommand отдельный скрипт.
Aiwan
Ок, на счет разрушения. Если ты говоришь так, значит так. Я это допускал. Но объясни мне, как может DelayCommand зависить от существования OBJECT_SELF'а? Это же бред. 5 секунд, примерно изчезают останки с карты и появляется лут, видимо этот отрезок и является ключевым. Но его править не размуно. Опять же, выходит такой кривой движок, если DelayCommand перестает работать после уничтожения объякта, вызвавшего его? Ведь DoSpawn2() никакого отношения к OBJECT_SELF'у не имеет. Не приятно, что через такую жопу всё...
Ты вешаень на НПС команду с зедержкой на 20 сек. А если через 20 сек нет этого НПС, то все. Твоя команда потерялась, так как нет объекта, к которому была привязка..все логично
Лекс, абсолютно прав в своем ответе. И все действительно ЛОГИЧНО.
QUOTE (Twin @ Oct 1 2004, 04:47) |
Проблема в том, что у меня "debug2" не пишет, если понизить время в DelayCommand до 5.0f то напишет, но мне то нужно таймер больше чем минуты делать. Почему так происходит я не знаю, еще очень мало работаю с тулсетом. Может кто подскажет как мне реализовать таймер после убийства НПС, причем я должен иметь доступ к свойствам убиваемого НПС (только для чтения, не для записи). |
QUOTE |
DelayCommand( 20.0f, DoSpawn2()); |
QUOTE (Twin @ Oct 1 2004, 07:24) |
Опять же, выходит такой кривой движок, если DelayCommand перестает работать после уничтожения объякта, вызвавшего его? Ведь DoSpawn2() никакого отношения к OBJECT_SELF'у не имеет. Не приятно, что через такую жопу всё... |
Neverwinter Script Source |
AssignCommand(oKiller, DelayCommand(20.0, ExecuteScript("скрипт с DoSpawn2()"))); |
QUOTE (Twin @ Oct 1 2004, 10:24) |
Я это допускал. Но объясни мне, как может DelayCommand зависить от существования OBJECT_SELF'а? Это же бред. |
Neverwinter Script Source |
DelayCommand( 20.0f, DoSpawn2()); |
Neverwinter Script Source |
void DoSpawn2() { SendMessageToPC(GetFirstPC(), "debug2"); } |
Neverwinter Script Source |
#include "x2_inc_compon" #include "x0_i0_spawncond" void DoSpawn2(); void main() { int nClass = GetLevelByClass(CLASS_TYPE_COMMONER); int nAlign = GetAlignmentGoodEvil(OBJECT_SELF); object oKiller = GetLastKiller(); // If we're a good/neutral commoner, // adjust the killer's alignment evil if ( nClass > 0 && (nAlign == ALIGNMENT_GOOD || nAlign == ALIGNMENT_NEUTRAL) ) { AdjustAlignment(oKiller, ALIGNMENT_EVIL, 5); } // Call to allies to let them know we're dead SpeakString("NW_I_AM_DEAD", TALKVOLUME_SILENT_TALK); //Shout Attack my target, only works with the On Spawn In setup SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK); DelayCommand( 20.0f, ExecuteScript("DoSpawn2", GetFirstPC())); SendMessageToPC(GetFirstPC(), "debug 1"); // NOTE: the OnDeath user-defined event does not // trigger reliably and should probably be removed if ( GetSpawnInCondition(NW_FLAG_DEATH_EVENT) ) { SignalEvent(OBJECT_SELF, EventUserDefined(1007)); } craft_drop_items(oKiller); } |
на такую халаву все горазды отвечать (и я в том числе).
А вот на 5 вопросов Shadа никто ответить даже не пытался..признаюсь, что некоторые (вопросы) ставят меня в тупик.
Ох, сорри. Просто мне очень хотелось верить в то что DelayCommand работает на низком уровне и уж априори не является свойством объекта. Ну нет так нет. Я в тулсете ноль, хотя после ваших ответов уже с палочкой. Спасибо.
2 DBColl:
Я писал авто-респаун НПСей для PW не через энкаунтеры, а по событию смерти. Лут их мне не был нужен, лиш resref и тэг. В итоге так и реализовал, как ты советывал, вешая DelayCommand на "системный" плэйс (чтоб ДМ мог его разломать и все респауны прекратились ).
Shad Пропустил твой пост... тока нашел...
QUOTE (Shad @ Sep 24 2004, 04:32) |
3. Как сделать, чтобы Item свободно левитировал в воздухе, и чтобы его из воздуха можно было взять?//Редакторе висит, в игре падает вниз. |
QUOTE (Shad @ Sep 24 2004, 04:32) |
4. Как сделать, чтобы работали фиты на Creature Weapon - Improved Critical, Overwhelming Critical, например. У меня не работают. 5. Как сделать, чтобы Creature Weapon наносил одновременно разные типы физического урона (Режущий и колющий и дробящий сразу).// Когда ставлю такие свойства на оружме, или эффект на существо - урон растет но остаетья того же типа, что на базовом предмете оружии. |
Такая прозьбы, для опытных мастеров:
Кто исправит мой скрипт для отдыха, а то я уже голову сломал и так, и эдак пробовал, но нифига не выходит Помогите!
Вот собстна сам скрипт:
rest
CODE |
void DestroyFirecamp(object oCampFire=OBJECT_SELF) { // Создаем обгорелое пятно на месте костра и гасим костер object oLandMark=CreateObject(OBJECT_TYPE_PLACEABLE,"plc_weathmark",GetLocation(oCampFire)); // Пятно исчезает через 120 секунд (2 реальных минуты, 1 игровой час). Менять по вкусу AssignCommand(oLandMark,DelayCommand(120.0,DestroyObject(oLandMark))); DestroyObject(oCampFire); } void ApplyRestEffect(object oTarget=OBJECT_SELF) { // Создаем эффекты сна. Функцию править по вкусу. effect eSleep=EffectBlindness(); if (GetRacialType(oTarget)==RACIAL_TYPE_ELF) { // Эльфы едят и пьют другое object FindFood(object oTarget=OBJECT_SELF) { object oEnum=GetFirstItemInInventory(oTarget); while (GetIsObjectValid(oEnum) && (GetTag(oELEnum)!="FOODELVEN")) oEnum=GetNextItemInInventory(oTarget); return oEnum; } object FindWater(object oTarget=OBJECT_SELF) { object oELWATER=GetFirstItemInInventory(oTarget); while (GetIsObjectValid(oELWATER) && (GetTag(oELWATER)!="WATERELVEN")) oEnum=GetNextItemInInventory(oTarget); return oELWATER; } // Эффект сна на 30 секунд. Менять по желанию. ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSleep,oTarget,30.0); } object FindFood(object oTarget=OBJECT_SELF) { object oEnum=GetFirstItemInInventory(oTarget); while (GetIsObjectValid(oEnum) && (GetTag(oEnum)!="FOOD")) oEnum=GetNextItemInInventory(oTarget); return oEnum; } object FindWater(object oTarget=OBJECT_SELF) { object oWATER=GetFirstItemInInventory(oTarget); while (GetIsObjectValid(oEnum) && (GetTag(oEnum)!="WATER")) oWATER=GetNextItemInInventory(oTarget); return oEnum; } |
CODE |
#include "rest" void main() { object oPC=GetLastUsedBy(); if (!GetIsPC(oPC)) return; object oTorch=GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC); if (GetIsObjectValid(oTorch) && (GetTag(oTorch) == "NW_IT_TORCH001") && // Флаг, висящий на области (например в таверне) и позволяющий отдыхать бесплатно (GetLocalInt(GetArea(oPC),"NoCampArea") != TRUE)) { object oFire=CreateObject(OBJECT_TYPE_PLACEABLE,"campfire",GetLocation(OBJECT_SELF)); DestroyObject(OBJECT_SELF); // Огонь гаснет через 900 секунд (15 реальных минут или 7,5 игровых часов) // Менять по желаю AssignCommand(oFire,DelayCommand(900.0,DestroyFirecamp(oFire))); } else { CreateItemOnObject("wood",oPC); DestroyObject(OBJECT_SELF); } } |
CODE |
void main() { object oPC=GetModuleItemLostBy(); if (!GetIsPC(oPC)) return; object oItem=GetModuleItemLost(); if (!GetIsObjectValid(oItem)) return; string sResRef=GetTag(oItem); if (sResRef=="WOOD") { if (GetIsObjectValid(GetAreaFromLocation(GetLocation(oItem)))) { CreateObject(OBJECT_TYPE_PLACEABLE,"woodpile",GetLocation(oItem)); DestroyObject(oItem); } } } |
CODE |
#include "rest" void main() { object oPC=GetLastPCRested(); if (GetCurrentAction(oPC)!=ACTION_REST) return; int iFreeRest=GetLocalInt(GetArea(oPC),"FreeRestArea"); if (iFreeRest) ApplyRestEffect(oPC); else { object oCampFire=GetNearestObjectByTag("campfire",oPC); // нельзя отдыхать дальше 3 метров от костра (расстояние менять по вкусу) if (GetIsObjectValid(oCampFire) && (GetDistanceBetween(oPC,oCampFire)<=3.0)) { object oFood=FindFood(oPC); if (GetIsObjectValid(oFood)) { DestroyObject(oFood); ApplyRestEffect(oPC); } else { FloatingTextStringOnCreature("Мне надо перекусить",oPC,FALSE); AssignCommand(oPC,ClearAllActions()); } } else { FloatingTextStringOnCreature("Я не могу отдыхать далеко от костра",oPC,FALSE); AssignCommand(oPC,ClearAllActions()); } } object oWATER=FindWater(oPC); if (GetIsObjectValid(oWATER)) { DestroyObject(oWATER); ApplyRestEffect(oPC); } else { FloatingTextStringOnCreature("Мне надо попить",oPC,FALSE); AssignCommand(oPC,ClearAllActions()); } } else { FloatingTextStringOnCreature("Я не могу отдыхать далеко от костра",oPC,FALSE); AssignCommand(oPC,ClearAllActions()); } } } object oELFood=FindFood(oPC); if (GetIsObjectValid(oFood)) { DestroyObject(oELFood); ApplyRestEffect(oPC); } else { FloatingTextStringOnCreature("Мне надо перекусить",oPC,FALSE); AssignCommand(oPC,ClearAllActions()); } } else { FloatingTextStringOnCreature("Я не могу отдыхать далеко от костра",oPC,FALSE); AssignCommand(oPC,ClearAllActions()); } } object oELWATER=FindELWater(oPC); if (GetIsObjectValid(oELWATER)) { DestroyObject(oELWATER); ApplyRestEffect(oPC); } else { FloatingTextStringOnCreature("Мне надо попить",oPC,FALSE); AssignCommand(oPC,ClearAllActions()); } } else { FloatingTextStringOnCreature("Я не могу отдыхать далеко от костра",oPC,FALSE); AssignCommand(oPC,ClearAllActions()); } } } |
Хех, ты бы хоть написал, что ты от него хочешь... Хехехе... Во дал! А то, "кто исправит"! Я балдю!
Алучше сделай тестовый модуль и выложи его. С итемами и скриптами.
Вобщем скрип на отдых...
Смысл скрипта вот в чем: игрок кладет из инвентаря дрова, на землю потом поджигает их факелом - появляется модель костра, потом возле костра игрок нажимает rest и тогда скрипт проверяет есть ли у PC еда и вода, если PC эльф, то скрипт проверяет есть ли эльфийская вода или эльфийский паек...
ЗЫ. Выложить модуль пока времени нету... Но постараюсь найти его.
нужен не весль модуль, а только кусочек, где это все вставлено.
Похоже на стандартный отдых. На Эксисе такой точно был (кроме эльфийской части)
Няяя... У меня такой вопрос. В локе City Exterior можно на стенах на махрячить факелов. Когда мы включаем освещение локации clear - факелы не горят, и ночью тожа. А когда Torch Only - горят. Мутил мутил, сравнивал, да так и не понял. Как бы сделать так, чтобы днем было светло, а когда наступала ночь - темнело а на стенах загорались факелы? Тайловые факелы
Аваддон это можно в ХоТУ скриптовыми командами. Какими точно и как я не знаю, не сталкивался.
QUOTE (Аваддон @ Oct 9 2004, 00:14) |
Няяя... У меня такой вопрос. В локе City Exterior можно на стенах на махрячить факелов. Когда мы включаем освещение локации clear - факелы не горят, и ночью тожа. А когда Torch Only - горят. Мутил мутил, сравнивал, да так и не понял. Как бы сделать так, чтобы днем было светло, а когда наступала ночь - темнело а на стенах загорались факелы? Тайловые факелы |
Привет, Aiwan. А я уже почти и перестал надеятся.(вру)
QUOTE (Aiwan @ Oct 2 2004, 08:30) |
Shad Пропустил твой пост... тока нашел... Никак. Вся инфа об итемах и простых предметах на арене находится в вайлах локации. А изменение координаты Z можно лишь через тулсет. Но можно сделать невидимый объект на уровне тайлов, с возможностью ходить по нему. Тогда это будет невидимый объект - пъедестал, который будет тормозом для игрока. Есть еще способ, он проще но есть но. Делаешь в Махе два предмета с разными координатами и размерами. Например как картины в НВН. Основание далеко внизу а макушка видимая вверху, в виде pls объекта. Затем дестрой-крет в инвентаре твой итем. Но Объект будет активным скорее всего весь, так что тут свои изъяны. |
QUOTE (Aiwan @ Oct 2 2004, 08:30) |
А вообще, сделать что то в НВН красиво и без изврата не возможно. |
QUOTE (Aiwan @ Oct 2 2004, 08:30) |
Это все редактирование 2Да. Что именно и возможно ли все что ты просишь я не знаю. Но из логики работы с редактором могу сказать только одно. Любое действие, то бишь тот же урон, есть такой же Action как и многое другое. Следовательно он становится в очередь при механике боя, при расчете кубиков. И поэтому он возможен только один, а не вся куча критикалов. Ведь правила ДнД вшиты круто в движок и многое не выдрать. |
QUOTE (Aiwan @ Oct 2 2004, 08:30) |
И скажу на последок вот что. Многие вопросы твои сложны, но для модуля они не нужны. можешь спорить со мной можешь не спорить. Это вопросы человека залезшего в тулсет и решившего поковырять его круто для себя. Но реально они игроку будут до жопы. Ему наплвать на все критикалы и прочее, ему подавай атмосферу, сюжет, красивости и прочее. Те вещи что ты ковыряешь съедают львиную долю возможностей твоих как изготовоителя модуля. В итоге не останется сил на завершение и ты можешь погрязнуть в неосуществимых мечтах и планов. Подумай десять раз, стоит ли твой гемморой стольких свечь или нет? |
QUOTE (Aiwan @ Oct 2 2004, 08:30) |
п.с. Не обижайся, если я резковато ответил |
QUOTE (Aiwan @ Oct 2 2004, 08:30) |
А вообще, чем занят? |
QUOTE (Aiwan @ Oct 2 2004, 08:30) |
Может поделишься инфой? |
2 Shad я уж думал ты пропал
QUOTE (Shad @ Oct 9 2004, 11:58) |
Если я правильно ли понимаю...: тут для всех типов физического урона есть одна на всех "ячейка", и при расчёте только идентификатор одного из них проходит как параметр этого "действия"? |
QUOTE (Aiwan @ Oct 9 2004, 10:02) |
2 Shad я уж думал ты пропал Я думал ты делаешь проект. Или делаешь? Жаль, что много людей интересуются разными вещами и очень мало, а точнее почти никто , не доделал свой проект. Это связано не с трудностями тулсета, а с переоценкой возможностей или пропажей интереса. |
Хотелось бы реализовать системку чтобы чар уставал со временем. Удачно ли будет это делать на Hearbeat? Или есть предложения по реализации?
QUOTE (Аваддон @ Oct 14 2004, 17:49) |
Хотелось бы реализовать системку чтобы чар уставал со временем. Удачно ли будет это делать на Hearbeat? Или есть предложения по реализации? |
Neverwinter Script Source |
if (GetFormatTimeLastRest(oPC)+15часов > GetFormatTime()) { if (!GetHasWakeEffect(oPC)) { ............. и т.д. } } |
QUOTE (Shad @ Oct 9 2004, 08:58) |
Пока ElemLab.rar (щас найду где тут Upload) не вполне работает. Но, ты прав, я уже устал исправлять, пока не узнаю что работка кому-то интересна. |
Shad щас, гляну
Ой блин! У меня ж нету Тулсета... Но солью все равно
QUOTE (Aiwan @ Oct 17 2004, 08:22) |
Shad щас, гляну Ой блин! У меня ж нету Тулсета... Но солью все равно |
Мир вам!
Не получается отследить нанесение чаром или мобом "критического удара" для последующего запуска собственной процедуры.
Вообще это реализуемо? Если да, то как?
Спасибо.
Ай нид хелп..
Вот скрипт и тут есть фича с регистрацией аккаунта на шарде..так вот как ее отсечь без вреда скрипту?(ка я понял там еще есть некоторые действия)
CODE |
void main() { PGSModuleClientEnterEvent (GetEnteringObject()); object oPC = GetEnteringObject(); object oEmote = GetItemPossessedBy(oPC, ITEM_TYPE_EMOTEWAND); object oDMring = GetItemPossessedBy(oPC, "dmfi_onering"); object oObject = GetItemPossessedBy(oPC, sSTR_013); object pl; string sName = GetPCPlayerName(oPC); string sFName = GetName(oPC); string sDMName = GetPCPlayerName(oPC); string sKey = GetCampaignString(SECURITY, sName); string sPL1 = GetCampaignString(SECURITY, sName+"player1"); string sPL2 = GetCampaignString(SECURITY, sName+"player2"); string sPL3 = GetCampaignString(SECURITY, sName+"player3"); int iAlignment = GetAlignmentGoodEvil(oPC); int a; int b; int d; int iDHP; int iMHP = GetMaxHitPoints(oPC); int nomer=StringToInt(GetDeity(oPC)); int prenomer=0; if (GetIsPC(oPC) && !GetIsDM(oPC)) { SetPlotFlag(oPC, FALSE); SendMessageToPC(oPC, sSTR_005); // if (sPL1==sFName) {prenomer=1;} else if (sPL2==sFName) {prenomer=2;} else if (sPL3==sFName) {prenomer=3;}; // if ((nomer==0)&&(prenomer!=0)&&(GetCampaignString(CHAR_DATA,sName+"player"+IntToString(prenomer)+"VISIT")=="")) { SetCampaignString(CHAR_DATA,sName+"player"+IntToString(prenomer)+"VISIT","TRUE"); SetDeity(oPC,IntToString(prenomer)); nomer=prenomer; a=0; for (d = 1; d <=GetCampaignInt("player_list","count"); d++) { if (a==1) continue; if (GetCampaignString("player_list",IntToString(GetCampaignInt("player_list","count")))!=sName){} else {a=1;}; }; if (a!=1) { SetCampaignInt("player_list","count",(GetCampaignInt("player_list","count")+1)); SetCampaignString("player_list",IntToString(GetCampaignInt("player_list","count")),sName); }; }; // if ( (GetPCPublicCDKey(oPC) == sKey)&&(nomer==prenomer)&&(nomer!=0)) { if (oEmote == OBJECT_INVALID) CreateItemOnObject(ITEM_TYPE_EMOTEWAND, oPC, 1); switch (iAlignment) { case ALIGNMENT_GOOD: if (GetCampaignInt(GOOD_EVIL,sFName+sName) != 1) SetCampaignInt(GOOD_EVIL,sFName+sName,1); break; case ALIGNMENT_EVIL: if (GetCampaignInt(GOOD_EVIL,sFName+sName) != 2) SetCampaignInt(GOOD_EVIL,sFName+sName,2); break; default: if (GetCampaignInt(GOOD_EVIL,sFName+sName) != 3) SetCampaignInt(GOOD_EVIL,sFName+sName,3); break; } pl = GetFirstPC(); b = GetCampaignInt(GOOD_EVIL,sFName+sName); while ( pl != OBJECT_INVALID) { if ((!GetIsDM(pl))&&(pl!=oPC)) { a = GetCampaignInt(GOOD_EVIL,GetName(pl)+GetPCPlayerName(pl)); if ((a!=b)&&(a!=2)&&(b!=2)) ActionDoCommand(SetPCDislike(oPC,pl)); }; pl=GetNextPC(); } //ExecuteScript ("ats_client_enter",oPC); SetLocalString(oPC,"acc",GetPCPlayerName(oPC)); int iHP = StringToInt(GetCampaignString(CHAR_DATA,GetPCPlayerName(oPC)+"player"+IntToString(nomer)+"HP")); if (iHP != 0) { if (iHP<iMHP){iDHP=iMHP-iHP;ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(iDHP), oPC);} else if (iHP>iMHP) {iDHP=iHP-iMHP; ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectTemporaryHitpoints(iDHP), oPC,30.0);} }; if (GetIsDead(oPC)) { SetLocalInt(oPC,"autokill",1); location lLoc = GetCampaignLocation("bd_locations",sFName+sName); AssignCommand(oPC,ActionJumpToLocation(lLoc)); }; /*Vnesenie akkauntov v spisok player_list a=0; for (d = 1; d <=GetCampaignInt("player_list","count"); d++) { if (a==1) continue; if (GetCampaignString("player_list",IntToString(GetCampaignInt("player_list","count")))!=sName){} else {a=1;}; }; if (a!=1) { SetCampaignInt("player_list","count",(GetCampaignInt("player_list","count")+1)); SetCampaignString("player_list",IntToString(GetCampaignInt("player_list","count")),sName); }; */ } else{BootPC(oPC); SetLocalInt(oPC,"bootexit",1);} } else if (GetIsDM(oPC)) { if (GetCampaignString(DM_VAULT, sDMName) == GetPCPublicCDKey(oPC)) { SendMessageToPC(oPC, sSTR_038); if (oDMring == OBJECT_INVALID) { CreateItemOnObject("dmfi_onering", oPC, 1); } } else { BootPC(oPC); PrintString("Someone with IP: " + GetPCIPAddress(oPC) + " tryed to enter as a DM '" + GetPCPlayerName(oPC) + "'!"); } } } |
Черный Ярл
QUOTE (Черный Ярл @ Oct 19 2004, 01:40) |
Не получается отследить нанесение чаром или мобом "критического удара" для последующего запуска собственной процедуры. Вообще это реализуемо? Если да, то как? |
Shad я посмотрел твой модуль. МОЛОДЕЦ!
Признаюсь честно, в ХоТУ я не гамал, эпик спеллы не знаю Но то что видел у тебя мне понравилось!
QUOTE (Aiwan @ Oct 23 2004, 18:10) |
Shad я посмотрел твой модуль. МОЛОДЕЦ! Признаюсь честно, в ХоТУ я не гамал, эпик спеллы не знаю Но то что видел у тебя мне понравилось! |
Все нормально. Если уж наши слова спам, то я Испанский Летчик
Может ты бы оформил свой модуль как ссылку и в тему полезных ссылок поставил?
Вопросик..
В каком модульном свойстве стоит система лута?
Лут не в модульных свойствах. Он в OnDeath крича.
QUOTE (DBColl @ Oct 25 2004, 18:35) |
Лут не в модульных свойствах. Он в OnDeath крича. |
Не подскажут ли мастера тулсета: Как сделать цикл перебора всех карт в модуле? Что-то я рылся в функция, рылся - ничего не нашел. Вся беда в том, что невозможно присваивать свою величину перепенной типа object
А нельзя циклом прогнать объекты, и определить их тип как area?
Тобур Если можно достучатся до файлов на диске, ResRef-ы карт в файле module.ifo хранятся подряд, возможно это можно использовать.
Можно использовать объекты со специфическим тегом ("sequence_xx") и пробегать по ним.
Shad
До ерф-файлов и module.ifo из игры не достучаться.
QUOTE (Тобур @ Oct 25 2004, 23:38) |
Вся беда в том, что невозможно присваивать свою величину перепенной типа object |
QUOTE (Aiwan @ Oct 26 2004, 00:04) |
А нельзя циклом прогнать объекты, и определить их тип как area? |
Neverwinter Script Source |
object oWP, oArea; while (GetIsObjectValid(oWP = GetObjectByTag("WP_ID_AREA", n))) { oArea = GetArea(oWP); ....//здесь делаешь с локой то, что тебе надо от перебора n++; } |
QUOTE (DBColl @ Oct 26 2004, 03:34) |
??? Это что значит нельзя?! Кто сказал такую чушь? SetLocalObject(...) нельзя делать??? Или я не понял?.. |
QUOTE (Тобур @ Oct 26 2004, 07:41) |
Объясню для чего мне нужен цикл по картам: дело в том, что на Сиале при сохранении положения персонажа, запоминается тэг локации. Если тэг одинаковый у двух карт, то с восстановлением положения могут быть проблемы. |
QUOTE (Тобур @ Oct 26 2004, 04:41) |
object oMod = GetModule(); int i = 1; SetLocalObject(oMod,"CurMap",i); |
QUOTE (DBColl @ Oct 26 2004, 09:30) |
Хех, так в чем проблема запоминать НЕ ТЭГ ЛОКИ, а ЕЕ ОБЪЕКТ?! Уникально. Независимо от тэга?.. Возвращение перса опять-таки делать не по тэгу локи, а по ее объекту... <small>Добавлено в [mergetime]1098772792[/mergetime]</small> К тому же, обрати внимание на функцию ObjectToString(object oObj); |
QUOTE |
QUOTE (Тобур @ Oct 26 2004, 04:41) object oMod = GetModule(); int i = 1; SetLocalObject(oMod,"CurMap",i); Это мне вобще непонятно Как это объекту можно присвоить числовое значение? |
QUOTE (Тобур @ Oct 26 2004, 18:49) |
Короче, я понял, что тут никто толкового сказать не может |
QUOTE (Тобур @ Oct 26 2004, 18:49) |
Еще раз повторю - нету в НВН ни функции типа GetNextObjectInArea (только InModule), ни константы OBJECT_TYPE_ для ареи, чтобы выделить из массы объектов именно карту. |
QUOTE (Тобур @ Oct 26 2004, 18:49) |
Потому что при добавлении новой карты все индексы перестраиваются и со сменой версии модуля игрок может оказаться или не там, где выходил или вообще в стартовой локации. |
QUOTE (Тобур @ Oct 26 2004, 18:49) |
Главный мой вопрос - как присвоить переменной типа Object какое то значение, не не пользуясь ссылкой. |
QUOTE (Тобур @ Oct 26 2004, 07:41) |
Через ресрефы тоже плохо - они все разные |
QUOTE (Тобур @ Oct 26 2004, 07:41) |
Поэтому я хотел вывести тэги всех карт в текстовый файл или файл БД и потом каким - нибудь стандартным средством определить задвоение. |
QUOTE (Shad @ Oct 27 2004, 00:34) |
Можно сохранять ResRef для подтверждения правильности локации. |
Я извиняюсь за резкость. Я не правильно выразился и благодарен тем, кто откликнулся. Уважаю ваш сайт и форум за нейтральность по отношению к шардам и их разборкам и открытость по отношению к игрокам. Ваш форум - это своеобразная "нейтральная территория", накоторой могут общаться все коммьюнити НВН.
Решение я нашел такое: Я сохраняю в БД какую-то локацию, потом каким-то внешним редактором (в моем случае FoxPro) правлю DBF файл и соэдаю в нем 64000 записи с последовательно увеличивающимся индексом и названием переменной (В моем случае MAP1 , 2 и т.д.), в которой присутствует индекс. Затем в скрипте загрузки модуля вставляю следующий текст:
void CheckAreaTag()
{
object oMod = GetModule();
int iCur = GetLocalInt(oMod,"CurCount");
if (iCur < 64000)
{
WriteTimestampedLogEntry(" ~ Continue ~ "+IntToString(iCur));
int iBegin = iCur;
iCur = iCur +2000;
SetLocalInt(oMod,"CurCount",iCur);
object oArea;
object oTemp;
location lLoc;
string sVarName;
int i;
for (i = iBegin; i < iCur; i++)
{
sVarName = "MAP"+IntToString(i);
lLoc = GetCampaignLocation("TEST",sVarName);
oArea = GetAreaFromLocation(lLoc);
if (GetIsAreaNatural(oArea)!=AREA_INVALID)
WriteTimestampedLogEntry(sVarName + " id "+IntToString(i)+" ; "+"object "+ObjectToString(oArea)+" ; "+GetTag(oArea)+" ; "+GetName(oArea)+" ; "+GetResRef(oArea));
}
DelayCommand(2.0f, CheckAreaTag());
}
else
WriteTimestampedLogEntry(" ~ End ~ "+ IntToString(iCur));
}
void main()
{
WriteTimestampedLogEntry(" ~ Begin check area tag ~ ");
CheckAreaTag();
}
Получившийся текстовый лог-файл открываю в Exсel-e и сохраняю как таблицу (поля я специально разделяю знаком ; , так как Exсel понимает этот знак как разделитель. Дальше уже в Exсel-e можно сортировать , фильтровать и анализировать записи. Таким же образом можно получить сводную информацию обо всех объектах, находящихся на картах в модуле (не в палитре), например о НПС и плэйсэйблах
Тобур даже я вчера до двух ночи голову ломал. Зря ты так
QUOTE (Тобур @ Oct 27 2004, 10:52) |
Я извиняюсь за резкость. Я не правильно выразился и благодарен тем, кто откликнулся. Уважаю ваш сайт и форум за нейтральность по отношению к шардам и их разборкам и открытость по отношению к игрокам. Ваш форум - это своеобразная "нейтральная территория", накоторой могут общаться все коммьюнити НВН. |
Тобур
Все ок . Ты - взрослый человек.
По делу... А дальше что? Ну есть у тебя экселевский файл. И что с ним делать дальше? Я думал тебе данные нужны для обратного использования потом в скрипте...
Изначально моя цель была найти карты, у которых совпадают тэги. Для этого мне надо было получить список тэгов всех карт в модуле - я его получил, хоть и извращенным способом. После этого достаточно отсортировать в экселе таблицу по полю тэга и пробежаться взглядом по ней, чтобы найти задвоенность (дубляж) тэга. Я нашел в 470 картах 4 дубляжа - это тот результат, который я и хотел получить
Менее извратный способ - создать 2дашку и забивать в нее таги(или ресрефы) локаций. Всего то делов остается - пробежать все строчки одного столбца( с тагами карт )
Вот, кстати, ещё одно решение. Придумал днём, пока в инет доступа небыло: Можно взять теги прямо из файлов *.are модуля, так сказать напрямую. Я просмотрел несколько (5) файлов карт, из кампаний и новосозданого модуля. Во всех теги хранились после последовательности Tile_AnimLoop3 ровно через 6 байт.
QUOTE (Shad @ Oct 28 2004, 01:07) |
Вот, кстати, ещё одно решение. Придумал днём, пока в инет доступа небыло: Можно взять теги прямо из файлов *.are модуля, так сказать напрямую. Я просмотрел несколько (5) файлов карт, из кампаний и новосозданого модуля. Во всех теги хранились после последовательности Tile_AnimLoop3 ровно через 6 байт. |
Вопрос. Как убрать ВСЕ из инвентаря (нет ли функции соответствующей, аль чето такого)?
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)