Собственно, как сделать так, что, например, при десятом использовании предмета рандомно срабатывал один из каких-нибудь ранее заложенных баффов. К примеру, лекарство, которое после 19-ого раза может начать вызывать привыкание, или голова от него может пойти кругом, или начнут плясать зеленые человечки. Стукнуть бы вас что ли...
Можно сделать так, чтобы при использовании предмета бафф, даваемый им, стакался. Допустим, на вас вешается бафф "Лекарство", который при каждом новом использовании добавляет к себе стак. Когда стак достигнет отметки "19", срабатывает скрипт, который активирует 1 из рандомных дебаффов. Пока код дать не могу, т.к. на даче, а в ручную написанный скрипт может не сработать.
Может ли ГХИ учитывать итемы в игровом инвентаре? а то во время рыбалки в Тернистой долине родилась мысль: выловить 4 [Изорванная ткань], 8 [Палочка], 12 [Спутанная леска] и соорудить из них дрянную, но палатку, посредством гхи-предмета, который проверит в игровом инвентаре нужное кол-во итемов и произведет еще один гхи-предмет и выдаст эмоут типа: "... сооружает палатку из подручных материалов." )))
Сообщение отредактировал deenar - Суббота, 14.08.10, 20:02
deenar, очень просто. Сначала создаете "палатку". Это думаю описывать не надо. Создаете предмет-собиратель, допустим "предмет-собиратель".
1) Добавляем действие Requirement (это будет нашим условием) В списке условий выбираем LUA Statement В поле Requirement Filter вводим GetItemCount("Изорванная ткань")>3 and GetItemCount("Палочка")>7 and GetItemCount("Спутанная леска")>11 В поле Requirement Detail вводим... допустим "много хлама"
2)Затем добавляем действие Produce item и нажав на Сhoose Item выбираем "палатку". В списке действий в столбце Run when req выбираем is FORFILLED вместо Run Always
3)Добавляем действие Expression с текстом "собирает палатку из палочек лески и дырявых тряпок.". В списке вместо SAY выбираем EMOTE В списке действий в столбце Run when req выбираем is FORFILLED вместо Run Always
4)Добавляем действие Message с текстом "Не хватает компонентов". В списке вместо Chat Frame выбираем Error Message. В списке действий в столбце Run when req выбираем is NOT FORFILLED вместо Run Always
Готово.
Ушел.
Сообщение отредактировал Бизл - Суббота, 14.08.10, 23:59
Вопрос такого вот плана. Нужно сделать предмет в единичном экземпляре, который с каждым использованием заканчивается/теряет силу/нечто подобное, и причем при каждом следующем использовании выдает разный эмоут пока не кончится. Пример:
Бутылка вина. При первом использовани выдает что-тов роде: - "Имя" с удовольствием отпил немного вина из бутылки. В ней еще много осталось, наслаждайтесь! Далее, при втором использовании: - "Имя" с удовльсвием отпил немного вина. Бутылка наполовину полна... или пуста? И в таком вот духо до последнего эмоута, при котором Бутылка вина заменяется на пустую бутылку. - "Имя" допивает остатки вина. Жаль, что напитка не осталось...
Когда я создавал ГХИ_Дефибриллятор, я искусственно реализовал механизм "зарядов". Думаю в этом случае он тоже будет очень удобен!
Значит-с, создадим бутылку гномьего виски и назовем ее: "Бутылка Гномьего Виски". White Text 2 напишем изначальное кол-во зарядов: "Заряды: 3" - этот текст будет изменяться с каждым глотком =) Остальные поля заполняйте, как вам хочется.
Теперь используя ID узнаватель... узнаем ID нашей бутылки.
Теперь добавим действием относительно простой скрипт:
charges=3
Затем добавляем новое действие-скрипт:
ID="Бизл_81967844" local Emotes={ "допивает остатки вина. Жаль, что напитка не осталось...", "с удовльсвием отпил немного вина. Бутылка наполовину полна... или пуста?", "с удовольствием отпил немного вина из бутылки. В ней еще много осталось, наслаждайтесь!" }
function RemoveCharge(count) charges=charges-count local script={""} script[1]="charges="..charges GHI_ItemData[ID].rightClick[1].code[1] = script[1] if(charges~=0)then GHI_ItemData[ID].white2 = "Заряды: "..charges else GHI_ItemData[ID].white2 = nil GHI_ItemData[ID].name = "Пустая Бутылка Гномьего Виски" GHI_ItemData[ID].comment="Ничего не осталось..." end end
if(charges~=0)then SendChatMessage(Emotes[charges],"EMOTE",nil) RemoveCharge(1) else SendChatMessage("осматривает бутылку на наличие остаточного алкоголя", "EMOTE",nil) end
Синим у нас обозначен ID нашего предмета Красным - строки выдаваемых эмоций в кавычках и через запятую, причем начиная с последней. И не забывайте что их количество должно соответствовать количеству зарядов, которые описываются переменной charges (в нашем примере зарядов - три) Зеленным выделено имя для разряженного предмета, а Серым - приписка разряженного предмета(та, что желтого цвета) Оранжевым - реплика при взаимодействии с пустой бутылкой.
Если напиток не дворфийский и зарядов в нем... скажем 10, то мы просто меняем переменную charges в первом скрипте и добавляем нужные строки в таблицуEmotes={}
Механика предмета такова, что на нулевом заряде он не заменяется другим, а просто меняет некоторые параметры (имя и коммент). Так что вы всегда можете вернуть свою бутылку. Для этого просто верните имя, строку "Заряды" в white2 и, отредактировав скрипт, установите переменную charges на начальное значение (у пустой она будет равна 0, хотя в таблице действий написано будет иначе)
Вроде все.
Ушел.
Сообщение отредактировал Бизл - Понедельник, 16.08.10, 17:23
М-м-м-м-м....Бизл,а можно ли сделать такой предмет чтобы при активации другой предмет (связанный с ним и созданный мной) пропадал не только у меня из сумки,но и у других? Всегда ваш, шкипер Чернокрут.
М-м-м-м-м....Бизл,а можно ли сделать такой предмет чтобы при активации другой предмет (связанный с ним и созданный мной) пропадал не только у меня из сумки,но и у других?
Можно... в принципе... Взаимодействие ГХИ вещей и их обладателей реализуется с помощью подключения дополнительного канала =) Но чтобы вещь скрыто подсоединила обладателя предмета к этому каналу потребуется чтобы он хотя бы 1 раз использовать ее. Т.е. я имею ввиду, что после передачи вещи вы не можете никак с ней "связаться" пока новый обладатель не кликнет по ней. Да и в случае если обладатель релогнется/десконекнится или иными способамми выйдет из игры то при входе в игру ему надо будет кликнуть вновь... для восстановления связи.
Если вас сие устраивает я начну писать скрипт незамедлительно =)
Альттаир, вот что надо сделать. Сначала создаем вещь, которую ты планируешь передавать. Пусть это будет "Волшебный Кристалл". Узнаем ID с помощью ID узнавателя Pilus'a. (Улке описывала его на второй странице сообщение #20) Создаем ей действие - скрипт со следующим брутальным содержанием:
local ID; local n = this:GetName(); if strsub(n,0,12) == "GHIContainer" then local bag = this:GetParent():GetID(); local slot = this:GetID(); local info = GHI_GetContainerInfo(bag,slot); ID = info.ID; elseif strsub(n,0,11) == "GHIMultiBar" then ID = this.itemID; else GHI_Message("Could not identify source ID"); return; end; local info = GHI_GetRightClickInfo(ID); local t={}; if type(info) == "table" then for i=1,#(info) do if info[i].id == "ТВОЙАЙДИ_12345678" and info[i].dynamic_rc_type == "produce_item" then t=info[i]; end end end GHP_Test_ConsumeItem_v1 = function(ID,amount) local bag,space = GHI_GetFreeSpace(); local t = GHI_FindItem(ID,true); local _,_,_,_,_,_,stackSize = GHI_GetItemInfo(ID); if not(ID) or not(stackSize) or not(amount) then return; end; while amount > 0 and GHI_CountItem(ID) > 0 do local smallest_amount,bag,slot; if type(t) == "table" then for i=1,#(t) do local info = GHI_GetContainerInfo(t[i].bag,t[i].slot); if info and info.amount then if not(smallest_amount) or (info.amount < smallest_amount) then smallest_amount = info.amount; bag = t[i].bag; slot = t[i].slot; end end end if bag and slot then if GHI_ContainerData[bag][slot].amount then GHI_ClearCountItemCatche(); if GHI_ContainerData[bag][slot].amount > amount then GHI_ContainerData[bag][slot].amount = GHI_ContainerData[bag][slot].amount - amount; amount = 0; else amount = amount - GHI_ContainerData[bag][slot].amount; GHI_ContainerData[bag][slot] = nil; end end end end end GHI_UpdateContainers();end
И вместо "ТВОЙАЙДИ_12345678" вставляй... твой id =)
Затем добавь еще один скрипт:
ItemID="Бизл_81976334" JoinChannelByName("Crystal"); id = GetChannelName("Crystal");
function StopS() Traker:UnregisterEvent("CHAT_MSG_CHANNEL"); Traker=nil end
function StartS() Traker = CreateFrame("Frame", nil, UIParent); Traker:SetScript("OnEvent", function() Crys() end); Traker:RegisterEvent("CHAT_MSG_CHANNEL"); end
if Traker == nil then StartS() SendChatMessage("вглядывается в глубины кристалла, но ничего не происходит...","EMOTE",nil) else SendChatMessage("вглядывается в глубины кристалла, но ничего не происходит...","EMOTE",nil) end
function Crys() if(event=="CHAT_MSG_CHANNEL")and(arg8==id)then if(arg1=="delete")and(arg2=="Бизл")then StopS() SendChatMessage("с удивлением смотрит на то, как кристалл растворяется!","EMOTE",nil) GHP_Test_ConsumeItem_v1(ItemID,1) end end end
Вместокрасного текставставляй свой ID. Вместо синего - эмоцию при действии. Вместо фиолетового - твой игровой ник, чтобы нарушители не могли воспользоваться привелегиями канала =)
Теперь создай магический удалятель. Назовем его "Магический Удалятель".
Добавляй действие-скрипт: JoinChannelByName("Crystal"); id = GetChannelName("Crystal"); if(id~=0)and(id~=nil)then SendChatMessage("delete","CHANNEL",nil,id) end
Самое время испытать устройство с другом... только важно всегда иметь при себе копию исчезающего кристалла, чтобы не делать его заново =)
Из уважения к Автору функции GHP_Test_ConsumeItem_v1 следует отметить что скрипт в спойлере был наглом мною скопипастен. И из уважения к Улке следует отметить, что большая часть EventHandler'а скопирована со скрипта рации и отредактирована под данный случай. :О
Ушел.
Сообщение отредактировал Бизл - Понедельник, 16.08.10, 19:19