//TESH.scrollpos=0
//TESH.alwaysfold=0
globals
group ReturnGroup = null
endglobals
function GetUnitsOfType takes integer unitid returns group
local group g = CreateGroup()
local unit FoG
local integer index = 0
set ReturnGroup = CreateGroup()
loop
call GroupEnumUnitsOfPlayer(g, Player(index), null)
loop
set FoG = FirstOfGroup(g)
exitwhen FoG == null
call GroupRemoveUnit(g, FoG)
if GetUnitTypeId(FoG) == unitid then
call GroupAddUnit(ReturnGroup, FoG)
endif
endloop
set index = index + 1
exitwhen index == bj_MAX_PLAYER_SLOTS
endloop
call DestroyGroup(g)
set g = null
return ReturnGroup
endfunction
function SetCameraZ takes real z, player p returns nothing
if GetLocalPlayer() == p then
set z = GetCameraField(CAMERA_FIELD_ZOFFSET)+z-GetCameraTargetPositionZ()
call SetCameraField(CAMERA_FIELD_ZOFFSET,z,- 0.25)
call SetCameraField(CAMERA_FIELD_ZOFFSET,z,0.25)
endif
endfunction
Name | Type | is_array | initial_value |
AbiRuf | abilcode | Yes | |
AngstelfenGruppe | group | No | |
BergbauInteger | integer | No | |
BergbauPoint | location | Yes | |
BergbauUNDSchatzItemTyp | itemcode | Yes | |
BoolExtraDmg | boolean | No | |
BoolGefaengnis | boolean | No | |
BoolKrallen | boolean | No | |
BoolManaGeist | boolean | No | |
BoolPflanzeDunkel | boolean | No | |
BoolPflanzeGruen | boolean | No | |
BoolPflanzeMedizin | boolean | No | |
BoolPflanzeRot | boolean | No | |
BoolQuestBed | boolean | Yes | |
BoolSchloss1 | boolean | No | |
BoolSchloss2 | boolean | No | |
BoolZaehne | boolean | No | |
BossTentakel | unit | Yes | |
DialogHELD | texttag | No | |
DialogKnopfEnde | boolean | Yes | false |
DialogNeueQuest | boolean | No | false |
DialogOBJ | texttag | No | |
DialogTabelle | integer | Yes | 0 |
DialogZIEL | texttag | No | |
DorfbewohnerHaus | group | No | |
DorfbewohnerInteger | integer | Yes | |
DorfbewohnerLand | group | No | |
GDD__Integers | integer | Yes | |
GDD__LeftMapGroup | group | No | |
GDD__TriggerArray | trigger | Yes | |
GDD__UnitArray | unit | Yes | |
GDD_Damage | real | No | |
GDD_DamagedUnit | unit | No | |
GDD_DamageSource | unit | No | |
GDD_Event | real | No | |
hashSumpfmonster | hashtable | No | |
HT_Sound | hashtable | No | |
i | integer | No | |
ID | integer | No | |
IntegerAngriffskraft | integer | Yes | |
IntegerLocal | integer | No | |
inventar1 | real | No | -1.00 |
inventar2 | real | No | |
inventar3 | real | No | |
inventar4 | real | No | |
inventar5 | real | No | |
inventar6 | real | No | |
InventarAnAus | boolean | Yes | true |
InvKnopfRucks | real | No | -1.00 |
InvSlot1 | real | No | -1.00 |
InvSlot10 | real | No | -1.00 |
InvSlot11 | real | No | -1.00 |
InvSlot12 | real | No | -1.00 |
InvSlot2 | real | No | -1.00 |
InvSlot3 | real | No | -1.00 |
InvSlot4 | real | No | -1.00 |
InvSlot5 | real | No | -1.00 |
InvSlot6 | real | No | -1.00 |
InvSlot7 | real | No | -1.00 |
InvSlot8 | real | No | -1.00 |
InvSlot9 | real | No | -1.00 |
KalenderTag | integer | No | 1 |
LandkarteAnAus | boolean | Yes | true |
MiniMap | minimapicon | Yes | |
MuenzenUndEdelsteine | abilcode | Yes | |
MusicBoss | boolean | No | |
MusicCheck | integer | Yes | |
Name | string | No | |
Pint | integer | No | |
Player | player | No | |
PlayerLocal | player | No | |
PlayerNr | player | Yes | |
PlayList | string | No | |
PointNachtmonster | location | Yes | |
Portabfrage | boolean | Yes | |
Quest | quest | Yes | |
Quest_Req | questitem | Yes | |
QuestHeld | unit | No | |
RealKnopfEnde | real | No | |
RealKnopfOben | real | No | |
RealKnopfUnten | real | No | |
REGI_EntRect | rect | Yes | |
REGI_HT | hashtable | No | |
REGI_Int | integer | No | |
REGI_TRG | trigger | No | |
REGI_TRGLEV | trigger | No | |
REGI_Unit | unit | No | |
RPGMovePoint | location | Yes | |
SchatzInteger | integer | No | |
SelectUnit | unit | Yes | |
SpezEffekt | effect | No | |
SpezEffekte_RPG | effect | Yes | |
Stored_Unit | unit | No | |
StringDialog1 | string | Yes | |
StringDialog2 | string | Yes | |
StringDialog3 | string | Yes | |
StringDialog4 | string | Yes | |
StringDialog5 | string | Yes | |
StringDialog6 | string | Yes | |
StringHeld | string | Yes | |
StringQuest | string | Yes | |
StringZiel | string | Yes | |
Talent_Punkte | integer | Yes | |
Talent_Unit_in_Hero | abilcode | Yes | |
TasteDruckA | boolean | Yes | |
TasteDruckD | boolean | Yes | |
TasteDruckS | boolean | Yes | |
TasteDruckW | boolean | Yes | |
TELE_HT | hashtable | No | |
TempGroup | group | No | |
TempInt_Ausweiden | integer | Yes | |
TempInteger | integer | No | |
TempIntegerRatten | integer | No | |
TempItem | item | No | |
TempPoint | location | No | |
TempPoint2 | location | No | |
TempPointBoss | location | Yes | |
TempPointDialogHELD | location | No | |
TempPointDialogZIEL | location | No | |
TempPointEVU | location | No | |
TempPointmitWait1 | location | No | |
TempPointmitWait2 | location | No | |
TempPointNPC | location | Yes | |
TempPointPC | location | Yes | |
TempReal | real | No | |
TempUnit | unit | No | |
TempUnitBoss | unit | Yes | |
TempUnitType | unitcode | No | |
TerrainCheckLoc | location | Yes | |
TerrainReal | real | Yes | 8.00 |
testVar | real | No | -1.00 |
Timer | timer | No | |
TimerDmg | timer | Yes | |
TimerFenster | timerdialog | No | |
u | unit | No | |
UnitExtraDmg | unit | Yes | |
UnitLocal | unit | No | |
UnitLocal2 | unit | No | |
UnitRucksack | unit | Yes | |
UnitRucksack2 | unit | Yes | |
VerratBewohner | real | Yes | |
VerratElfen | real | Yes | |
VerratOrcs | real | Yes | |
VerratPiraten | real | Yes | |
VerratRitter | real | Yes | |
VGruppe | group | Yes | |
VItem | item | Yes | |
VUnit | unit | Yes | |
WaffenSchwungCounter | real | Yes | 0.00 |
Wahl_Elf_JAneinVIEL | button | Yes | |
Wahl_Klingenmeister | dialog | No | |
Wahl_Kreuzritter | dialog | No | |
Wahl_Magier | dialog | No | |
Wahl_Mensch_JAneinVIEL | button | Yes | |
Wahl_Orc_JAneinVIEL | button | Yes | |
Wahl_Piraten | dialog | No | |
Wahl_Schamanen | dialog | No | |
Wahl_Waldlaeufer | dialog | No | |
WetterEffekt | weathereffect | Yes | |
WS_Gruppe | group | No | |
ZRotaAOAHero | boolean | Yes | true |
ZRotaAutoAn | boolean | Yes | true |
ZRotaFocusHero | boolean | Yes | true |
ZRotaHohZHero | boolean | Yes | true |
ZRotaSpeed | real | Yes | 0.50 |
ZRPGHero | unit | Yes | |
ZRPGHeroAusr | unit | Yes | |
ZRPGHeroStirbt | unit | Yes |
library FrameLoader initializer init_function
// in 1.31 and upto 1.32.9 PTR (when I wrote this). Frames are not correctly saved and loaded, breaking the game.
// This library runs all functions added to it with a 0s delay after the game was loaded.
// function FrameLoaderAdd takes code func returns nothing
// func runs when the game is loaded.
globals
private trigger eventTrigger = CreateTrigger()
private trigger actionTrigger = CreateTrigger()
private timer t = CreateTimer()
endglobals
function FrameLoaderAdd takes code func returns nothing
call TriggerAddAction(actionTrigger, func)
endfunction
private function timerAction takes nothing returns nothing
call TriggerExecute(actionTrigger)
endfunction
private function eventAction takes nothing returns nothing
call TimerStart(t, 0, false, function timerAction)
endfunction
private function init_function takes nothing returns nothing
call TriggerRegisterGameEvent(eventTrigger, EVENT_GAME_LOADED)
call TriggerAddAction(eventTrigger, function eventAction)
endfunction
endlibrary
library Example initializer init_function requires FrameLoader
private function At0s takes nothing returns nothing
call BlzFrameSetVisible(BlzGetOriginFrame(ORIGIN_FRAME_MINIMAP,0),false)
call EnableMinimapFilterButtons( false, false )
call SetCreepCampFilterState( false )
call SetUserControlForceOff( GetPlayersAll() )
endfunction
private function init_function takes nothing returns nothing
call FrameLoaderAdd(function At0s)
call TimerStart(CreateTimer(), 0, false, function At0s)
endfunction
endlibrary
globals
unit gCaster = null
integer array AllTechs
integer AllTechsCount = 0
integer udg_CalendarMaxDays = 0
integer array udg_DayBag
integer udg_LastDayUsed = 0
integer udg_DayBagCount = 0
real udg_FokusKnopf= 0
hashtable udg_BergbauHash = InitHashtable()
hashtable hashSumpfmonster = InitHashtable()
hashtable InteractHash = InitHashtable()
hashtable TalentHash = InitHashtable()
hashtable CalendarHash = InitHashtable()
hashtable hTradeItems = InitHashtable()
// hashtable itemIDTable = InitHashtable()
framehandle FrameDialog = null
trigger TriggerFrameDialog = null
framehandle DialogKnopfMap = null
framehandle BackdropDialogKnopfMap = null
trigger TriggerDialogKnopfMap = null
framehandle Landkarte = null
trigger TriggerLandkarte = null
framehandle CastbarExtra = null
trigger TriggerCastbarExtra = null
framehandle InventarFrame = null
trigger TriggerInventarFrame = null
framehandle InventarFrameH = null
trigger TriggerInventarFrameH = null
framehandle InvKnopfRucks = null
trigger TriggerInvKnopfRucks = null
framehandle InvBack = null
trigger TriggerInvBack = null
framehandle InvChar = null
trigger TriggerInvChar = null
framehandle InvLeer = null
trigger TriggerInvLeer = null
framehandle InvCharLeer = null
trigger TriggerInvCharLeer = null
framehandle FrameDialogText = null
trigger TriggerFrameDialogText = null
framehandle InventarKnopf1 = null
framehandle BackdropInventarKnopf1 = null
trigger TriggerInventarKnopf1 = null
framehandle InventarKnopf2 = null
framehandle BackdropInventarKnopf2 = null
trigger TriggerInventarKnopf2 = null
framehandle InventarKnopf3 = null
framehandle BackdropInventarKnopf3 = null
trigger TriggerInventarKnopf3 = null
framehandle InventarKnopf4 = null
framehandle BackdropInventarKnopf4 = null
trigger TriggerInventarKnopf4 = null
framehandle InventarKnopf5 = null
framehandle BackdropInventarKnopf5 = null
trigger TriggerInventarKnopf5 = null
framehandle InventarKnopf6 = null
framehandle BackdropInventarKnopf6 = null
trigger TriggerInventarKnopf6 = null
framehandle InventarKnopf1H = null
framehandle BackdropInventarKnopf1H = null
trigger TriggerInventarKnopf1H = null
framehandle InventarKnopf2H = null
framehandle BackdropInventarKnopf2H = null
trigger TriggerInventarKnopf2H = null
framehandle InventarKnopf3H = null
framehandle BackdropInventarKnopf3H = null
trigger TriggerInventarKnopf3H = null
framehandle InventarKnopf4H = null
framehandle BackdropInventarKnopf4H = null
trigger TriggerInventarKnopf4H = null
framehandle InventarKnopf5H = null
framehandle BackdropInventarKnopf5H = null
trigger TriggerInventarKnopf5H = null
framehandle InventarKnopf6H = null
framehandle BackdropInventarKnopf6H = null
trigger TriggerInventarKnopf6H = null
framehandle InvRucksack = null
trigger TriggerInvRucksack = null
framehandle DialogKnopfUnten = null
framehandle BackdropDialogKnopfUnten = null
trigger TriggerDialogKnopfUnten = null
framehandle DialogKnopfEnde = null
framehandle BackdropDialogKnopfEnde = null
trigger TriggerDialogKnopfEnde = null
framehandle DialogKnopfOben = null
framehandle BackdropDialogKnopfOben = null
trigger TriggerDialogKnopfOben = null
framehandle array InvSlotT
framehandle array BackdropInvSlotT
trigger array TriggerInvSlotT
framehandle FokusKnopf = null
framehandle BackdropFokusKnopf = null
trigger TriggerFokusKnopf = null
framehandle tipFrame
framehandle tipText
boolean array udg_ZRPGHeroPos
endglobals
// SpellID + Spieler ==> Talent-Ability (z.B. 'A01S', 'ANdh', ...)
library REFORGEDUIMAKER initializer init
function InitTalentHash takes nothing returns nothing
// --- Spieler 2 = Mensch ---
call SaveInteger( TalentHash, 'AY00', 2, 'A01S' )
call SaveInteger( TalentHash, 'AY01', 2, 'A00L' )
call SaveInteger( TalentHash, 'AY02', 2, 'ANdh' )
call SaveInteger( TalentHash, 'AY03', 2, 'AHhb' )
call SaveInteger( TalentHash, 'AY04', 2, 'AHds' )
call SaveInteger( TalentHash, 'AY05', 2, 'A00J' )
call SaveInteger( TalentHash, 'AY18', 2, 'A01K' )
call SaveInteger( TalentHash, 'AY19', 2, 'AX47' )
call SaveInteger( TalentHash, 'AY21', 2, 'AX49' )
call SaveInteger( TalentHash, 'AY22', 2, 'AX46' )
call SaveInteger( TalentHash, 'AY23', 2, 'AX22' )
// Talente für Alle:
call SaveInteger( TalentHash, 'AIda', 2, 'APh1' )
call SaveInteger( TalentHash, 'AY33', 2, 'AHav' )
// --- Spieler 3 = Orc ---
call SaveInteger( TalentHash, 'AY16', 3, 'ANdr' )
call SaveInteger( TalentHash, 'AY10', 3, 'AOcl' )
call SaveInteger( TalentHash, 'AY14', 3, 'AX37' )
call SaveInteger( TalentHash, 'Awrh', 3, 'AUfn' )
call SaveInteger( TalentHash, 'ACsf', 3, 'AEsh' )
call SaveInteger( TalentHash, 'AY15', 3, 'ANms' )
call SaveInteger( TalentHash, 'AY11', 3, 'AOww' )
call SaveInteger( TalentHash, 'AY12', 3, 'AX35' )
call SaveInteger( TalentHash, 'AY17', 3, 'AX34' )
call SaveInteger( TalentHash, 'AY08', 3, 'AX40' )
call SaveInteger( TalentHash, 'AY20', 3, 'AX38' )
// Talente für Alle:
call SaveInteger( TalentHash, 'AIda', 3, 'APh1' )
call SaveInteger( TalentHash, 'AY33', 3, 'AHav' )
// --- Spieler 4 = Elf ---
call SaveInteger( TalentHash, 'AY24', 4, 'AX63' )
call SaveInteger( TalentHash, 'AY07', 4, 'A01P' )
call SaveInteger( TalentHash, 'AY27', 4, 'AOws' )
call SaveInteger( TalentHash, 'AY09', 4, 'AX48' )
call SaveInteger( TalentHash, 'AY25', 4, 'ANcs' )
call SaveInteger( TalentHash, 'AY26', 4, 'AX12' )
call SaveInteger( TalentHash, 'AY13', 4, 'AX65' )
call SaveInteger( TalentHash, 'AY28', 4, 'AX62' )
call SaveInteger( TalentHash, 'AY29', 4, 'AX66' )
call SaveInteger( TalentHash, 'AY30', 4, 'AX64' )
call SaveInteger( TalentHash, 'AY31', 4, 'A01L' )
// Talente für Alle:
call SaveInteger( TalentHash, 'AIda', 4, 'APh1' )
call SaveInteger( TalentHash, 'AY33', 4, 'AHav' )
endfunction
function InitInteractHash takes nothing returns nothing
// Beispielhafte Dialoge:
call SaveStr(InteractHash, GetHandleId(gg_unit_nhym_1066), 1, "I need five Rune Quarz and the magic formula to open the gate")
call SaveStr(InteractHash, GetHandleId(gg_unit_nhym_1066), 2, "I have the five Rune Quarz in my hands and say the words of the runic script! |N / # \\; -; / I -I- *. * \\ - X- / I \\ K -I * -D -I- _Xy; -; - / -T- * Y * / I \\ ~ I ~ ")
call SaveStr(InteractHash, GetHandleId(gg_unit_nhym_1255), 1, "... Praise be to Prince Ammas, who bestowed upon us the mighty teleporters ...")
call SaveStr(InteractHash, GetHandleId(gg_unit_nhym_1316), 1, "... Alas, the Guardian could oft find the Rune Quartz only within powerful creatures under the moonlit night ...")
call SaveStr(InteractHash, GetHandleId(gg_unit_nhym_1315), 1, "... The true believers seek enlightenment within the mountain temple ...")
call SaveStr(InteractHash, GetHandleId(gg_unit_nhym_0247), 1, "... The prince's treasure remaineth hidden from the people ...")
call SaveStr(InteractHash, GetHandleId(gg_unit_nhym_0225), 1, "... The teleport led into the city, for the prince doth not abide long journeys ...")
call SaveStr(InteractHash, GetHandleId(gg_unit_nhym_0154), 1, "... And the two-way teleporter shall function only if the lever be set aright ...")
call SaveStr(InteractHash, GetHandleId(gg_unit_nhym_0140), 1, "Domicile of the Guardian")
call SaveStr(InteractHash, GetHandleId(gg_unit_nhym_0138), 1, "... The Guardian alone shall decide who may pass through the gate ...")
call SaveStr(InteractHash, GetHandleId(gg_unit_nhym_0139), 1, "... The Guardian is the master of all keys ...")
call SaveStr(InteractHash, GetHandleId(gg_unit_nhym_0127), 1, "... The queen ruleth, and the prince doth grant the wishes of the people. He, in turn, is safeguarded by the Guardian ...")
call SaveStr(InteractHash, GetHandleId(gg_unit_nhym_0126), 1, "... The Guardian of the pyramid is granted but one day of respite per cycle. On that day, he watcheth not over the gate ...")
call SaveStr(InteractHash, GetHandleId(gg_unit_nhym_0038), 1, "... In urgent matters, seek permission to enter. Thou shalt find him at his island dwelling ...")
call SaveStr(InteractHash, GetHandleId(gg_unit_hC19_0060), 1, "Baldof was once a pirate too, but when his ship crashed into the cliffs and was no longer seaworthy, he got the idea to turn it into a bar.")
call SaveStr(InteractHash, GetHandleId(gg_unit_h004_0051), 1, "Have you heard of the Guardian's Treasure? When we pirates heard rumors of the treasures on this island, our captain Rutledge set course for Mondragon without hesitation. Now we have a small base in the northeast of the island.")
call SaveStr(InteractHash, GetHandleId(gg_unit_hfoo_0280), 1, "An orc in this tavern, and yet he is suffered... Aye, for the orcs of the Shaman Clan be our allies in the war against the Horde. Shouldst thou seek other representatives of the Alliance, make thy way to Stonebreak—it lieth near the heart of the island.")
call SaveStr(InteractHash, GetHandleId(gg_unit_ogru_0062), 1, "Hah! Do not look so surprised. I am of the Shaman Clan, and I spill no blood of men—leastwise, so long as mine cup be filled with good drink and I be spared that accursed cactus juice. Shouldst thou seek mine kin, find our stronghold in Embersdesert’s north.
")
call SaveStr(InteractHash, GetHandleId(gg_unit_nhea_0581), 1, "I take but a brief respite ere I return to the Ashvalan expedition camp. Would that the swamp to the south were not so wretchedly damp... I much prefer the embrace of the ancient forests.")
call SaveStr(InteractHash, GetHandleId(gg_unit_o000_0878), 1, "We have our own Warchief, yet we name him Farseer—for his wisdom guideth us more than mere strength.")
call SaveStr(InteractHash, GetHandleId(gg_unit_nC56_0046), 1, "Welcome to the Cliffcrashship Pub! All be welcome here—so long as they toss a few coins or gems upon me counter... har har!")
call SaveStr(InteractHash, GetHandleId(gg_unit_n010_0547), 1, "Ye look weary, traveler. For but a few coins, ye can have a room and rest well for the night.")
call SaveStr(InteractHash, GetHandleId(gg_unit_n013_0891), 1, "Ah, traveler, the hardships thou hast endured to reach mine rest house... But fret not—rest now, and regain thy strength.")
call SaveStr(InteractHash, GetHandleId(gg_unit_n00D_0425), 1, "Welcome, traveler! If thou seekest potions for thy journey, look no further—I run the only alchemy shop on this island! And shouldst thou need armor, I also sell the finest leather in the land!")
call SaveStr(InteractHash, GetHandleId(gg_unit_n006_1064), 1, "At long last, I may trade again in mine own hometown, Tidenproud! Till mine shop be rebuilt, Magistrate Gunilla hath granted me leave to sell mine wares here.")
call SaveStr(InteractHash, GetHandleId(gg_unit_n011_0056), 1, "Buy or sell, matey? But if ye be after somethin' truly special... get yerself a ring! Found me a whole chest o’ ‘em in the sand, and now everyone wants one!")
call SaveStr(InteractHash, GetHandleId(gg_unit_n01O_0457), 1, "Did Embersdesert leave ye parched, little one? Then quench yer thirst with some fine Cactus Juice!")
call SaveStr(InteractHash, GetHandleId(gg_unit_n001_0131), 1, "I have much to offer, yet the truly precious artifacts we trade in Markantea—to fund our expedition.")
call SaveStr(InteractHash, GetHandleId(gg_unit_edot_0664), 1, "What dost thou want of me? Begone! Return from whence thou camest.")
call SaveStr(InteractHash, GetHandleId(gg_unit_edot_0664), 2, "Thou again…? Seekest thou the entrance to the mountain temple? Then thou art on the wrong side of these lands!")
call SaveStr(InteractHash, GetHandleId(gg_unit_edot_0664), 3, "I shall suffer no further disturbance! If it be fate’s will, then so be it—may it claim thee as it sees fit!")
call SaveStr(InteractHash, GetHandleId(gg_unit_hmtm_1586), 1, "How camest thou to find me in the heart of this shadowed forest? A spiritual force of mana must dwell within thee. If thou so wishest, I can impart further knowledge—though wisdom oft comes at a price.")
call SaveStr(InteractHash, GetHandleId(gg_unit_Nbbc_1672), 1, "I’ve no interest in yappin’ with ye! Go wander the desert and crush bugs, like the pest ye are!")
call SaveStr(InteractHash, GetHandleId(gg_unit_Nbbc_1672), 2, "Humans... I knew ye’d come to slay me—but I shall strike first!")
call SaveStr(InteractHash, GetHandleId(gg_unit_hkni_0227), 1, "Need a ride upstream, eh? The destination be the pirate camp—but passage ain't free, matey!")
call SaveStr(InteractHash, GetHandleId(gg_unit_nC34_0282), 1, "Lookin’ for fine weapons or sturdy armor? I’ve got what ye need! A blacksmith could forge ye even better gear—but fer that, ye’d have to side with the Shaman Clan. They hold the last smithy on this island.")
call SaveStr(InteractHash, GetHandleId(gg_unit_h007_0419), 1, "Are you the lucky one who is allowed to salvage the Gemstone treasure? Well, just don't forget that nobody cares if you keep some of the treasure. If you need help, just speak to me, for a small fee in Coins, of course.")
call SaveStr(InteractHash, GetHandleId(gg_unit_h007_0419), 2, "What do you seek in this cave? This treasure is ours, pirate’s loot! Go on, but don’t blame me when the undead make a meal out of you...")
// =========================
// 2) TYPENBASIERTE SOUND-SPEICHERUNG (minIndex/maxIndex)
// Wir verwenden das Konzept "Kategorie X => min..max"
// und speichern es für jeden Rohcode oder Skin
// =========================
//
// Format (SoundMin):
// call SaveInteger(InteractHash, <fourCC>, StringHash("soundMin"), <value>)
// Format (SoundMax):
// call SaveInteger(InteractHash, <fourCC>, StringHash("soundMax"), <value>)
// -- KATEGORIE 1 => 1..5
call SaveInteger(InteractHash, 'nvlw', StringHash("soundMin"), 1)
call SaveInteger(InteractHash, 'nvlw', StringHash("soundMax"), 5)
call SaveInteger(InteractHash, 'n009', StringHash("soundMin"), 1)
call SaveInteger(InteractHash, 'n009', StringHash("soundMax"), 5)
// Dorfbewohner-Skins [2], [7] => z.B.:
call SaveInteger(InteractHash, udg_DorfbewohnerInteger[2], StringHash("soundMin"), 1)
call SaveInteger(InteractHash, udg_DorfbewohnerInteger[2], StringHash("soundMax"), 5)
call SaveInteger(InteractHash, udg_DorfbewohnerInteger[7], StringHash("soundMin"), 1)
call SaveInteger(InteractHash, udg_DorfbewohnerInteger[7], StringHash("soundMax"), 5)
// -- KATEGORIE 2 => 6..10
call SaveInteger(InteractHash, 'hpea', StringHash("soundMin"), 6)
call SaveInteger(InteractHash, 'hpea', StringHash("soundMax"), 10)
call SaveInteger(InteractHash, 'nvil', StringHash("soundMin"), 6)
call SaveInteger(InteractHash, 'nvil', StringHash("soundMax"), 10)
call SaveInteger(InteractHash, 'nvl2', StringHash("soundMin"), 6)
call SaveInteger(InteractHash, 'nvl2', StringHash("soundMax"), 10)
call SaveInteger(InteractHash, 'n00P', StringHash("soundMin"), 6)
call SaveInteger(InteractHash, 'n00P', StringHash("soundMax"), 10)
// Dorfbewohner-Skins [0], [1], [6]
call SaveInteger(InteractHash, udg_DorfbewohnerInteger[0], StringHash("soundMin"), 6)
call SaveInteger(InteractHash, udg_DorfbewohnerInteger[0], StringHash("soundMax"), 10)
call SaveInteger(InteractHash, udg_DorfbewohnerInteger[1], StringHash("soundMin"), 6)
call SaveInteger(InteractHash, udg_DorfbewohnerInteger[1], StringHash("soundMax"), 10)
call SaveInteger(InteractHash, udg_DorfbewohnerInteger[6], StringHash("soundMin"), 6)
call SaveInteger(InteractHash, udg_DorfbewohnerInteger[6], StringHash("soundMax"), 10)
// -- KATEGORIE 3 => 11..13
call SaveInteger(InteractHash, 'nvlk', StringHash("soundMin"), 11)
call SaveInteger(InteractHash, 'nvlk', StringHash("soundMax"), 13)
call SaveInteger(InteractHash, 'nvk2', StringHash("soundMin"), 11)
call SaveInteger(InteractHash, 'nvk2', StringHash("soundMax"), 13)
call SaveInteger(InteractHash, 'n00Q', StringHash("soundMin"), 11)
call SaveInteger(InteractHash, 'n00Q', StringHash("soundMax"), 13)
// Dorfbewohner-Skins [3], [4], [5]
call SaveInteger(InteractHash, udg_DorfbewohnerInteger[3], StringHash("soundMin"), 11)
call SaveInteger(InteractHash, udg_DorfbewohnerInteger[3], StringHash("soundMax"), 13)
call SaveInteger(InteractHash, udg_DorfbewohnerInteger[4], StringHash("soundMin"), 11)
call SaveInteger(InteractHash, udg_DorfbewohnerInteger[4], StringHash("soundMax"), 13)
call SaveInteger(InteractHash, udg_DorfbewohnerInteger[5], StringHash("soundMin"), 11)
call SaveInteger(InteractHash, udg_DorfbewohnerInteger[5], StringHash("soundMax"), 13)
// -- KATEGORIE 4 => 14..18
call SaveInteger(InteractHash, 'hC19', StringHash("soundMin"), 14)
call SaveInteger(InteractHash, 'hC19', StringHash("soundMax"), 18)
call SaveInteger(InteractHash, 'h004', StringHash("soundMin"), 14)
call SaveInteger(InteractHash, 'h004', StringHash("soundMax"), 18)
// -- KATEGORIE 5 => 19..23
call SaveInteger(InteractHash, 'hfoo', StringHash("soundMin"), 19)
call SaveInteger(InteractHash, 'hfoo', StringHash("soundMax"), 23)
call SaveInteger(InteractHash, 'hcth', StringHash("soundMin"), 19)
call SaveInteger(InteractHash, 'hcth', StringHash("soundMax"), 23)
call SaveInteger(InteractHash, 'hhes', StringHash("soundMin"), 19)
call SaveInteger(InteractHash, 'hhes', StringHash("soundMax"), 23)
call SaveInteger(InteractHash, 'njks', StringHash("soundMin"), 19)
call SaveInteger(InteractHash, 'njks', StringHash("soundMax"), 23)
// -- KATEGORIE 6 => 24..28
call SaveInteger(InteractHash, 'opeo', StringHash("soundMin"), 24)
call SaveInteger(InteractHash, 'opeo', StringHash("soundMax"), 28)
call SaveInteger(InteractHash, 'ogru', StringHash("soundMin"), 24)
call SaveInteger(InteractHash, 'ogru', StringHash("soundMax"), 28)
call SaveInteger(InteractHash, 'orai', StringHash("soundMin"), 24)
call SaveInteger(InteractHash, 'orai', StringHash("soundMax"), 28)
call SaveInteger(InteractHash, 'oshm', StringHash("soundMin"), 24)
call SaveInteger(InteractHash, 'oshm', StringHash("soundMax"), 28)
// -- KATEGORIE 7 => 29..33
call SaveInteger(InteractHash, 'nhea', StringHash("soundMin"), 29)
call SaveInteger(InteractHash, 'nhea', StringHash("soundMax"), 33)
call SaveInteger(InteractHash, 'hsor', StringHash("soundMin"), 29)
call SaveInteger(InteractHash, 'hsor', StringHash("soundMax"), 33)
call SaveInteger(InteractHash, 'nhef', StringHash("soundMin"), 29)
call SaveInteger(InteractHash, 'nhef', StringHash("soundMax"), 33)
// -- KATEGORIE 8 => 34..38
call SaveInteger(InteractHash, 'nbel', StringHash("soundMin"), 34)
call SaveInteger(InteractHash, 'nbel', StringHash("soundMax"), 38)
call SaveInteger(InteractHash, 'hspt', StringHash("soundMin"), 34)
call SaveInteger(InteractHash, 'hspt', StringHash("soundMax"), 38)
call SaveInteger(InteractHash, 'hmpr', StringHash("soundMin"), 34)
call SaveInteger(InteractHash, 'hmpr', StringHash("soundMax"), 38)
call SaveInteger(InteractHash, 'nhem', StringHash("soundMin"), 34)
call SaveInteger(InteractHash, 'nhem', StringHash("soundMax"), 38)
// ================
// FERTIG: Instanzbasierte Dialoge + Typbasierte Sound-Ranges
// ================
endfunction
function InitCalendarData takes nothing returns nothing
local integer day = 0
set udg_CalendarMaxDays = 24
// ================ TAG 1: Day of the Zombies ===================
set day = 1
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Zombies|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNZombie.blp")
call SaveInteger(CalendarHash, day, 3, 1) // 1 Research
// Research-Eintrag (10, 11) => Code + Player-ID
call SaveInteger(CalendarHash, day, 10, 'R006') // 'R006'
call SaveInteger(CalendarHash, day, 11, 8) // Player(8)
// ================ TAG 2: Day of the Snappers ==================
set day = 2
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Snappers|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNDalaranReject.blp")
call SaveInteger(CalendarHash, day, 3, 2) // 2 Research-Upgrades
// #1
call SaveInteger(CalendarHash, day, 10, 'R00B')
call SaveInteger(CalendarHash, day, 11, 24) // statt 12
// #2
call SaveInteger(CalendarHash, day, 12, 'R00C')
call SaveInteger(CalendarHash, day, 13, 24) // statt 12
// ================ TAG 3: Day of the Wolves ====================
set day = 3
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Wolves|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNTimberWolf.blp")
call SaveInteger(CalendarHash, day, 3, 3) // 3 Researches
// #1 (R007, Spieler 25 statt 12)
call SaveInteger(CalendarHash, day, 10, 'R007')
call SaveInteger(CalendarHash, day, 11, 24)
// #2 (R002, Spieler 25 statt 12)
call SaveInteger(CalendarHash, day, 12, 'R002')
call SaveInteger(CalendarHash, day, 13, 24)
// #3 (R00Q, Spieler 8)
call SaveInteger(CalendarHash, day, 14, 'R00Q')
call SaveInteger(CalendarHash, day, 15, 8)
// ================ TAG 4: Day of the Swamp Rats =================
set day = 4
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Swamp Rats|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNYouDirtyRat!.blp")
call SaveInteger(CalendarHash, day, 3, 1)
// #1 (R003, Spieler 25 statt 12)
call SaveInteger(CalendarHash, day, 10, 'R003')
call SaveInteger(CalendarHash, day, 11, 24)
// ================ TAG 5: Day of the Scorpids ===================
set day = 5
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Scorpids|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNArachnathidpurple.blp")
call SaveInteger(CalendarHash, day, 3, 2)
// #1 (R00A, 24)
call SaveInteger(CalendarHash, day, 10, 'R00A')
call SaveInteger(CalendarHash, day, 11, 24)
// #2 (R004, 24)
call SaveInteger(CalendarHash, day, 12, 'R004')
call SaveInteger(CalendarHash, day, 13, 24)
// ================ TAG 6: Day of the Desert Beetles =============
set day = 6
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Desert Beetles|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNCarrionScarabs.blp")
call SaveInteger(CalendarHash, day, 3, 2)
// #1 (R001, 24)
call SaveInteger(CalendarHash, day, 10, 'R001')
call SaveInteger(CalendarHash, day, 11, 24)
// #2 (R00D, 24)
call SaveInteger(CalendarHash, day, 12, 'R00D')
call SaveInteger(CalendarHash, day, 13, 24)
// ================ TAG 7: Day of the Skeletons ===================
set day = 7
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Skeletons|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNSkeletonWarrior.blp")
call SaveInteger(CalendarHash, day, 3, 4) // 4 Research-Linien
// R000 => Spieler 25 statt 12
call SaveInteger(CalendarHash, day, 10, 'R000')
call SaveInteger(CalendarHash, day, 11, 24)
// R009 => Spieler 8
call SaveInteger(CalendarHash, day, 12, 'R009')
call SaveInteger(CalendarHash, day, 13, 8)
// R000 => Spieler 8
call SaveInteger(CalendarHash, day, 14, 'R000')
call SaveInteger(CalendarHash, day, 15, 8)
// R008 => Spieler 8
call SaveInteger(CalendarHash, day, 16, 'R008')
call SaveInteger(CalendarHash, day, 17, 8)
// ================ TAG 8: Day of the Ghouls ======================
set day = 8
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Ghouls|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNGhoul.blp")
call SaveInteger(CalendarHash, day, 3, 1)
call SaveInteger(CalendarHash, day, 10, 'R00F')
call SaveInteger(CalendarHash, day, 11, 8)
// ================ TAG 9: Day of the Poltergeist =================
set day = 9
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Poltergeist|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNLichVersion2.blp")
call SaveInteger(CalendarHash, day, 3, 1)
call SaveInteger(CalendarHash, day, 10, 'R00L')
call SaveInteger(CalendarHash, day, 11, 8)
// ================ TAG 10: Day of the Vampires ===================
set day = 10
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Vampires|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNHeroDreadLord.blp")
call SaveInteger(CalendarHash, day, 3, 1)
call SaveInteger(CalendarHash, day, 10, 'R00G')
call SaveInteger(CalendarHash, day, 11, 8)
// ================ TAG 11: Day of the Spiders =====================
set day = 11
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Spiders|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNSpiderBlack.blp")
call SaveInteger(CalendarHash, day, 3, 2)
// R00H, R00I für Player(8)
call SaveInteger(CalendarHash, day, 10, 'R00H')
call SaveInteger(CalendarHash, day, 11, 8)
call SaveInteger(CalendarHash, day, 12, 'R00I')
call SaveInteger(CalendarHash, day, 13, 8)
// ================ TAG 12: Day of the Acolytes ====================
set day = 12
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Acolytes|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNAcolyte.blp")
call SaveInteger(CalendarHash, day, 3, 1)
call SaveInteger(CalendarHash, day, 10, 'R00M')
call SaveInteger(CalendarHash, day, 11, 8)
// ================ TAG 13: Day of the Kobolds =====================
set day = 13
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Kobolds|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNKobold.blp")
call SaveInteger(CalendarHash, day, 3, 2)
// R00N, R00O für Neutral Aggressive => jetzt 25
call SaveInteger(CalendarHash, day, 10, 'R00N')
call SaveInteger(CalendarHash, day, 11, 24)
call SaveInteger(CalendarHash, day, 12, 'R00O')
call SaveInteger(CalendarHash, day, 13, 24)
// ================ TAG 14: Day of the Sea Turtles =================
set day = 14
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Sea Turtles|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNSeaTurtleGreen.blp")
call SaveInteger(CalendarHash, day, 3, 2)
// R00J, R00K => statt 12 jetzt 25
call SaveInteger(CalendarHash, day, 10, 'R00J')
call SaveInteger(CalendarHash, day, 11, 24)
call SaveInteger(CalendarHash, day, 12, 'R00K')
call SaveInteger(CalendarHash, day, 13, 24)
// ================ TAG 15: Day of the Berserk Bears ===============
set day = 15
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Berserk Bears|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNGrizzlyBear.blp")
call SaveInteger(CalendarHash, day, 3, 1)
// R00V => 25
call SaveInteger(CalendarHash, day, 10, 'R00V')
call SaveInteger(CalendarHash, day, 11, 24)
// ================ TAG 16: Day of the Stone Golems ================
set day = 16
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Stone Golems|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNRockGolem.blp")
call SaveInteger(CalendarHash, day, 3, 1)
// R00P => 25
call SaveInteger(CalendarHash, day, 10, 'R00P')
call SaveInteger(CalendarHash, day, 11, 24)
// ================ TAG 17: Day of the Flight Horrors ==============
set day = 17
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Flight Horrors|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNStoneForm.blp")
call SaveInteger(CalendarHash, day, 3, 1)
// R00T => 8
call SaveInteger(CalendarHash, day, 10, 'R00T')
call SaveInteger(CalendarHash, day, 11, 8)
call SaveReal(CalendarHash, 17, 20, -8500.0) // X1
call SaveReal(CalendarHash, 17, 21, 12000.0) // Y1
// ================ TAG 18: Day of the Swamp Monsters ==============
set day = 18
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Swamp Monsters|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNShade.blp")
call SaveInteger(CalendarHash, day, 3, 3)
// R00R => 25
call SaveInteger(CalendarHash, day, 10, 'R00R')
call SaveInteger(CalendarHash, day, 11, 24)
// R00R => 8
call SaveInteger(CalendarHash, day, 12, 'R00R')
call SaveInteger(CalendarHash, day, 13, 8)
// R00U => 25
call SaveInteger(CalendarHash, day, 14, 'R00U')
call SaveInteger(CalendarHash, day, 15, 24)
call SaveReal(CalendarHash, 18, 20, -8500.0) // X1
call SaveReal(CalendarHash, 18, 21, -7300.0) // Y1
call SaveReal(CalendarHash, 18, 22, -8200.0) // X2
call SaveReal(CalendarHash, 18, 23, -8500.0) // Y2
call SaveReal(CalendarHash, 18, 24, -8500.0) // X3
call SaveReal(CalendarHash, 18, 25, -9900.0) // Y3
call SaveReal(CalendarHash, 18, 26, -9600.0) // X4
call SaveReal(CalendarHash, 18, 27, -11000.0) // Y4
call SaveReal(CalendarHash, 18, 28, -10000.0) // X5
call SaveReal(CalendarHash, 18, 29, -12400.0) // Y5
call SaveReal(CalendarHash, 18, 30, -11400.0) // X6
call SaveReal(CalendarHash, 18, 31, -11200.0) // Y6
call SaveReal(CalendarHash, 18, 32, -14300.0) // X7
call SaveReal(CalendarHash, 18, 33, -13400.0) // Y7
// ================ TAG 19: Day of the Behemoths ===================
set day = 19
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Behemoths|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNHowlOfTerror.blp")
call SaveInteger(CalendarHash, day, 3, 1)
// R00E => 25
call SaveInteger(CalendarHash, day, 10, 'R00E')
call SaveInteger(CalendarHash, day, 11, 24)
// ================ TAG 20: Day of the Demonic Raiders =============
set day = 20
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Demonic Raiders|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNChaosWolfRider.blp")
call SaveInteger(CalendarHash, day, 3, 1)
// R00Y => 0
call SaveInteger(CalendarHash, day, 10, 'R00Y')
call SaveInteger(CalendarHash, day, 11, 0)
// ================ TAG 21: Day of the Orcs ========================
set day = 21
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Orcs|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNRaider.blp")
call SaveInteger(CalendarHash, day, 3, 4)
// R00W => 0
call SaveInteger(CalendarHash, day, 10, 'R00W')
call SaveInteger(CalendarHash, day, 11, 0)
// R00W => 8
call SaveInteger(CalendarHash, day, 12, 'R00W')
call SaveInteger(CalendarHash, day, 13, 8)
// R00X => 0
call SaveInteger(CalendarHash, day, 14, 'R00X')
call SaveInteger(CalendarHash, day, 15, 0)
// R00X => 8
call SaveInteger(CalendarHash, day, 16, 'R00X')
call SaveInteger(CalendarHash, day, 17, 8)
// ================ TAG 22: Day of the Trolls ======================
set day = 22
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Trolls|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNForestTroll.blp")
call SaveInteger(CalendarHash, day, 3, 1)
// R00Z => 0
call SaveInteger(CalendarHash, day, 10, 'R00Z')
call SaveInteger(CalendarHash, day, 11, 0)
// ================ TAG 23: Day of the Death Knights ===============
set day = 23
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Death Knights|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNUnholyAura.blp")
call SaveInteger(CalendarHash, day, 3, 2)
// R010 => 0
call SaveInteger(CalendarHash, day, 10, 'R010')
call SaveInteger(CalendarHash, day, 11, 0)
// R010 => 8
call SaveInteger(CalendarHash, day, 12, 'R010')
call SaveInteger(CalendarHash, day, 13, 8)
// ================ TAG 24: Day of the Dragons =====================
set day = 24
call SaveStr(CalendarHash, day, 1, "|cffffff96Day of the Dragons|r")
call SaveStr(CalendarHash, day, 2, "ReplaceableTextures\\CommandButtons\\BTNGreenDragon.blp")
call SaveInteger(CalendarHash, day, 3, 1)
// Wir speichern hier 'R011' => Player(8)
call SaveInteger(CalendarHash, day, 10, 'R011')
call SaveInteger(CalendarHash, day, 11, 8)
// Und kennzeichnen diesen Tag als "Spezialtag" (ChildKey=4 => Boolean = true)
call SaveBoolean(CalendarHash, day, 4, true)
endfunction
//=====================================================
// 2) Alle Kalender Techs in ein Array eintragen
//=====================================================
function InitAllTechs takes nothing returns nothing
set AllTechsCount = 35
set AllTechs[1] = 'R007'
set AllTechs[2] = 'R00B'
set AllTechs[3] = 'R00C'
set AllTechs[4] = 'R006'
set AllTechs[5] = 'R002'
set AllTechs[6] = 'R003'
set AllTechs[7] = 'R00A'
set AllTechs[8] = 'R004'
set AllTechs[9] = 'R001'
set AllTechs[10] = 'R00D'
set AllTechs[11] = 'R009'
set AllTechs[12] = 'R000'
set AllTechs[13] = 'R008'
set AllTechs[14] = 'R00F'
set AllTechs[15] = 'R00L'
set AllTechs[16] = 'R00G'
set AllTechs[17] = 'R00H'
set AllTechs[18] = 'R00I'
set AllTechs[19] = 'R00M'
set AllTechs[20] = 'R00J'
set AllTechs[21] = 'R00K'
set AllTechs[22] = 'R00N'
set AllTechs[23] = 'R00O'
set AllTechs[24] = 'R00P'
set AllTechs[25] = 'R00V'
set AllTechs[26] = 'R00R'
set AllTechs[27] = 'R00T'
set AllTechs[28] = 'R00U'
set AllTechs[29] = 'R00E'
set AllTechs[30] = 'R00Y'
set AllTechs[31] = 'R00W'
set AllTechs[32] = 'R00X'
set AllTechs[33] = 'R00Z'
set AllTechs[34] = 'R010'
set AllTechs[35] = 'R011'
endfunction
//=====================================================
// 3) Alle Kalender Tech-Forschungen in einer Schleife zurücksetzen für kalender Hauptcode
//=====================================================
function ResetAllTechs takes nothing returns nothing
local integer i = 1
local integer techId
loop
exitwhen i > AllTechsCount
set techId = AllTechs[i]
// Auf 0 setzen bei den Spielern, die du im alten Code resettest (0,8,24)
call SetPlayerTechResearchedSwap(techId, 0, Player(0))
call SetPlayerTechResearchedSwap(techId, 0, Player(8))
call SetPlayerTechResearchedSwap(techId, 0, Player(24))
set i = i + 1
endloop
endfunction
//===================================================== call BJDebugMsg(" - totalDmg: " + I2S(totalDmg))
function ZRPGDmg takes integer playerId, unit caster returns integer
local item itm = UnitItemInSlot(udg_ZRPGHeroAusr[playerId], 0)
local integer baseDmg = BlzGetUnitBaseDamage(caster, 0)
local integer randomDmg = GetRandomInt(2, 12)
local integer waffenDmg = BlzGetItemIntegerField(itm, ITEM_IF_PRIORITY)
local integer waffenLvL = BlzGetItemIntegerField(itm, ITEM_IF_MAX_HIT_POINTS)
local integer totalDmg = baseDmg + randomDmg + waffenLvL
set itm = null
return totalDmg
endfunction
function GetHeroX takes integer playerId returns real
return GetUnitX(udg_ZRPGHero[playerId])
endfunction
function GetHeroY takes integer playerId returns real
return GetUnitY(udg_ZRPGHero[playerId])
endfunction
function RPG_IsHeroInRegion takes integer playerId returns boolean
local real x = GetHeroX(playerId)
local real y = GetHeroY(playerId)
// Aktualisiere die globale Variable, ob sich der Held in der Region befindet
set udg_ZRPGHeroPos[playerId] = (x >= -18440.0 and x <= 0.0 and y >= 5660.0 and y <= 16000.0) or (x >= 0.0 and x <= 17700.0 and y >= 7400.0 and y <= 16000.0)
// Rückgabe, ob der Held sich in der definierten Region befindet
return udg_ZRPGHeroPos[playerId]
endfunction
function RPG_HasMapItem takes integer playerId, integer itemTypeId returns boolean
// Prüft, ob der Held oder die Rucksäcke das angegebene Item besitzen
if UnitHasItemOfTypeBJ(udg_ZRPGHero[playerId], itemTypeId) then
return true
endif
if UnitHasItemOfTypeBJ(udg_UnitRucksack[playerId], itemTypeId) then
return true
endif
if UnitHasItemOfTypeBJ(udg_UnitRucksack2[playerId], itemTypeId) then
return true
endif
return false
endfunction
function PlaySoundForSpecificPlayer takes player targetPlayer, sound soundToPlay returns nothing
if (GetLocalPlayer() == targetPlayer) then
call StartSound(soundToPlay)
endif
endfunction
// orignial UI Maker startet hier: ( bis auf am ende: !!!! // call InitTalentHash() !!!! // endfunction // endlibrary)
// set InvRucksack = BlzCreateFrame("EscMenuBackdrop", BlzGetOriginFrame(ORIGIN_FRAME_WORLD_FRAME, 0), 0, 0)
function FokusKnopfFunc takes nothing returns nothing
call BlzFrameSetEnable(FokusKnopf, false)
call BlzFrameSetEnable(FokusKnopf, true)
set udg_FokusKnopf = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function DialogKnopfMapFunc takes nothing returns nothing
call BlzFrameSetEnable(DialogKnopfMap, false)
call BlzFrameSetEnable(DialogKnopfMap, true)
set udg_testVar = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InvKnopfRucksFunc takes nothing returns nothing
call BlzFrameSetEnable(InvKnopfRucks, false)
call BlzFrameSetEnable(InvKnopfRucks, true)
set udg_InvKnopfRucks = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InventarKnopf1Func takes nothing returns nothing
call BlzFrameSetEnable(InventarKnopf1, false)
call BlzFrameSetEnable(InventarKnopf1, true)
set udg_inventar1 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InventarKnopf2Func takes nothing returns nothing
call BlzFrameSetEnable(InventarKnopf2, false)
call BlzFrameSetEnable(InventarKnopf2, true)
set udg_inventar2 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InventarKnopf3Func takes nothing returns nothing
call BlzFrameSetEnable(InventarKnopf3, false)
call BlzFrameSetEnable(InventarKnopf3, true)
set udg_inventar3 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InventarKnopf4Func takes nothing returns nothing
call BlzFrameSetEnable(InventarKnopf4, false)
call BlzFrameSetEnable(InventarKnopf4, true)
set udg_inventar4 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InventarKnopf5Func takes nothing returns nothing
call BlzFrameSetEnable(InventarKnopf5, false)
call BlzFrameSetEnable(InventarKnopf5, true)
set udg_inventar5 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InventarKnopf6Func takes nothing returns nothing
call BlzFrameSetEnable(InventarKnopf6, false)
call BlzFrameSetEnable(InventarKnopf6, true)
set udg_inventar6 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InventarKnopf1HFunc takes nothing returns nothing
call BlzFrameSetEnable(InventarKnopf1H, false)
call BlzFrameSetEnable(InventarKnopf1H, true)
set udg_inventar1 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InventarKnopf2HFunc takes nothing returns nothing
call BlzFrameSetEnable(InventarKnopf2H, false)
call BlzFrameSetEnable(InventarKnopf2H, true)
set udg_inventar2 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InventarKnopf3HFunc takes nothing returns nothing
call BlzFrameSetEnable(InventarKnopf3H, false)
call BlzFrameSetEnable(InventarKnopf3H, true)
set udg_inventar3 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InventarKnopf4HFunc takes nothing returns nothing
call BlzFrameSetEnable(InventarKnopf4H, false)
call BlzFrameSetEnable(InventarKnopf4H, true)
set udg_inventar4 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InventarKnopf5HFunc takes nothing returns nothing
call BlzFrameSetEnable(InventarKnopf5H, false)
call BlzFrameSetEnable(InventarKnopf5H, true)
set udg_inventar5 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InventarKnopf6HFunc takes nothing returns nothing
call BlzFrameSetEnable(InventarKnopf6H, false)
call BlzFrameSetEnable(InventarKnopf6H, true)
set udg_inventar6 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function DialogKnopfUntenFunc takes nothing returns nothing
call BlzFrameSetEnable(DialogKnopfUnten, false)
call BlzFrameSetEnable(DialogKnopfUnten, true)
set udg_RealKnopfUnten = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function DialogKnopfEndeFunc takes nothing returns nothing
call BlzFrameSetEnable(DialogKnopfEnde, false)
call BlzFrameSetEnable(DialogKnopfEnde, true)
set udg_RealKnopfEnde = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function DialogKnopfObenFunc takes nothing returns nothing
call BlzFrameSetEnable(DialogKnopfOben, false)
call BlzFrameSetEnable(DialogKnopfOben, true)
set udg_RealKnopfOben = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InvSlotT00Func takes nothing returns nothing
call BlzFrameSetEnable(InvSlotT[0], false)
call BlzFrameSetEnable(InvSlotT[0], true)
set udg_InvSlot1 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InvSlotT01Func takes nothing returns nothing
call BlzFrameSetEnable(InvSlotT[1], false)
call BlzFrameSetEnable(InvSlotT[1], true)
set udg_InvSlot2 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InvSlotT02Func takes nothing returns nothing
call BlzFrameSetEnable(InvSlotT[2], false)
call BlzFrameSetEnable(InvSlotT[2], true)
set udg_InvSlot3 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InvSlotT03Func takes nothing returns nothing
call BlzFrameSetEnable(InvSlotT[3], false)
call BlzFrameSetEnable(InvSlotT[3], true)
set udg_InvSlot4 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InvSlotT04Func takes nothing returns nothing
call BlzFrameSetEnable(InvSlotT[4], false)
call BlzFrameSetEnable(InvSlotT[4], true)
set udg_InvSlot5 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InvSlotT05Func takes nothing returns nothing
call BlzFrameSetEnable(InvSlotT[5], false)
call BlzFrameSetEnable(InvSlotT[5], true)
set udg_InvSlot6 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InvSlotT06Func takes nothing returns nothing
call BlzFrameSetEnable(InvSlotT[6], false)
call BlzFrameSetEnable(InvSlotT[6], true)
set udg_InvSlot7 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InvSlotT07Func takes nothing returns nothing
call BlzFrameSetEnable(InvSlotT[7], false)
call BlzFrameSetEnable(InvSlotT[7], true)
set udg_InvSlot8 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InvSlotT08Func takes nothing returns nothing
call BlzFrameSetEnable(InvSlotT[8], false)
call BlzFrameSetEnable(InvSlotT[8], true)
set udg_InvSlot9 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InvSlotT09Func takes nothing returns nothing
call BlzFrameSetEnable(InvSlotT[9], false)
call BlzFrameSetEnable(InvSlotT[9], true)
set udg_InvSlot10 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InvSlotT10Func takes nothing returns nothing
call BlzFrameSetEnable(InvSlotT[10], false)
call BlzFrameSetEnable(InvSlotT[10], true)
set udg_InvSlot11 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
function InvSlotT11Func takes nothing returns nothing
call BlzFrameSetEnable(InvSlotT[11], false)
call BlzFrameSetEnable(InvSlotT[11], true)
set udg_InvSlot12 = GetConvertedPlayerId(GetTriggerPlayer())
endfunction
private function init takes nothing returns nothing
set FrameDialog = BlzCreateFrameByType("BACKDROP", "BACKDROP", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), "", 1)
call BlzFrameSetAbsPoint(FrameDialog, FRAMEPOINT_TOPLEFT, 0.182230, 0.265780)
call BlzFrameSetAbsPoint(FrameDialog, FRAMEPOINT_BOTTOMRIGHT, 0.660990, 0.159320)
call BlzFrameSetTexture(FrameDialog, "war3mapImported\\RPGFrame.tga", 0, true)
set DialogKnopfMap = BlzCreateFrame("IconButtonTemplate", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0, 0)
call BlzFrameSetAbsPoint(DialogKnopfMap, FRAMEPOINT_TOPLEFT, 0.166650, 0.0859200)
call BlzFrameSetAbsPoint(DialogKnopfMap, FRAMEPOINT_BOTTOMRIGHT, 0.191960, 0.0614500)
set BackdropDialogKnopfMap = BlzCreateFrameByType("BACKDROP", "BackdropDialogKnopfMap", DialogKnopfMap, "", 0)
call BlzFrameSetAllPoints(BackdropDialogKnopfMap, DialogKnopfMap)
call BlzFrameSetTexture(BackdropDialogKnopfMap, "UI\\Widgets\\Glues\\Icon-Map-Authenticated.blp", 0, true)
set TriggerDialogKnopfMap = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerDialogKnopfMap, DialogKnopfMap, FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerDialogKnopfMap, function DialogKnopfMapFunc)
set Landkarte = BlzCreateFrameByType("BACKDROP", "BACKDROP", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), "", 1)
call BlzFrameSetAbsPoint(Landkarte, FRAMEPOINT_TOPLEFT, 0.180000, 0.556270)
call BlzFrameSetAbsPoint(Landkarte, FRAMEPOINT_BOTTOMRIGHT, 0.660650, 0.199620)
call BlzFrameSetTexture(Landkarte, "war3mapImported\\MondragonMap.tga", 0, true)
set CastbarExtra = BlzCreateFrameByType("BACKDROP", "BACKDROP", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), "", 1)
call BlzFrameSetAbsPoint(CastbarExtra, FRAMEPOINT_TOPLEFT, 0.330620, 0.181610)
call BlzFrameSetAbsPoint(CastbarExtra, FRAMEPOINT_BOTTOMRIGHT, 0.463810, 0.100820)
call BlzFrameSetTexture(CastbarExtra, "war3mapImported\\Fokus.tga", 0, true)
set InventarFrame = BlzCreateFrameByType("BACKDROP", "BACKDROP", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), "", 1)
call BlzFrameSetAbsPoint(InventarFrame, FRAMEPOINT_TOPLEFT, 0.545800, 0.000440000)
call BlzFrameSetAbsPoint(InventarFrame, FRAMEPOINT_BOTTOMRIGHT, 0.545900, 0.000340000)
call BlzFrameSetTexture(InventarFrame, "ReplaceableTextures\\Shadows\\Shadow", 0, true)
set InventarFrameH = BlzCreateFrameByType("BACKDROP", "BACKDROP", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), "", 1)
call BlzFrameSetAbsPoint(InventarFrameH, FRAMEPOINT_TOPLEFT, 0.575800, 0.000100000)
call BlzFrameSetAbsPoint(InventarFrameH, FRAMEPOINT_BOTTOMRIGHT, 0.575900, 0.00000)
call BlzFrameSetTexture(InventarFrameH, "ReplaceableTextures\\Shadows\\Shadow", 0, true)
set InvKnopfRucks = BlzCreateFrame("IconButtonTemplate", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0, 0)
call BlzFrameSetAbsPoint(InvKnopfRucks, FRAMEPOINT_TOPLEFT, 0.514310, 0.154280)
call BlzFrameSetAbsPoint(InvKnopfRucks, FRAMEPOINT_BOTTOMRIGHT, 0.590480, 0.123670)
set TriggerInvKnopfRucks = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInvKnopfRucks, InvKnopfRucks, FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInvKnopfRucks, function InvKnopfRucksFunc)
set InvChar = BlzCreateFrameByType("BACKDROP", "BACKDROP", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), "", 1)
call BlzFrameSetAbsPoint(InvChar, FRAMEPOINT_TOPLEFT, 0.207580, 0.139280)
call BlzFrameSetAbsPoint(InvChar, FRAMEPOINT_BOTTOMRIGHT, 0.511890, 0.000260000)
call BlzFrameSetTexture(InvChar, "war3mapImported\\MondragonUIinv.dds", 0, true)
set InvLeer = BlzCreateFrameByType("BACKDROP", "BACKDROP", BlzGetOriginFrame(ORIGIN_FRAME_WORLD_FRAME, 0), "", 1)
call BlzFrameSetAbsPoint(InvLeer, FRAMEPOINT_TOPLEFT, 0.465900, 0.127900)
call BlzFrameSetAbsPoint(InvLeer, FRAMEPOINT_BOTTOMRIGHT, 0.591900, 0.00190000)
call BlzFrameSetTexture(InvLeer, "war3mapImported\\MondragonUI00.dds", 0, true)
set InvCharLeer = BlzCreateFrameByType("BACKDROP", "BACKDROP", BlzGetOriginFrame(ORIGIN_FRAME_WORLD_FRAME, 0), "", 1)
call BlzFrameSetAbsPoint(InvCharLeer, FRAMEPOINT_TOPLEFT, 0.465900, 0.127900)
call BlzFrameSetAbsPoint(InvCharLeer, FRAMEPOINT_BOTTOMRIGHT, 0.591900, 0.00190000)
call BlzFrameSetTexture(InvCharLeer, "war3mapImported\\MondragonUI00C.dds", 0, true)
set InvBack = BlzCreateFrameByType("BACKDROP", "BACKDROP", BlzGetOriginFrame(ORIGIN_FRAME_WORLD_FRAME, 0), "", 1)
call BlzFrameSetAbsPoint(InvBack, FRAMEPOINT_TOPLEFT, 0.199500, 0.117270)
call BlzFrameSetAbsPoint(InvBack, FRAMEPOINT_BOTTOMRIGHT, 0.514180, 0.00000)
call BlzFrameSetTexture(InvBack, "Textures\\Black32.dds", 0, true)
set FrameDialogText = BlzCreateFrameByType("TEXT", "name", FrameDialog, "", 0)
call BlzFrameSetAbsPoint(FrameDialogText, FRAMEPOINT_TOPLEFT, 0.245610, 0.251940)
call BlzFrameSetAbsPoint(FrameDialogText, FRAMEPOINT_BOTTOMRIGHT, 0.633790, 0.137110)
call BlzFrameSetText(FrameDialogText, "|cff00ff11Text vom Held|r")
call BlzFrameSetEnable(FrameDialogText, false)
call BlzFrameSetScale(FrameDialogText, 1.43)
call BlzFrameSetTextAlignment(FrameDialogText, TEXT_JUSTIFY_TOP, TEXT_JUSTIFY_LEFT)
set InventarKnopf1 = BlzCreateFrame("IconButtonTemplate", InventarFrame, 0, 0)
call BlzFrameSetAbsPoint(InventarKnopf1, FRAMEPOINT_TOPLEFT, 0.495210, 0.106730)
call BlzFrameSetAbsPoint(InventarKnopf1, FRAMEPOINT_BOTTOMRIGHT, 0.518120, 0.0829300)
set BackdropInventarKnopf1 = BlzCreateFrameByType("BACKDROP", "BackdropInventarKnopf1", InventarKnopf1, "", 0)
call BlzFrameSetAllPoints(BackdropInventarKnopf1, InventarKnopf1)
call BlzFrameSetTexture(BackdropInventarKnopf1, "ReplaceableTextures\\CommandButtons\\BTNMGExchange.blp", 0, true)
set TriggerInventarKnopf1 = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInventarKnopf1, InventarKnopf1, FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInventarKnopf1, function InventarKnopf1Func)
set InventarKnopf2 = BlzCreateFrame("IconButtonTemplate", InventarFrame, 0, 0)
call BlzFrameSetAbsPoint(InventarKnopf2, FRAMEPOINT_TOPLEFT, 0.584630, 0.106730)
call BlzFrameSetAbsPoint(InventarKnopf2, FRAMEPOINT_BOTTOMRIGHT, 0.607540, 0.0829300)
set BackdropInventarKnopf2 = BlzCreateFrameByType("BACKDROP", "BackdropInventarKnopf2", InventarKnopf2, "", 0)
call BlzFrameSetAllPoints(BackdropInventarKnopf2, InventarKnopf2)
call BlzFrameSetTexture(BackdropInventarKnopf2, "ReplaceableTextures\\CommandButtons\\BTNMGExchange.blp", 0, true)
set TriggerInventarKnopf2 = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInventarKnopf2, InventarKnopf2, FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInventarKnopf2, function InventarKnopf2Func)
set InventarKnopf3 = BlzCreateFrame("IconButtonTemplate", InventarFrame, 0, 0)
call BlzFrameSetAbsPoint(InventarKnopf3, FRAMEPOINT_TOPLEFT, 0.495210, 0.0691500)
call BlzFrameSetAbsPoint(InventarKnopf3, FRAMEPOINT_BOTTOMRIGHT, 0.518120, 0.0453500)
set BackdropInventarKnopf3 = BlzCreateFrameByType("BACKDROP", "BackdropInventarKnopf3", InventarKnopf3, "", 0)
call BlzFrameSetAllPoints(BackdropInventarKnopf3, InventarKnopf3)
call BlzFrameSetTexture(BackdropInventarKnopf3, "ReplaceableTextures\\CommandButtons\\BTNMGExchange.blp", 0, true)
set TriggerInventarKnopf3 = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInventarKnopf3, InventarKnopf3, FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInventarKnopf3, function InventarKnopf3Func)
set InventarKnopf4 = BlzCreateFrame("IconButtonTemplate", InventarFrame, 0, 0)
call BlzFrameSetAbsPoint(InventarKnopf4, FRAMEPOINT_TOPLEFT, 0.584630, 0.0691500)
call BlzFrameSetAbsPoint(InventarKnopf4, FRAMEPOINT_BOTTOMRIGHT, 0.607540, 0.0453500)
set BackdropInventarKnopf4 = BlzCreateFrameByType("BACKDROP", "BackdropInventarKnopf4", InventarKnopf4, "", 0)
call BlzFrameSetAllPoints(BackdropInventarKnopf4, InventarKnopf4)
call BlzFrameSetTexture(BackdropInventarKnopf4, "ReplaceableTextures\\CommandButtons\\BTNMGExchange.blp", 0, true)
set TriggerInventarKnopf4 = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInventarKnopf4, InventarKnopf4, FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInventarKnopf4, function InventarKnopf4Func)
set InventarKnopf5 = BlzCreateFrame("IconButtonTemplate", InventarFrame, 0, 0)
call BlzFrameSetAbsPoint(InventarKnopf5, FRAMEPOINT_TOPLEFT, 0.495210, 0.0317900)
call BlzFrameSetAbsPoint(InventarKnopf5, FRAMEPOINT_BOTTOMRIGHT, 0.518120, 0.00799000)
set BackdropInventarKnopf5 = BlzCreateFrameByType("BACKDROP", "BackdropInventarKnopf5", InventarKnopf5, "", 0)
call BlzFrameSetAllPoints(BackdropInventarKnopf5, InventarKnopf5)
call BlzFrameSetTexture(BackdropInventarKnopf5, "ReplaceableTextures\\CommandButtons\\BTNMGExchange.blp", 0, true)
set TriggerInventarKnopf5 = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInventarKnopf5, InventarKnopf5, FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInventarKnopf5, function InventarKnopf5Func)
set InventarKnopf6 = BlzCreateFrame("IconButtonTemplate", InventarFrame, 0, 0)
call BlzFrameSetAbsPoint(InventarKnopf6, FRAMEPOINT_TOPLEFT, 0.584630, 0.0317900)
call BlzFrameSetAbsPoint(InventarKnopf6, FRAMEPOINT_BOTTOMRIGHT, 0.607540, 0.00799000)
set BackdropInventarKnopf6 = BlzCreateFrameByType("BACKDROP", "BackdropInventarKnopf6", InventarKnopf6, "", 0)
call BlzFrameSetAllPoints(BackdropInventarKnopf6, InventarKnopf6)
call BlzFrameSetTexture(BackdropInventarKnopf6, "ReplaceableTextures\\CommandButtons\\BTNMGExchange.blp", 0, true)
set TriggerInventarKnopf6 = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInventarKnopf6, InventarKnopf6, FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInventarKnopf6, function InventarKnopf6Func)
set InventarKnopf1H = BlzCreateFrame("IconButtonTemplate", InventarFrameH, 0, 0)
call BlzFrameSetAbsPoint(InventarKnopf1H, FRAMEPOINT_TOPLEFT, 0.495210, 0.106730)
call BlzFrameSetAbsPoint(InventarKnopf1H, FRAMEPOINT_BOTTOMRIGHT, 0.518120, 0.0829300)
set BackdropInventarKnopf1H = BlzCreateFrameByType("BACKDROP", "BackdropInventarKnopf1H", InventarKnopf1H, "", 0)
call BlzFrameSetAllPoints(BackdropInventarKnopf1H, InventarKnopf1H)
call BlzFrameSetTexture(BackdropInventarKnopf1H, "ReplaceableTextures\\CommandButtons\\btnmarketplace.blp", 0, true)
set TriggerInventarKnopf1H = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInventarKnopf1H, InventarKnopf1H, FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInventarKnopf1H, function InventarKnopf1HFunc)
set InventarKnopf2H = BlzCreateFrame("IconButtonTemplate", InventarFrameH, 0, 0)
call BlzFrameSetAbsPoint(InventarKnopf2H, FRAMEPOINT_TOPLEFT, 0.584630, 0.106730)
call BlzFrameSetAbsPoint(InventarKnopf2H, FRAMEPOINT_BOTTOMRIGHT, 0.607540, 0.0829300)
set BackdropInventarKnopf2H = BlzCreateFrameByType("BACKDROP", "BackdropInventarKnopf2H", InventarKnopf2H, "", 0)
call BlzFrameSetAllPoints(BackdropInventarKnopf2H, InventarKnopf2H)
call BlzFrameSetTexture(BackdropInventarKnopf2H, "ReplaceableTextures\\CommandButtons\\btnmarketplace.blp", 0, true)
set TriggerInventarKnopf2H = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInventarKnopf2H, InventarKnopf2H, FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInventarKnopf2H, function InventarKnopf2HFunc)
set InventarKnopf3H = BlzCreateFrame("IconButtonTemplate", InventarFrameH, 0, 0)
call BlzFrameSetAbsPoint(InventarKnopf3H, FRAMEPOINT_TOPLEFT, 0.495210, 0.0691500)
call BlzFrameSetAbsPoint(InventarKnopf3H, FRAMEPOINT_BOTTOMRIGHT, 0.518120, 0.0453500)
set BackdropInventarKnopf3H = BlzCreateFrameByType("BACKDROP", "BackdropInventarKnopf3H", InventarKnopf3H, "", 0)
call BlzFrameSetAllPoints(BackdropInventarKnopf3H, InventarKnopf3H)
call BlzFrameSetTexture(BackdropInventarKnopf3H, "ReplaceableTextures\\CommandButtons\\btnmarketplace.blp", 0, true)
set TriggerInventarKnopf3H = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInventarKnopf3H, InventarKnopf3H, FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInventarKnopf3H, function InventarKnopf3HFunc)
set InventarKnopf4H = BlzCreateFrame("IconButtonTemplate", InventarFrameH, 0, 0)
call BlzFrameSetAbsPoint(InventarKnopf4H, FRAMEPOINT_TOPLEFT, 0.584630, 0.0691500)
call BlzFrameSetAbsPoint(InventarKnopf4H, FRAMEPOINT_BOTTOMRIGHT, 0.607540, 0.0453500)
set BackdropInventarKnopf4H = BlzCreateFrameByType("BACKDROP", "BackdropInventarKnopf4H", InventarKnopf4H, "", 0)
call BlzFrameSetAllPoints(BackdropInventarKnopf4H, InventarKnopf4H)
call BlzFrameSetTexture(BackdropInventarKnopf4H, "ReplaceableTextures\\CommandButtons\\btnmarketplace.blp", 0, true)
set TriggerInventarKnopf4H = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInventarKnopf4H, InventarKnopf4H, FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInventarKnopf4H, function InventarKnopf4HFunc)
set InventarKnopf5H = BlzCreateFrame("IconButtonTemplate", InventarFrameH, 0, 0)
call BlzFrameSetAbsPoint(InventarKnopf5H, FRAMEPOINT_TOPLEFT, 0.495210, 0.0317900)
call BlzFrameSetAbsPoint(InventarKnopf5H, FRAMEPOINT_BOTTOMRIGHT, 0.518120, 0.00799000)
set BackdropInventarKnopf5H = BlzCreateFrameByType("BACKDROP", "BackdropInventarKnopf5H", InventarKnopf5H, "", 0)
call BlzFrameSetAllPoints(BackdropInventarKnopf5H, InventarKnopf5H)
call BlzFrameSetTexture(BackdropInventarKnopf5H, "ReplaceableTextures\\CommandButtons\\btnmarketplace.blp", 0, true)
set TriggerInventarKnopf5H = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInventarKnopf5H, InventarKnopf5H, FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInventarKnopf5H, function InventarKnopf5HFunc)
set InventarKnopf6H = BlzCreateFrame("IconButtonTemplate", InventarFrameH, 0, 0)
call BlzFrameSetAbsPoint(InventarKnopf6H, FRAMEPOINT_TOPLEFT, 0.584630, 0.0317900)
call BlzFrameSetAbsPoint(InventarKnopf6H, FRAMEPOINT_BOTTOMRIGHT, 0.607540, 0.00799000)
set BackdropInventarKnopf6H = BlzCreateFrameByType("BACKDROP", "BackdropInventarKnopf6H", InventarKnopf6H, "", 0)
call BlzFrameSetAllPoints(BackdropInventarKnopf6H, InventarKnopf6H)
call BlzFrameSetTexture(BackdropInventarKnopf6H, "ReplaceableTextures\\CommandButtons\\btnmarketplace.blp", 0, true)
set TriggerInventarKnopf6H = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInventarKnopf6H, InventarKnopf6H, FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInventarKnopf6H, function InventarKnopf6HFunc)
set InvRucksack = BlzCreateFrame("EscMenuBackdrop", BlzGetOriginFrame(ORIGIN_FRAME_WORLD_FRAME, 0), 0, 0)
call BlzFrameSetAbsPoint(InvRucksack, FRAMEPOINT_TOPLEFT, 0.502390, 0.265500)
call BlzFrameSetAbsPoint(InvRucksack, FRAMEPOINT_BOTTOMRIGHT, 0.654500, 0.144980)
set DialogKnopfUnten = BlzCreateFrame("IconButtonTemplate", FrameDialogText, 0, 0)
call BlzFrameSetAbsPoint(DialogKnopfUnten, FRAMEPOINT_TOPLEFT, 0.197450, 0.200000)
call BlzFrameSetAbsPoint(DialogKnopfUnten, FRAMEPOINT_BOTTOMRIGHT, 0.227450, 0.170000)
set BackdropDialogKnopfUnten = BlzCreateFrameByType("BACKDROP", "BackdropDialogKnopfUnten", DialogKnopfUnten, "", 0)
call BlzFrameSetAllPoints(BackdropDialogKnopfUnten, DialogKnopfUnten)
call BlzFrameSetTexture(BackdropDialogKnopfUnten, "war3mapImported\\DialogRunter.tga", 0, true)
set TriggerDialogKnopfUnten = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerDialogKnopfUnten, DialogKnopfUnten, FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerDialogKnopfUnten, function DialogKnopfUntenFunc)
set DialogKnopfEnde = BlzCreateFrame("IconButtonTemplate", FrameDialogText, 0, 0)
call BlzFrameSetAbsPoint(DialogKnopfEnde, FRAMEPOINT_TOPLEFT, 0.197450, 0.252000)
call BlzFrameSetAbsPoint(DialogKnopfEnde, FRAMEPOINT_BOTTOMRIGHT, 0.227450, 0.222000)
set BackdropDialogKnopfEnde = BlzCreateFrameByType("BACKDROP", "BackdropDialogKnopfEnde", DialogKnopfEnde, "", 0)
call BlzFrameSetAllPoints(BackdropDialogKnopfEnde, DialogKnopfEnde)
call BlzFrameSetTexture(BackdropDialogKnopfEnde, "war3mapImported\\DialogCheck.tga", 0, true)
set TriggerDialogKnopfEnde = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerDialogKnopfEnde, DialogKnopfEnde, FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerDialogKnopfEnde, function DialogKnopfEndeFunc)
set DialogKnopfOben = BlzCreateFrame("IconButtonTemplate", FrameDialogText, 0, 0)
call BlzFrameSetAbsPoint(DialogKnopfOben, FRAMEPOINT_TOPLEFT, 0.197450, 0.226000)
call BlzFrameSetAbsPoint(DialogKnopfOben, FRAMEPOINT_BOTTOMRIGHT, 0.227450, 0.196000)
set BackdropDialogKnopfOben = BlzCreateFrameByType("BACKDROP", "BackdropDialogKnopfOben", DialogKnopfOben, "", 0)
call BlzFrameSetAllPoints(BackdropDialogKnopfOben, DialogKnopfOben)
call BlzFrameSetTexture(BackdropDialogKnopfOben, "war3mapImported\\DialogHoch.tga", 0, true)
set TriggerDialogKnopfOben = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerDialogKnopfOben, DialogKnopfOben, FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerDialogKnopfOben, function DialogKnopfObenFunc)
set InvSlotT[0] = BlzCreateFrame("IconButtonTemplate", InvRucksack, 0, 0)
call BlzFrameSetAbsPoint(InvSlotT[0], FRAMEPOINT_TOPLEFT, 0.517540, 0.250280)
call BlzFrameSetAbsPoint(InvSlotT[0], FRAMEPOINT_BOTTOMRIGHT, 0.547540, 0.220280)
set BackdropInvSlotT[0] = BlzCreateFrameByType("BACKDROP", "BackdropInvSlotT[0]", InvSlotT[0], "", 0)
call BlzFrameSetAllPoints(BackdropInvSlotT[0], InvSlotT[0])
call BlzFrameSetTexture(BackdropInvSlotT[0], "CustomFrame.png", 0, true)
set TriggerInvSlotT[0] = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInvSlotT[0], InvSlotT[0], FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInvSlotT[0], function InvSlotT00Func)
set InvSlotT[1] = BlzCreateFrame("IconButtonTemplate", InvRucksack, 0, 0)
call BlzFrameSetAbsPoint(InvSlotT[1], FRAMEPOINT_TOPLEFT, 0.548040, 0.250280)
call BlzFrameSetAbsPoint(InvSlotT[1], FRAMEPOINT_BOTTOMRIGHT, 0.578040, 0.220280)
set BackdropInvSlotT[1] = BlzCreateFrameByType("BACKDROP", "BackdropInvSlotT[1]", InvSlotT[1], "", 0)
call BlzFrameSetAllPoints(BackdropInvSlotT[1], InvSlotT[1])
call BlzFrameSetTexture(BackdropInvSlotT[1], "CustomFrame.png", 0, true)
set TriggerInvSlotT[1] = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInvSlotT[1], InvSlotT[1], FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInvSlotT[1], function InvSlotT01Func)
set InvSlotT[2] = BlzCreateFrame("IconButtonTemplate", InvRucksack, 0, 0)
call BlzFrameSetAbsPoint(InvSlotT[2], FRAMEPOINT_TOPLEFT, 0.578540, 0.250280)
call BlzFrameSetAbsPoint(InvSlotT[2], FRAMEPOINT_BOTTOMRIGHT, 0.608540, 0.220280)
set BackdropInvSlotT[2] = BlzCreateFrameByType("BACKDROP", "BackdropInvSlotT[2]", InvSlotT[2], "", 0)
call BlzFrameSetAllPoints(BackdropInvSlotT[2], InvSlotT[2])
call BlzFrameSetTexture(BackdropInvSlotT[2], "CustomFrame.png", 0, true)
set TriggerInvSlotT[2] = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInvSlotT[2], InvSlotT[2], FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInvSlotT[2], function InvSlotT02Func)
set InvSlotT[3] = BlzCreateFrame("IconButtonTemplate", InvRucksack, 0, 0)
call BlzFrameSetAbsPoint(InvSlotT[3], FRAMEPOINT_TOPLEFT, 0.609040, 0.250280)
call BlzFrameSetAbsPoint(InvSlotT[3], FRAMEPOINT_BOTTOMRIGHT, 0.639040, 0.220280)
set BackdropInvSlotT[3] = BlzCreateFrameByType("BACKDROP", "BackdropInvSlotT[3]", InvSlotT[3], "", 0)
call BlzFrameSetAllPoints(BackdropInvSlotT[3], InvSlotT[3])
call BlzFrameSetTexture(BackdropInvSlotT[3], "CustomFrame.png", 0, true)
set TriggerInvSlotT[3] = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInvSlotT[3], InvSlotT[3], FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInvSlotT[3], function InvSlotT03Func)
set InvSlotT[4] = BlzCreateFrame("IconButtonTemplate", InvRucksack, 0, 0)
call BlzFrameSetAbsPoint(InvSlotT[4], FRAMEPOINT_TOPLEFT, 0.517540, 0.219780)
call BlzFrameSetAbsPoint(InvSlotT[4], FRAMEPOINT_BOTTOMRIGHT, 0.547540, 0.189780)
set BackdropInvSlotT[4] = BlzCreateFrameByType("BACKDROP", "BackdropInvSlotT[4]", InvSlotT[4], "", 0)
call BlzFrameSetAllPoints(BackdropInvSlotT[4], InvSlotT[4])
call BlzFrameSetTexture(BackdropInvSlotT[4], "CustomFrame.png", 0, true)
set TriggerInvSlotT[4] = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInvSlotT[4], InvSlotT[4], FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInvSlotT[4], function InvSlotT04Func)
set InvSlotT[5] = BlzCreateFrame("IconButtonTemplate", InvRucksack, 0, 0)
call BlzFrameSetAbsPoint(InvSlotT[5], FRAMEPOINT_TOPLEFT, 0.548040, 0.219780)
call BlzFrameSetAbsPoint(InvSlotT[5], FRAMEPOINT_BOTTOMRIGHT, 0.578040, 0.189780)
set BackdropInvSlotT[5] = BlzCreateFrameByType("BACKDROP", "BackdropInvSlotT[5]", InvSlotT[5], "", 0)
call BlzFrameSetAllPoints(BackdropInvSlotT[5], InvSlotT[5])
call BlzFrameSetTexture(BackdropInvSlotT[5], "CustomFrame.png", 0, true)
set TriggerInvSlotT[5] = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInvSlotT[5], InvSlotT[5], FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInvSlotT[5], function InvSlotT05Func)
set InvSlotT[6] = BlzCreateFrame("IconButtonTemplate", InvRucksack, 0, 0)
call BlzFrameSetAbsPoint(InvSlotT[6], FRAMEPOINT_TOPLEFT, 0.578540, 0.219780)
call BlzFrameSetAbsPoint(InvSlotT[6], FRAMEPOINT_BOTTOMRIGHT, 0.608540, 0.189780)
set BackdropInvSlotT[6] = BlzCreateFrameByType("BACKDROP", "BackdropInvSlotT[6]", InvSlotT[6], "", 0)
call BlzFrameSetAllPoints(BackdropInvSlotT[6], InvSlotT[6])
call BlzFrameSetTexture(BackdropInvSlotT[6], "CustomFrame.png", 0, true)
set TriggerInvSlotT[6] = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInvSlotT[6], InvSlotT[6], FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInvSlotT[6], function InvSlotT06Func)
set InvSlotT[7] = BlzCreateFrame("IconButtonTemplate", InvRucksack, 0, 0)
call BlzFrameSetAbsPoint(InvSlotT[7], FRAMEPOINT_TOPLEFT, 0.609040, 0.219780)
call BlzFrameSetAbsPoint(InvSlotT[7], FRAMEPOINT_BOTTOMRIGHT, 0.639040, 0.189780)
set BackdropInvSlotT[7] = BlzCreateFrameByType("BACKDROP", "BackdropInvSlotT[7]", InvSlotT[7], "", 0)
call BlzFrameSetAllPoints(BackdropInvSlotT[7], InvSlotT[7])
call BlzFrameSetTexture(BackdropInvSlotT[7], "CustomFrame.png", 0, true)
set TriggerInvSlotT[7] = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInvSlotT[7], InvSlotT[7], FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInvSlotT[7], function InvSlotT07Func)
set InvSlotT[8] = BlzCreateFrame("IconButtonTemplate", InvRucksack, 0, 0)
call BlzFrameSetAbsPoint(InvSlotT[8], FRAMEPOINT_TOPLEFT, 0.517540, 0.189280)
call BlzFrameSetAbsPoint(InvSlotT[8], FRAMEPOINT_BOTTOMRIGHT, 0.547540, 0.159280)
set BackdropInvSlotT[8] = BlzCreateFrameByType("BACKDROP", "BackdropInvSlotT[8]", InvSlotT[8], "", 0)
call BlzFrameSetAllPoints(BackdropInvSlotT[8], InvSlotT[8])
call BlzFrameSetTexture(BackdropInvSlotT[8], "CustomFrame.png", 0, true)
set TriggerInvSlotT[8] = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInvSlotT[8], InvSlotT[8], FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInvSlotT[8], function InvSlotT08Func)
set InvSlotT[9] = BlzCreateFrame("IconButtonTemplate", InvRucksack, 0, 0)
call BlzFrameSetAbsPoint(InvSlotT[9], FRAMEPOINT_TOPLEFT, 0.548040, 0.189280)
call BlzFrameSetAbsPoint(InvSlotT[9], FRAMEPOINT_BOTTOMRIGHT, 0.578040, 0.159280)
set BackdropInvSlotT[9] = BlzCreateFrameByType("BACKDROP", "BackdropInvSlotT[9]", InvSlotT[9], "", 0)
call BlzFrameSetAllPoints(BackdropInvSlotT[9], InvSlotT[9])
call BlzFrameSetTexture(BackdropInvSlotT[9], "CustomFrame.png", 0, true)
set TriggerInvSlotT[9] = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInvSlotT[9], InvSlotT[9], FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInvSlotT[9], function InvSlotT09Func)
set InvSlotT[10] = BlzCreateFrame("IconButtonTemplate", InvRucksack, 0, 0)
call BlzFrameSetAbsPoint(InvSlotT[10], FRAMEPOINT_TOPLEFT, 0.578540, 0.189280)
call BlzFrameSetAbsPoint(InvSlotT[10], FRAMEPOINT_BOTTOMRIGHT, 0.608540, 0.159280)
set BackdropInvSlotT[10] = BlzCreateFrameByType("BACKDROP", "BackdropInvSlotT[10]", InvSlotT[10], "", 0)
call BlzFrameSetAllPoints(BackdropInvSlotT[10], InvSlotT[10])
call BlzFrameSetTexture(BackdropInvSlotT[10], "CustomFrame.png", 0, true)
set TriggerInvSlotT[10] = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInvSlotT[10], InvSlotT[10], FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInvSlotT[10], function InvSlotT10Func)
set InvSlotT[11] = BlzCreateFrame("IconButtonTemplate", InvRucksack, 0, 0)
call BlzFrameSetAbsPoint(InvSlotT[11], FRAMEPOINT_TOPLEFT, 0.609040, 0.189280)
call BlzFrameSetAbsPoint(InvSlotT[11], FRAMEPOINT_BOTTOMRIGHT, 0.639040, 0.159280)
set BackdropInvSlotT[11] = BlzCreateFrameByType("BACKDROP", "BackdropInvSlotT[11]", InvSlotT[11], "", 0)
call BlzFrameSetAllPoints(BackdropInvSlotT[11], InvSlotT[11])
call BlzFrameSetTexture(BackdropInvSlotT[11], "CustomFrame.png", 0, true)
set TriggerInvSlotT[11] = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerInvSlotT[11], InvSlotT[11], FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerInvSlotT[11], function InvSlotT11Func)
set FokusKnopf = BlzCreateFrame("IconButtonTemplate", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0, 0)
call BlzFrameSetAbsPoint(FokusKnopf, FRAMEPOINT_CENTER, 0.465, 0.112)
call BlzFrameSetSize(FokusKnopf, 0.02, 0.02)
set BackdropFokusKnopf = BlzCreateFrameByType("BACKDROP", "BackdropFokusKnopf", FokusKnopf, "", 0)
call BlzFrameSetAllPoints(BackdropFokusKnopf, FokusKnopf)
call BlzFrameSetTexture(BackdropFokusKnopf, "UI\\Widgets\\Console\\Human\\infocard-heroattributes-str.blp", 0, true)
set TriggerFokusKnopf = CreateTrigger()
call BlzTriggerRegisterFrameEvent(TriggerFokusKnopf, FokusKnopf, FRAMEEVENT_CONTROL_CLICK)
call TriggerAddAction(TriggerFokusKnopf, function FokusKnopfFunc)
// Tooltip-Frame
set tipFrame = BlzCreateFrameByType("FRAME", "MyTooltip", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), "", 0)
set tipText = BlzCreateFrameByType("TEXT", "MyTooltipText", tipFrame, "", 0)
call BlzFrameSetLevel(tipFrame, 999)
call BlzFrameSetSize(tipFrame, 0.14, 0.06)
call BlzFrameSetPoint(tipFrame, FRAMEPOINT_TOPLEFT, FokusKnopf, FRAMEPOINT_BOTTOMLEFT, -0.03, -0.005)
call BlzFrameSetAllPoints(tipText, tipFrame)
call BlzFrameSetText(tipText, "...")
call BlzFrameSetEnable(tipText, true)
// Verknüpfen
call BlzFrameSetTooltip(FokusKnopf, tipFrame)
call InitTalentHash()
call InitInteractHash()
call InitCalendarData()
call InitAllTechs()
endfunction
endlibrary
function UpdateBars takes nothing returns nothing
local unit u = udg_ZRPGHero[GetConvertedPlayerId(GetLocalPlayer())]
local real cdBase = BlzGetAbilityCooldown('AX13', GetUnitAbilityLevel(u, 'AX13') - 1)
local real cdCurrent = BlzGetUnitAbilityCooldownRemaining(u, 'AX13')
call BlzFrameSetMinMaxValue(BlzGetFrameByName("MyBarEx",1), 0, 1)
call BlzFrameSetValue(BlzGetFrameByName("MyBarEx",1), cdBase - cdCurrent)
set u = null
endfunction
function MyBarCreate takes nothing returns nothing
local framehandle bar = BlzCreateSimpleFrame("MyBarEx", BlzGetOriginFrame(ORIGIN_FRAME_WORLD_FRAME, 0), 1) //Create Bar at createContext 1
call BlzFrameSetAbsPoint(bar, FRAMEPOINT_CENTER, 0.402, 0.135) // pos the bar
call BlzFrameSetTexture(bar, "Replaceabletextures\\Teamcolor\\Teamcolor05.blp", 0, true) //change the BarTexture of bar to color red
call BlzFrameSetTexture(BlzGetFrameByName("MyBarBackground",4), "Replaceabletextures\\CommandButtonsDisabled\\DISBTNHeroPaladin.blp", 0, true) //Change the background to DisabledPaladin-Face. ("MyBarBackground", 4) belongs to Bar4. would Bar4 be a "MyBarEx" one would have to write "MyBarExBackground" cause they are named differently in fdf.
call BlzFrameSetText(BlzGetFrameByName("MyBarExText",1), "")
endfunction
//===========================================================================
function InitTrig_Bar takes nothing returns nothing
local trigger trig = CreateTrigger()
set gg_trg_Bar = CreateTrigger()
call TriggerRegisterTimerEventPeriodic( trig, 0.2 )
call TriggerAddAction( gg_trg_Bar, function MyBarCreate )
call TriggerAddAction(trig, function UpdateBars)
endfunction
function UpdateBars2 takes nothing returns nothing
local unit u = udg_UnitExtraDmg[GetConvertedPlayerId(GetLocalPlayer())]
local real cdCurrent = TimerGetElapsed(udg_TimerDmg[GetConvertedPlayerId(GetLocalPlayer())])
call BlzFrameSetMinMaxValue(BlzGetFrameByName("MyBarEx2",1), 0, 2.2)
call BlzFrameSetValue(BlzGetFrameByName("MyBarEx2",1), cdCurrent)
set u = null
endfunction
function MyBarCreate2 takes nothing returns nothing
local framehandle bar2 = BlzCreateSimpleFrame("MyBarEx2", BlzGetOriginFrame(ORIGIN_FRAME_HERO_BAR, 0), 1) //Create Bar at createContext 1
call BlzFrameSetAbsPoint(bar2, FRAMEPOINT_CENTER, 0.402, 0.135) // pos the bar
call BlzFrameSetTexture(bar2, "Replaceabletextures\\Teamcolor\\Teamcolor00.blp", 0, true) //change the BarTexture of bar to color red
call BlzFrameSetTexture(BlzGetFrameByName("MyBarBackground",4), "Replaceabletextures\\CommandButtonsDisabled\\DISBTNHeroPaladin.blp", 0, true) //Change the background to DisabledPaladin-Face. ("MyBarBackground", 4) belongs to Bar4. would Bar4 be a "MyBarEx" one would have to write "MyBarExBackground" cause they are named differently in fdf.
call BlzFrameSetText(BlzGetFrameByName("MyBarExText",1), "")
endfunction
//===========================================================================
function InitTrig_Bar2 takes nothing returns nothing
local trigger trig = CreateTrigger()
set gg_trg_Bar2 = CreateTrigger()
call TriggerRegisterTimerEventPeriodic( trig, 0.2 )
call TriggerAddAction( gg_trg_Bar2, function MyBarCreate2 )
call TriggerAddAction(trig, function UpdateBars2)
endfunction
function Trig_SelectAusr_Cond takes nothing returns boolean
local unit trgUnit = GetTriggerUnit()
return trgUnit == udg_ZRPGHeroAusr[3] or trgUnit == udg_ZRPGHeroAusr[4] or trgUnit == udg_ZRPGHeroAusr[5]
endfunction
function Trig_SelectAusr_Actions takes nothing returns nothing
local boolean selected = (GetTriggerEventId() == EVENT_PLAYER_UNIT_SELECTED)
set udg_Player = GetTriggerPlayer()
if GetLocalPlayer() == udg_Player then
call BlzFrameSetVisible(InvChar, selected)
call BlzFrameSetVisible(InvCharLeer, selected)
call BlzFrameSetVisible(InvLeer, not selected)
endif
endfunction
//===========================================================================
function InitTrig_SelectAusr takes nothing returns nothing
set gg_trg_SelectAusr = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(gg_trg_SelectAusr, Player(2), EVENT_PLAYER_UNIT_SELECTED, null)
call TriggerRegisterPlayerUnitEvent(gg_trg_SelectAusr, Player(3), EVENT_PLAYER_UNIT_SELECTED, null)
call TriggerRegisterPlayerUnitEvent(gg_trg_SelectAusr, Player(4), EVENT_PLAYER_UNIT_SELECTED, null)
call TriggerRegisterPlayerUnitEvent(gg_trg_SelectAusr, Player(2), EVENT_PLAYER_UNIT_DESELECTED, null)
call TriggerRegisterPlayerUnitEvent(gg_trg_SelectAusr, Player(3), EVENT_PLAYER_UNIT_DESELECTED, null)
call TriggerRegisterPlayerUnitEvent(gg_trg_SelectAusr, Player(4), EVENT_PLAYER_UNIT_DESELECTED, null)
call TriggerAddCondition(gg_trg_SelectAusr, Condition(function Trig_SelectAusr_Cond))
call TriggerAddAction(gg_trg_SelectAusr, function Trig_SelectAusr_Actions)
endfunction
function Trig_DialogKnopfObenUnten_Actions takes nothing returns nothing
local integer index
local integer playerIndex
local player triggerPlayer
if udg_RealKnopfOben != 0.00 then
set playerIndex = R2I(udg_RealKnopfOben)
set udg_DialogTabelle[playerIndex] = udg_DialogTabelle[playerIndex] - 1
endif
if udg_RealKnopfUnten != 0.00 then
set playerIndex = R2I(udg_RealKnopfUnten)
set udg_DialogTabelle[playerIndex] = udg_DialogTabelle[playerIndex] + 1
endif
set triggerPlayer = GetTriggerPlayer()
set index = udg_DialogTabelle[playerIndex]
if index >= 0 and index <= 6 then
if GetLocalPlayer() == triggerPlayer then
if index <= 1 then
call BlzFrameSetText(FrameDialogText, udg_StringDialog1[playerIndex])
elseif index == 2 then
call BlzFrameSetText(FrameDialogText, udg_StringDialog2[playerIndex])
elseif index == 3 then
call BlzFrameSetText(FrameDialogText, udg_StringDialog3[playerIndex])
elseif index == 4 then
call BlzFrameSetText(FrameDialogText, udg_StringDialog4[playerIndex])
elseif index == 5 then
call BlzFrameSetText(FrameDialogText, udg_StringDialog5[playerIndex])
else
call BlzFrameSetText(FrameDialogText, udg_StringDialog6[playerIndex])
endif
endif
set udg_DialogTabelle[playerIndex] = index
endif
set udg_RealKnopfOben = 0.00
set udg_RealKnopfUnten = 0.00
endfunction
//===========================================================================
function InitTrig_DialogKnopfObenUnten takes nothing returns nothing
set gg_trg_DialogKnopfObenUnten = CreateTrigger()
call TriggerRegisterVariableEvent(gg_trg_DialogKnopfObenUnten, "udg_RealKnopfOben", NOT_EQUAL, 0.00)
call TriggerRegisterVariableEvent(gg_trg_DialogKnopfObenUnten, "udg_RealKnopfUnten", NOT_EQUAL, 0.00)
call TriggerAddAction(gg_trg_DialogKnopfObenUnten, function Trig_DialogKnopfObenUnten_Actions)
endfunction
function Trig_LandkarteAn_HasMapItem takes integer playerId returns boolean
// Überprüfen, ob der Spieler eine Landkarte im Inventar hat
return RPG_HasMapItem(playerId, 'kymn')
endfunction
function Trig_LandkarteAn_Actions takes nothing returns nothing
local integer playerId = R2I(udg_testVar)
local player triggerPlayer = GetTriggerPlayer()
local boolean isMapActive = udg_LandkarteAnAus[playerId]
set udg_LandkarteAnAus[playerId] = not isMapActive
if not Trig_LandkarteAn_HasMapItem(playerId) then
set udg_testVar = -1.00
return
endif
if GetLocalPlayer() == triggerPlayer then
call BlzFrameSetVisible(Landkarte, not isMapActive)
endif
set udg_testVar = -1.00
endfunction
//===========================================================================
function InitTrig_LandkarteAn takes nothing returns nothing
set gg_trg_LandkarteAn = CreateTrigger()
call TriggerRegisterVariableEvent(gg_trg_LandkarteAn, "udg_testVar", NOT_EQUAL, -1.00)
call TriggerAddAction(gg_trg_LandkarteAn, function Trig_LandkarteAn_Actions)
endfunction
globals
integer array udg_SelectedType // 0=none,1=Vendor,2=Trader,3=Held
integer udg_SelectionCount = 0
trigger gg_trg_HandelTimer = null
unit array udg_SelectedUnit // akutell angeklickte Einheit
unit array udg_TradePartner
integer array udg_TradePartnerType // 1=Vendor, 2=Trader
endglobals
function OnHandelConditions takes nothing returns boolean
local integer i = 3
loop
exitwhen i > 5
if UnitHasBuffBJ(udg_ZRPGHero[i], 'B01R') or UnitHasBuffBJ(udg_ZRPGHero[i], 'B01T') then
return true
endif
set i = i + 1
endloop
return false
endfunction
// -----------------------------------------------------
// Fähigkeitserkennung: AX80 = Vendor, AX81 = Trader
// -----------------------------------------------------
function IsVendorNPC takes unit whichUnit returns boolean
return (GetUnitAbilityLevel(whichUnit, 'AX80') > 0)
endfunction
function IsTraderNPC takes unit whichUnit returns boolean
return (GetUnitAbilityLevel(whichUnit, 'AX81') > 0)
endfunction
// -----------------------------------------------------
// SetSelectedType(pId,val): Steuert Timer an/aus
// und setzt udg_SelectedType[pId]=val
// -----------------------------------------------------
function SetSelectedType takes integer pId, integer val returns nothing
if udg_SelectedType[pId] == val then
return
endif
if udg_SelectedType[pId] != 0 then
set udg_SelectionCount = udg_SelectionCount - 1
if udg_SelectionCount < 0 then
set udg_SelectionCount = 0
endif
endif
set udg_SelectedType[pId] = val
if val != 0 then
set udg_SelectionCount = udg_SelectionCount + 1
endif
if udg_SelectionCount > 0 then
call EnableTrigger(gg_trg_HandelTimer)
else
call DisableTrigger(gg_trg_HandelTimer)
endif
endfunction
// -----------------------------------------------------
// Zeigt/verbirgt InventarFrame / InventarFrameH
// Nur, wenn udg_TradePartner[pId]!=null und Held den Buff hat
// -----------------------------------------------------
function ShowOrHideFrame takes player p, integer selType, unit hero, integer pId returns nothing
local boolean hasVendorBuff = UnitHasBuffBJ(hero, 'B01R')
local boolean hasTraderBuff = UnitHasBuffBJ(hero, 'B01T')
// Wenn kein gemerkter Händler => Frames bleiben aus
if udg_TradePartner[pId] == null then
return
endif
if GetLocalPlayer() != p then
return
endif
// Erstmal alles aus
call BlzFrameSetVisible(InventarFrame, false)
call BlzFrameSetVisible(InventarFrameH, false)
if selType == 1 then
// Vendor => nur wenn Held 'B01R'
if hasVendorBuff then
call BlzFrameSetVisible(InventarFrame, true)
endif
elseif selType == 2 then
// Trader => nur wenn Held 'B01T'
if hasTraderBuff then
call BlzFrameSetVisible(InventarFrameH, true)
endif
elseif selType == 3 then
// Held => je nach Buff
if hasVendorBuff then
call BlzFrameSetVisible(InventarFrame, true)
elseif hasTraderBuff then
call BlzFrameSetVisible(InventarFrameH, true)
endif
endif
endfunction
// -----------------------------------------------------
// OnHandelTimer: Aktualisiert Frames alle 0.5s
// + Vergisst den Händler, wenn der Held den Buff verliert
// -----------------------------------------------------
function OnHandelTimer takes nothing returns nothing
local integer i = 2
local integer st
local unit hero
local player p
local boolean hasVendorBuff
local boolean hasTraderBuff
loop
exitwhen i > 4
set p = Player(i)
set st = udg_SelectedType[i]
if st != 0 then
set hero = udg_ZRPGHero[i+1]
if hero != null then
// Frame updaten
call ShowOrHideFrame(p, st, hero, i)
// Buffcheck -> wenn Buff weg, Partner nullen
set hasVendorBuff = UnitHasBuffBJ(hero, 'B01R')
set hasTraderBuff = UnitHasBuffBJ(hero, 'B01T')
// Falls gemerkter Partner=Vendor, Held hat keinen Vendor-Buff
if (udg_TradePartnerType[i] == 1) and (not hasVendorBuff) then
set udg_TradePartner[i] = null
set udg_TradePartnerType[i] = 0
endif
// Falls gemerkter Partner=Trader, Held hat keinen Trader-Buff
if (udg_TradePartnerType[i] == 2) and (not hasTraderBuff) then
set udg_TradePartner[i] = null
set udg_TradePartnerType[i] = 0
endif
endif
endif
set i = i + 1
endloop
endfunction
// -----------------------------------------------------
// OnHandelSelection: Klick auf eine Einheit
// => Held=3, Vendor=1, Trader=2, sonst=0
// Falls wir einen neuen Vendor/Trader anklicken,
// wird er gemerkt (udg_TradePartner).
// -----------------------------------------------------
function OnHandelSelection takes nothing returns nothing
local player p = GetTriggerPlayer()
local integer pId = GetPlayerId(p)
local unit sel = GetTriggerUnit()
local unit hero
local integer heroIndex
// Player(2)->Hero[3], (3)->Hero[4], (4)->Hero[5]
if p == Player(2) then
set heroIndex = 3
elseif p == Player(3) then
set heroIndex = 4
elseif p == Player(4) then
set heroIndex = 5
else
call SetSelectedType(pId, 0)
set udg_SelectedUnit[pId] = null
return
endif
set hero = udg_ZRPGHero[heroIndex]
if hero == null then
call SetSelectedType(pId, 0)
set udg_SelectedUnit[pId] = null
return
endif
// Held?
if sel == hero then
call SetSelectedType(pId, 3)
set udg_SelectedUnit[pId] = hero
// Partner bleibt
call ShowOrHideFrame(p, 3, hero, pId)
return
endif
// Vendor?
if IsVendorNPC(sel) then
call SetSelectedType(pId, 1)
set udg_SelectedUnit[pId] = sel
set udg_TradePartner[pId] = sel
set udg_TradePartnerType[pId] = 1
call ShowOrHideFrame(p, 1, hero, pId)
return
endif
// Trader?
if IsTraderNPC(sel) then
call SetSelectedType(pId, 2)
set udg_SelectedUnit[pId] = sel
set udg_TradePartner[pId] = sel
set udg_TradePartnerType[pId] = 2
call ShowOrHideFrame(p, 2, hero, pId)
return
endif
// Sonst => 0
call SetSelectedType(pId, 0)
set udg_SelectedUnit[pId] = null
// Falls du willst, kannst du hier den Partner verwerfen:
// set udg_TradePartner[pId] = null
// set udg_TradePartnerType[pId] = 0
call ShowOrHideFrame(p, 0, hero, pId)
endfunction
// -----------------------------------------------------
// Init: Timer + Selection für Player(2..4)
// -----------------------------------------------------
function InitTrig_HandelSystem takes nothing returns nothing
local trigger trigSel = CreateTrigger()
// Timer
set gg_trg_HandelTimer = CreateTrigger()
call TriggerRegisterTimerEventPeriodic(gg_trg_HandelTimer, 0.50)
call TriggerAddAction(gg_trg_HandelTimer, function OnHandelTimer)
call DisableTrigger(gg_trg_HandelTimer)
// Auswahl
call TriggerRegisterPlayerSelectionEventBJ(trigSel, Player(2), true)
call TriggerRegisterPlayerSelectionEventBJ(trigSel, Player(3), true)
call TriggerRegisterPlayerSelectionEventBJ(trigSel, Player(4), true)
call TriggerAddCondition( trigSel, Condition( function OnHandelConditions ) )
call TriggerAddAction(trigSel, function OnHandelSelection)
endfunction
// -----------------------------------------------------
// Setzt alle Inventar-Slots auf -1.00
// -----------------------------------------------------
function ResetInventarSlots takes nothing returns nothing
set udg_inventar1 = -1.00
set udg_inventar2 = -1.00
set udg_inventar3 = -1.00
set udg_inventar4 = -1.00
set udg_inventar5 = -1.00
set udg_inventar6 = -1.00
endfunction
// -----------------------------------------------------
// Sucht den ersten Slot (1..6), dessen Wert != -1.00
// und gibt ihn zurück; 0, wenn keiner.
// -----------------------------------------------------
function GetActiveSlot takes nothing returns integer
local integer i = 1
local real val
loop
exitwhen i > 6
if i == 1 then
set val = udg_inventar1
elseif i == 2 then
set val = udg_inventar2
elseif i == 3 then
set val = udg_inventar3
elseif i == 4 then
set val = udg_inventar4
elseif i == 5 then
set val = udg_inventar5
else
set val = udg_inventar6
endif
if val != -1.00 then
return i
endif
set i = i + 1
endloop
return 0
endfunction
// -----------------------------------------------------
// Liest den real-Wert aus einem bestimmten Inventar-Slot.
// (Dieser Wert ist idR 3..5 => Player(2..4), also pId=R2I(val)-1.)
// -----------------------------------------------------
function GetSlotValue takes integer slotId returns real
if slotId == 1 then
return udg_inventar1
elseif slotId == 2 then
return udg_inventar2
elseif slotId == 3 then
return udg_inventar3
elseif slotId == 4 then
return udg_inventar4
elseif slotId == 5 then
return udg_inventar5
elseif slotId == 6 then
return udg_inventar6
endif
return -1.00
endfunction
// -----------------------------------------------------
// "HandelVerkauf"-Trigger (final):
// 1) Ermittelt Slot + pId (2..4)
// 2) Held => ZRPGHero[3..5]
// 3) Vendor => Immer Held->Vendor
// 4) Trader => Zwei-Wege
// - Held ausgewählt => Held->Trader
// - Trader ausgewählt => Trader->Held
// -----------------------------------------------------
function Trig_HandelVerkauf_Actions takes nothing returns nothing
local integer slotId = GetActiveSlot()
local real slotVal
local integer pId
local unit hero
local unit partner
local integer partnerType
local unit selUnit
local integer selType
if slotId == 0 then
// Keiner der Slots belegt => abbruch
return
endif
// Wert aus dem Slot => 3..5 => pId=2..4
set slotVal = GetSlotValue(slotId)
set pId = R2I(slotVal) - 1
set udg_Pint= pId
if pId < 2 or pId > 4 then
call ResetInventarSlots()
return
endif
// Held
if pId == 2 then
set hero = udg_ZRPGHero[3]
elseif pId == 3 then
set hero = udg_ZRPGHero[4]
else
set hero = udg_ZRPGHero[5]
endif
if hero == null then
call ResetInventarSlots()
return
endif
// Gemerkter Händler + Typ
set partner = udg_TradePartner[pId]
set partnerType = udg_TradePartnerType[pId]
// Gerade ausgewählte Einheit
set selUnit = udg_SelectedUnit[pId]
set selType = udg_SelectedType[pId]
// 1=Vendor => Immer Held->Vendor
if partnerType == 1 then
call UnitDropItemTarget(hero, UnitItemInSlotBJ(hero, slotId), partner)
// 2=Trader => Zwei-Wege
elseif partnerType == 2 then
if selType == 3 then
// Held ausgewählt => Held->Trader
call UnitDropItemTarget(hero, UnitItemInSlotBJ(hero, slotId), partner)
elseif selType == 2 then
// Trader ausgewählt => Trader->Held
call UnitDropItemTarget(partner, UnitItemInSlotBJ(partner, slotId), hero)
else
// Fallback => Held->Trader
call UnitDropItemTarget(hero, UnitItemInSlotBJ(hero, slotId), partner)
endif
else
// partnerType=0 => kein Händler => abbruch
call ResetInventarSlots()
return
endif
// Aufräumen
call ResetInventarSlots()
endfunction
// -----------------------------------------------------
// Initialisierung: Registriert VariableEvents
// für udg_inventar1..6 => ruft obiges Action-Fn auf
// -----------------------------------------------------
function InitTrig_HandelVerkauf takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterVariableEvent(t, "udg_inventar1", NOT_EQUAL, -1.00)
call TriggerRegisterVariableEvent(t, "udg_inventar2", NOT_EQUAL, -1.00)
call TriggerRegisterVariableEvent(t, "udg_inventar3", NOT_EQUAL, -1.00)
call TriggerRegisterVariableEvent(t, "udg_inventar4", NOT_EQUAL, -1.00)
call TriggerRegisterVariableEvent(t, "udg_inventar5", NOT_EQUAL, -1.00)
call TriggerRegisterVariableEvent(t, "udg_inventar6", NOT_EQUAL, -1.00)
call TriggerAddAction(t, function Trig_HandelVerkauf_Actions)
endfunction
globals
framehandle array itemModel // Ein Modell pro Spieler
boolean array itemModelActive
player array itemModelOwner
endglobals
function Trig_ItemAni_Conditions takes nothing returns boolean
if ( not ( UnitHasItem(GetOrderedUnit(), GetOrderTargetItem()) == true ) ) then
return false
endif
return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) and not IsUnitType(GetTriggerUnit(), UNIT_TYPE_STRUCTURE) // Prüfe, ob die Einheit ein Held ist
endfunction
function LinksklickBed takes nothing returns boolean
if ( not ( BlzGetTriggerPlayerMouseButton() == MOUSE_BUTTON_TYPE_LEFT ) ) then
return false
endif
return itemModelActive[GetPlayerId(GetTriggerPlayer())] and (GetTriggerPlayer() == itemModelOwner[GetPlayerId(GetTriggerPlayer())]) // Nur ausführen, wenn das Modell aktiv ist und der richtige Spieler
endfunction
function endAniGo takes nothing returns nothing
local integer playerId = GetPlayerId(GetTriggerPlayer())
// Überprüfen, ob der auslösende Spieler der Besitzer des Modells ist
if GetTriggerPlayer() == itemModelOwner[playerId] then
// Setze die Sichtbarkeit des Sprites nur für den lokalen Spieler auf false
if GetLocalPlayer() == GetTriggerPlayer() then
call BlzFrameSetVisible(itemModel[playerId], false)
endif
// Zerstöre den Frame nur, wenn er existiert, um sicherzustellen, dass kein Null-Wert verarbeitet wird
if itemModel[playerId] != null then
call BlzDestroyFrame(itemModel[playerId])
set itemModel[playerId] = null
endif
// Aktualisiere den Zustand
set itemModelActive[playerId] = false
set itemModelOwner[playerId] = null
endif
endfunction
function Linksklick takes nothing returns nothing
local integer playerId = GetPlayerId(GetTriggerPlayer())
local integer i = 0
local item invItem
local unit h = udg_ZRPGHero[playerId+1]
call endAniGo()
if h != null then
// Durchsucht das Inventar und setzt die Priorität zurück
set i = 0
loop
exitwhen i >= 6
set invItem = UnitItemInSlot(h, i)
if invItem != null and GetItemType(invItem) == ITEM_TYPE_PURCHASABLE and (BlzGetItemIntegerField(invItem, ITEM_IF_PRIORITY) == 1) then
call BlzSetItemIntegerFieldBJ(invItem, ITEM_IF_PRIORITY, 0)
endif
set i = i + 1
endloop
else
endif
endfunction
function Trig_ItemAni_Actions takes nothing returns nothing
local item targetItem = GetOrderTargetItem()
local integer slotIndex = -1
local integer i
local unit hero = GetOrderedUnit()
local real x_ui
local real y_ui
local real slot0_x = 0.538
local real slot0_y = 0.102
local real offset_x = 0.04
local real offset_y = 0.04
local real offset_y_slot4 = 0.08
local integer itemTypeId = GetItemTypeId(targetItem)
local integer splitCharges = 1 // Anzahl der abzutrennenden Ladungen
local item newItem
local integer playerId = GetPlayerId(GetTriggerPlayer())
local player udg_Player = GetTriggerPlayer()
if targetItem == null then
return
endif
// Überprüfen, ob die Einheit ein Held ist, das Item nicht im Inventar ist,
// der Item-Typ korrekt ist und die Ladungen ausreichen.
if IsUnitType(hero, UNIT_TYPE_HERO) and UnitHasItem(hero, targetItem) and GetItemType(targetItem) == ITEM_TYPE_PURCHASABLE and GetItemCharges(targetItem) >= 2 and (BlzGetItemIntegerField(targetItem, ITEM_IF_PRIORITY) == 1) and GetItemTypeId(targetItem) != 'shrs' then
// Reduzieren der Ladungen des ursprünglichen Items
set newItem = CreateItem(itemTypeId, GetUnitX(hero), GetUnitY(hero))
call SetItemCharges(targetItem, GetItemCharges(targetItem) - splitCharges)
// Erstellen des neuen Items mit den abgetrennten Ladungen
call SetItemCharges(newItem, splitCharges)
// Setzen der Item-Ladungen des neuen Items auf 0, um Stapeln zu vermeiden
call BlzSetItemIntegerFieldBJ(newItem, ITEM_IF_NUMBER_OF_CHARGES, 0)
// Hinzufügen des neuen Items zum Inventar
call UnitAddItem(hero, newItem)
// Setzen der Ladungen des neuen Items auf 1
call BlzSetItemIntegerFieldBJ(newItem, ITEM_IF_NUMBER_OF_CHARGES, 1)
// Neue Item-Priorität auf 0 setzen
call BlzSetItemIntegerFieldBJ(targetItem, ITEM_IF_PRIORITY, 0)
call BlzSetItemIntegerFieldBJ(newItem, ITEM_IF_PRIORITY, 0)
else
// Erneute If abfrage das nicht die PRIORITY von einem nicht ITEM_TYPE_PURCHASABLE geändert wird
if IsUnitType(hero, UNIT_TYPE_HERO) and UnitHasItem(hero, targetItem) and GetItemType(targetItem) == ITEM_TYPE_PURCHASABLE and GetItemCharges(targetItem) >= 2 and (BlzGetItemIntegerField(targetItem, ITEM_IF_PRIORITY) == 0) and GetItemTypeId(targetItem) != 'shrs' then
call BlzSetItemIntegerFieldBJ(targetItem, ITEM_IF_PRIORITY, 1)
endif
endif
call endAniGo()
// Finde den Slot, in dem sich das Item befindet
loop
set i = 0
loop
exitwhen i >= 6 // Annahme: Der Held hat maximal 6 Inventarslots (Index 0-5)
if UnitItemInSlot(hero, i) == targetItem then
set slotIndex = i
exitwhen true
endif
set i = i + 1
endloop
exitwhen slotIndex != -1
endloop
if slotIndex == -1 then
// Aufräumen
set targetItem = null
set hero = null
return
endif
// Berechne die UI-Koordinaten basierend auf dem Slotindex
if slotIndex == 0 then
set x_ui = slot0_x
set y_ui = slot0_y
elseif slotIndex == 1 then
set x_ui = slot0_x + offset_x
set y_ui = slot0_y
elseif slotIndex == 2 then
set x_ui = slot0_x
set y_ui = slot0_y - offset_y
elseif slotIndex == 3 then
set x_ui = slot0_x + offset_x
set y_ui = slot0_y - offset_y
elseif slotIndex == 4 then
set x_ui = slot0_x
set y_ui = slot0_y - offset_y_slot4
elseif slotIndex == 5 then
set x_ui = slot0_x + offset_x
set y_ui = slot0_y - offset_y_slot4
endif
// Frame-Erstellung für alle Spieler
set itemModel[playerId] = BlzCreateFrameByType("SPRITE", "SpriteName", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), "", 0)
// Sichtbarkeit nur für den lokalen Spieler setzen
if GetLocalPlayer() == udg_Player then
// Positioniere das Sprite an den berechneten Koordinaten
call BlzFrameSetAbsPoint(itemModel[playerId], FRAMEPOINT_CENTER, x_ui, y_ui)
// Setze das Modell für das Sprite
call BlzFrameSetModel(itemModel[playerId], "UI\\Feedback\\Autocast\\UI-ModalButtonOn.mdl", 0)
// Setze die Größe des Sprites, um die Sichtbarkeit sicherzustellen
call BlzFrameSetSize(itemModel[playerId], 0.05, 0.05)
// Setze die Sichtbarkeit des Sprites
call BlzFrameSetVisible(itemModel[playerId], true)
endif
// Aktualisiere den Zustand
set itemModelActive[playerId] = true // Setze das Modell als aktiv
set itemModelOwner[playerId] = GetTriggerPlayer() // Setze den Besitzer des Modells
// Aufräumen
set targetItem = null
set hero = null
set newItem = null
endfunction
function InitTrig_ItemAni takes nothing returns nothing
local trigger gg_trg_ItemAni = CreateTrigger()
local trigger endAniLeft = CreateTrigger()
local integer playerIndex
call TriggerRegisterAnyUnitEventBJ(gg_trg_ItemAni, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER)
call TriggerAddCondition(gg_trg_ItemAni, Condition(function Trig_ItemAni_Conditions))
call TriggerAddAction(gg_trg_ItemAni, function Trig_ItemAni_Actions)
// Das Modell wird bei einem Links-Klick der Maus zerstört
set playerIndex = 2 // Starte bei Spieler 3 (Index 2)
loop
exitwhen playerIndex > 4 // Spieler 3 bis 5 (Index 2-4)
call TriggerRegisterPlayerEvent(endAniLeft, Player(playerIndex), EVENT_PLAYER_MOUSE_UP)
call TriggerAddCondition(endAniLeft, Condition(function LinksklickBed))
call TriggerAddAction(endAniLeft, function Linksklick)
set playerIndex = playerIndex + 1
endloop
// Aufräumen
set gg_trg_ItemAni = null
set endAniLeft = null
endfunction
globals
trigger array InvSlotTrigger
// Globale Variablen: Ausgewähltes Item (Held→Rucksack)
item array udg_SelectedTargetItem
integer array udg_SelectedTargetSlot
// Blockiert kurz das ItemPickupAction
boolean array unterbindeItemPickup
endglobals
//==========================================================
// 1) Conditions für IssuedTargetOrder
//==========================================================
function Trig_ItemPickOrder_Conditions takes nothing returns boolean
// Prüft, ob das Item nicht außerhalb der Map liegt
if not (RectContainsItem(GetOrderTargetItem(), GetPlayableMapRect()) == false) then
return false
endif
// Prüft, ob Einheit ein Held und kein Gebäude
return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) and not IsUnitType(GetTriggerUnit(), UNIT_TYPE_STRUCTURE)
endfunction
//==========================================================
// 2) Actions für IssuedTargetOrder (speichert Held-Item + Slot)
//==========================================================
function Trig_ItemPickOrder_Actions takes nothing returns nothing
local item targetItem = GetOrderTargetItem()
local integer slotIndex= -1
local integer i
local unit hero = GetTriggerUnit()
local integer playerId = GetConvertedPlayerId(GetTriggerPlayer())
// Finde den Inventarslot (0..5), in dem sich targetItem befindet
set i = 0
loop
exitwhen i >= 6
if UnitItemInSlot(hero, i) == targetItem then
set slotIndex = i
exitwhen true
endif
set i = i + 1
endloop
// Merken: wir haben dieses Item+Slot "ausgewählt"
set udg_SelectedTargetItem[playerId] = targetItem
set udg_SelectedTargetSlot[playerId] = slotIndex
// Aufräumen
set targetItem = null
set hero = null
endfunction
//==========================================================
// 3) Hilfsfunktion: Prüft, ob eine Einheit 'u' einen freien Slot hat
//==========================================================
function UnitHasFreeSlot takes unit u, integer maxSlots returns boolean
local integer i = 0
loop
exitwhen i >= maxSlots
if UnitItemInSlot(u, i) == null then
return true
endif
set i = i + 1
endloop
return false
endfunction
//==========================================================
// Aktualisiert die Texturen (Icons) im Inventar
//==========================================================
function UpdateInventoryFrame takes nothing returns nothing
local integer i = 0
local item itm
local integer playerId = GetConvertedPlayerId(GetTriggerPlayer())
local unit inventoryUnit0 = udg_ZRPGHero[playerId]
local unit inventoryUnit1 = udg_UnitRucksack[playerId]
local unit inventoryUnit2 = udg_UnitRucksack2[playerId]
// Nur für den lokalen Spieler
set udg_Player = GetTriggerPlayer()
if GetLocalPlayer() == udg_Player then
loop
exitwhen i >= 12
if i < 6 then
set itm = UnitItemInSlot(inventoryUnit1, i)
else
set itm = UnitItemInSlot(inventoryUnit2, i - 6)
endif
if itm != null then
call BlzFrameSetTexture(BackdropInvSlotT[i], BlzGetItemIconPath(itm), 0, true)
else
call BlzFrameSetTexture(BackdropInvSlotT[i], "war3mapImported/MondragonUIslotfiller.dds", 0, true)
endif
set i = i + 1
endloop
endif
// Aufräumen
set itm = null
set inventoryUnit0 = null
set inventoryUnit1 = null
set inventoryUnit2 = null
endfunction
//==========================================================
// 4) SlotClickAction: Held→Rucksack und Rucksack→Held
//==========================================================
function SlotClickAction takes nothing returns nothing
local integer slotId = -1
local framehandle clickedFrame= BlzGetTriggerFrame()
local item clickedItem
local integer playerId = GetConvertedPlayerId(GetTriggerPlayer())
local unit hero = udg_ZRPGHero[playerId]
local unit inventoryUnit
local integer remainder
local integer i = 0
// Blockiere ItemPickupAction kurz
set unterbindeItemPickup[playerId] = true
// 1) Finde, auf welchen Rucksack-Slot (0..11) geklickt wurde
loop
exitwhen i >= 12
if i == 0 and udg_InvSlot1 != -1.00 then
set slotId = 0
elseif i == 1 and udg_InvSlot2 != -1.00 then
set slotId = 1
elseif i == 2 and udg_InvSlot3 != -1.00 then
set slotId = 2
elseif i == 3 and udg_InvSlot4 != -1.00 then
set slotId = 3
elseif i == 4 and udg_InvSlot5 != -1.00 then
set slotId = 4
elseif i == 5 and udg_InvSlot6 != -1.00 then
set slotId = 5
elseif i == 6 and udg_InvSlot7 != -1.00 then
set slotId = 6
elseif i == 7 and udg_InvSlot8 != -1.00 then
set slotId = 7
elseif i == 8 and udg_InvSlot9 != -1.00 then
set slotId = 8
elseif i == 9 and udg_InvSlot10 != -1.00 then
set slotId = 9
elseif i == 10 and udg_InvSlot11 != -1.00 then
set slotId = 10
elseif i == 11 and udg_InvSlot12 != -1.00 then
set slotId = 11
endif
set i = i + 1
endloop
// Kein Slot erkannt => Abbruch
if slotId == -1 then
set unterbindeItemPickup[playerId] = false
set hero = null
set clickedFrame = null
return
endif
// Bestimme Rucksack-Einheit
if slotId < 6 then
set inventoryUnit = udg_UnitRucksack[playerId]
else
set inventoryUnit = udg_UnitRucksack2[playerId]
endif
// remainder = slotId mod 6 => ModuloInteger
set remainder = ModuloInteger(slotId, 6)
set clickedItem = UnitItemInSlot(inventoryUnit, remainder)
// A) HELD->RUCKSACK: wenn Held ein Item ausgewählt hat
if udg_SelectedTargetItem[playerId] != null then
// Optionaler "Swap", falls Slot bereits belegt
if clickedItem != null then
// Falls Held Platz
if UnitHasFreeSlot(hero, 6) then
call UnitRemoveItem(inventoryUnit, clickedItem)
call UnitAddItem(hero, clickedItem)
else
// sonst Boden
call SetItemPosition(clickedItem, GetUnitX(hero), GetUnitY(hero))
endif
endif
// Held→Rucksack
if UnitItemInSlot(hero, udg_SelectedTargetSlot[playerId]) == udg_SelectedTargetItem[playerId] then
call UnitRemoveItem(hero, udg_SelectedTargetItem[playerId])
call UnitAddItem(inventoryUnit, udg_SelectedTargetItem[playerId])
endif
// Reset
set udg_SelectedTargetItem[playerId] = null
set udg_SelectedTargetSlot[playerId] = -1
// B) RUCKSACK->HELD: wenn kein Held-Item ausgewählt ist
else
if clickedItem != null then
// Held hat Platz?
if UnitHasFreeSlot(hero, 6) then
call UnitRemoveItem(inventoryUnit, clickedItem)
call UnitAddItem(hero, clickedItem)
else
// Kein Platz => auf Boden
call SetItemPosition(clickedItem, GetUnitX(hero), GetUnitY(hero))
endif
endif
endif
// Inventar updaten
call UpdateInventoryFrame()
// Slots wieder auf -1
set udg_InvSlot1 = -1.00
set udg_InvSlot2 = -1.00
set udg_InvSlot3 = -1.00
set udg_InvSlot4 = -1.00
set udg_InvSlot5 = -1.00
set udg_InvSlot6 = -1.00
set udg_InvSlot7 = -1.00
set udg_InvSlot8 = -1.00
set udg_InvSlot9 = -1.00
set udg_InvSlot10 = -1.00
set udg_InvSlot11 = -1.00
set udg_InvSlot12 = -1.00
// Aufräumen
set clickedItem = null
set hero = null
set inventoryUnit = null
set clickedFrame = null
// Blockierung aufheben
set unterbindeItemPickup[playerId] = false
endfunction
//==========================================================
// 5) ItemPickupAction (EVENT_PLAYER_UNIT_PICKUP_ITEM)
//==========================================================
function ItemPickupAction takes nothing returns nothing
local item pickedItem = GetManipulatedItem()
local integer playerId = GetConvertedPlayerId(GetTriggerPlayer())
local unit inventoryUnit1 = udg_UnitRucksack[playerId]
local unit inventoryUnit2 = udg_UnitRucksack2[playerId]
local unit hero = udg_ZRPGHero[playerId]
if unterbindeItemPickup[playerId] then
set hero = null
set pickedItem = null
set inventoryUnit1 = null
set inventoryUnit2 = null
return
endif
// Held voll?
if not UnitHasFreeSlot(hero, 6) then
if UnitHasFreeSlot(inventoryUnit1, 6) then
call UnitRemoveItem(hero, pickedItem)
call UnitAddItem(inventoryUnit1, pickedItem)
elseif UnitHasFreeSlot(inventoryUnit2, 6) then
call UnitRemoveItem(hero, pickedItem)
call UnitAddItem(inventoryUnit2, pickedItem)
endif
endif
call UpdateInventoryFrame()
// Aufräumen
set hero = null
set pickedItem = null
set inventoryUnit1 = null
set inventoryUnit2 = null
endfunction
//==========================================================
// 6) InitTrig_ItemPickup (dein Original-Setup)
//==========================================================
function InitTrig_ItemPickup takes nothing returns nothing
local trigger trig1 = CreateTrigger()
local trigger trig2 = CreateTrigger()
local integer i = 1
set gg_trg_ItemPickup = CreateTrigger()
// Registriert VariableEvent (udg_InvSlotX != -1.00)
loop
exitwhen i > 12
call TriggerRegisterVariableEvent(trig1, "udg_InvSlot" + I2S(i), NOT_EQUAL, -1.00)
set i = i + 1
endloop
call TriggerAddAction(trig1, function SlotClickAction)
// Event: IssuedTargetOrder -> Conditions -> Actions
call TriggerRegisterAnyUnitEventBJ(trig2, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER)
call TriggerAddCondition(trig2, Condition(function Trig_ItemPickOrder_Conditions))
call TriggerAddAction(trig2, function Trig_ItemPickOrder_Actions)
// Event: Unit picks up item -> ItemPickupAction
call TriggerRegisterAnyUnitEventBJ(gg_trg_ItemPickup, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddAction(gg_trg_ItemPickup, function ItemPickupAction)
// Aufräumen
set trig1 = null
set trig2 = null
endfunction
function Trig_ZielSelect_Actions takes nothing returns nothing
local player p = GetTriggerPlayer()
local integer pid = GetPlayerId(p) + 1
local unit caster = udg_ZRPGHero[pid]
local unit newTarget = GetTriggerUnit()
local string iconPath
if (newTarget != null) and (newTarget != caster) and (IsUnitEnemy(newTarget, p)) then
set udg_SelectUnit[pid] = newTarget
if GetLocalPlayer() == p then
call BlzFrameSetText(tipText, GetUnitName(newTarget))
set iconPath = BlzGetAbilityIcon(GetUnitTypeId(newTarget))
call BlzFrameSetTexture(BackdropFokusKnopf, iconPath, 0, true)
endif
endif
endfunction
//===========================================================================
function InitTrig_ZielSelect takes nothing returns nothing
set gg_trg_ZielSelect = CreateTrigger()
call TriggerAddAction(gg_trg_ZielSelect, function Trig_ZielSelect_Actions)
call TriggerRegisterPlayerSelectionEventBJ(gg_trg_ZielSelect, Player(2), true)
call TriggerRegisterPlayerSelectionEventBJ(gg_trg_ZielSelect, Player(3), true)
call TriggerRegisterPlayerSelectionEventBJ(gg_trg_ZielSelect, Player(4), true)
endfunction
function Trig_DeSelect_Actions takes player p returns nothing
local integer pid = GetPlayerId(p) + 1 // Spieler 3 bis 5
local unit hero = udg_ZRPGHero[pid]
local string iconPath
if hero != null and IsUnitAliveBJ(hero) then
call SelectUnitForPlayerSingle(hero, p)
if GetLocalPlayer() == p then
set iconPath = "UI\\Widgets\\Console\\Human\\infocard-heroattributes-str.blp"
call BlzFrameSetText(tipText, "")
call BlzFrameSetTexture(BackdropFokusKnopf, iconPath, 0, true)
endif
set udg_SelectUnit[pid] = null
endif
endfunction
function Trig_DeSelect_Wrapper takes nothing returns nothing
call Trig_DeSelect_Actions(GetTriggerPlayer())
endfunction
//===========================================================================
function InitTrig_DeSelect takes nothing returns nothing
set gg_trg_DeSelect = CreateTrigger()
call TriggerRegisterPlayerEvent(gg_trg_DeSelect, Player(2), EVENT_PLAYER_END_CINEMATIC)
call TriggerRegisterPlayerEvent(gg_trg_DeSelect, Player(3), EVENT_PLAYER_END_CINEMATIC)
call TriggerRegisterPlayerEvent(gg_trg_DeSelect, Player(4), EVENT_PLAYER_END_CINEMATIC)
call TriggerAddAction(gg_trg_DeSelect, function Trig_DeSelect_Wrapper)
endfunction
function Trig_ReSelect_Actions takes nothing returns nothing
local player triggerPlayer = GetTriggerPlayer()
local integer pid = GetPlayerId(triggerPlayer) + 1 // Spieler 3 bis 5
if udg_SelectUnit[pid] != null then
call SelectUnitForPlayerSingle(udg_SelectUnit[pid], triggerPlayer)
endif
set udg_FokusKnopf = -1.00
endfunction
//===========================================================================
function InitTrig_ReSelect takes nothing returns nothing
set gg_trg_ReSelect = CreateTrigger()
call TriggerRegisterVariableEvent(gg_trg_ReSelect, "udg_FokusKnopf", NOT_EQUAL, -1.00)
call TriggerAddAction(gg_trg_ReSelect, function Trig_ReSelect_Actions)
endfunction
globals
constant real VERRAT_THRESHOLD = 400.00
endglobals
function GetReputationDescription takes real value returns string
if value <= 50.00 then
return "|cff80ff80good|r"
elseif value <= 200.00 then
return "|cffd45e19under observation|r"
elseif value < 400.00 then
return "|cffff0000bad|r"
else
return "|cffff0000Wanted|r"
endif
endfunction
function HandleBetrayalCommonActions takes player damagedPlayer, player damageSourcePlayer, unit damagedUnit, sound betrayalSound returns nothing
call SetPlayerAllianceStateBJ(damagedPlayer, damageSourcePlayer, bj_ALLIANCE_UNALLIED)
call PlaySoundOnUnitBJ(betrayalSound, 100, damagedUnit)
endfunction
function IncrementVerratValue takes integer factionId, integer playerId, real damage returns boolean
if factionId == 13 then
set udg_VerratRitter[playerId] = udg_VerratRitter[playerId] + damage
return udg_VerratRitter[playerId] >= VERRAT_THRESHOLD
elseif factionId == 6 then
set udg_VerratOrcs[playerId] = udg_VerratOrcs[playerId] + damage
return udg_VerratOrcs[playerId] >= VERRAT_THRESHOLD
elseif factionId == 7 then
set udg_VerratElfen[playerId] = udg_VerratElfen[playerId] + damage
return udg_VerratElfen[playerId] >= VERRAT_THRESHOLD
elseif factionId == 11 then
set udg_VerratPiraten[playerId] = udg_VerratPiraten[playerId] + damage
return udg_VerratPiraten[playerId] >= VERRAT_THRESHOLD
elseif factionId == 9 then
set udg_VerratBewohner[playerId] = udg_VerratBewohner[playerId] + damage
return udg_VerratBewohner[playerId] >= VERRAT_THRESHOLD
endif
return false
endfunction
function CheckIfDamagedBySpecificPlayers takes nothing returns boolean
local integer playerId = GetPlayerId(GetOwningPlayer(udg_GDD_DamagedUnit))
return (playerId == 6 or playerId == 7 or playerId == 9 or playerId == 11 or playerId == 13)
endfunction
function CheckIfDamageSourceIsPlayer takes nothing returns boolean
local integer playerId = GetPlayerId(GetOwningPlayer(udg_GDD_DamageSource))
return (playerId == 2 or playerId == 3 or playerId == 4)
endfunction
function TeamVerratConditions takes nothing returns boolean
return IsPlayerAlly(GetOwningPlayer(udg_GDD_DamagedUnit), GetOwningPlayer(udg_GDD_DamageSource)) and (udg_GDD_Damage >= 2.00) and CheckIfDamagedBySpecificPlayers() and CheckIfDamageSourceIsPlayer()
endfunction
function UpdateRufTooltip takes player trigPlayer returns nothing
local unit trigUnit = udg_ZRPGHeroAusr[GetConvertedPlayerId(trigPlayer)]
local integer pIndex = GetConvertedPlayerId(trigPlayer)
local string repString
local string baseDescription = "If your reputation with your allies begins to deteriorate due to criminal behavior, you must consult a Lawman. Otherwise, you face death or imprisonment."
local string tooltip = "Reputation: "
call ModifyHeroStat(bj_HEROSTAT_STR, udg_ZRPGHeroAusr[pIndex], bj_MODIFYMETHOD_SET, GetHeroStatBJ(bj_HEROSTAT_STR, udg_ZRPGHero[pIndex], true))
call ModifyHeroStat(bj_HEROSTAT_AGI, udg_ZRPGHeroAusr[pIndex], bj_MODIFYMETHOD_SET, GetHeroStatBJ(bj_HEROSTAT_STR, udg_ZRPGHero[pIndex], true))
call ModifyHeroStat(bj_HEROSTAT_INT, udg_ZRPGHeroAusr[pIndex], bj_MODIFYMETHOD_SET, GetHeroStatBJ(bj_HEROSTAT_STR, udg_ZRPGHero[pIndex], true))
call BlzSetUnitMaxMana(udg_ZRPGHeroAusr[pIndex], 0)
call BlzSetAbilityExtendedTooltip(udg_AbiRuf[pIndex], baseDescription, 0)
set repString = BlzGetAbilityExtendedTooltip(udg_AbiRuf[pIndex], 0)
// Knight's Guard (13)
set tooltip = tooltip + "|nKnight's Guard: " + GetReputationDescription(udg_VerratRitter[pIndex])
// Orcs (6)
set tooltip = tooltip + "|nShaman Clan: " + GetReputationDescription(udg_VerratOrcs[pIndex])
// Elfen (7)
set tooltip = tooltip + "|nElven Expedition: " + GetReputationDescription(udg_VerratElfen[pIndex])
// Piraten (11)
set tooltip = tooltip + "|nPirates: " + GetReputationDescription(udg_VerratPiraten[pIndex])
// Bewohner (9)
set tooltip = tooltip + "|nInhabitants: " + GetReputationDescription(udg_VerratBewohner[pIndex])
call BlzSetAbilityTooltip(udg_AbiRuf[pIndex], tooltip, 0)
set trigUnit = null
endfunction
function TeamVerratActions takes nothing returns nothing
local unit damagedUnit = udg_GDD_DamagedUnit
local unit damageSource = udg_GDD_DamageSource
local player damagedUnitOwnerPlayer = GetOwningPlayer(damagedUnit)
local player damageSourcePlayer = GetOwningPlayer(damageSource)
local integer playerId = GetConvertedPlayerId(damageSourcePlayer)
local integer damagedUnitOwnerId = GetPlayerId(damagedUnitOwnerPlayer)
local integer damagedUnitType = GetUnitTypeId(damagedUnit)
local boolean thresholdReached = IncrementVerratValue(damagedUnitOwnerId, playerId, udg_GDD_Damage)
// Ruf-Tooltip aktualisieren
call UpdateRufTooltip(damageSourcePlayer)
// Bei Erreichen der Schwelle KEIN Reset mehr, damit der Wert hoch bleibt!
if thresholdReached then
// Remove call ResetVerratValue(damagedUnitOwnerId, playerId)
if damagedUnitOwnerId == 13 then
call HandleBetrayalCommonActions(damagedUnitOwnerPlayer, damageSourcePlayer, damagedUnit, gg_snd_3D_Menschen_Veraeter)
elseif damagedUnitOwnerId == 6 then
call HandleBetrayalCommonActions(damagedUnitOwnerPlayer, damageSourcePlayer, damagedUnit, gg_snd_3D_Orcs_Veraeter)
elseif damagedUnitOwnerId == 7 then
if (damagedUnitType == 'nhef' or damagedUnitType == 'nhea' or damagedUnitType == 'hsor' or damagedUnitType == 'Hjnd') then
if (IsQuestCompleted(udg_Quest[35]) or not IsQuestDiscovered(udg_Quest[35])) then
call HandleBetrayalCommonActions(damagedUnitOwnerPlayer, damageSourcePlayer, damagedUnit, gg_snd_3D_Elfen_Veraeter_Weiblich)
else
call HandleBetrayalCommonActions(damagedUnitOwnerPlayer, damageSourcePlayer, damagedUnit, gg_snd_3D_Elfen_Veraeter_Maenlich)
endif
else
call HandleBetrayalCommonActions(damagedUnitOwnerPlayer, damageSourcePlayer, damagedUnit, gg_snd_3D_Elfen_Veraeter_Maenlich)
endif
elseif damagedUnitOwnerId == 11 then
call HandleBetrayalCommonActions(damagedUnitOwnerPlayer, damageSourcePlayer, damagedUnit, gg_snd_3D_Piraten_Veraeter)
elseif damagedUnitOwnerId == 9 then
call SetPlayerAllianceStateBJ(Player(13), damageSourcePlayer, bj_ALLIANCE_UNALLIED)
set udg_VerratRitter[playerId] = 400
call TriggerExecute(gg_trg_TeamAngriff_Neutrale)
endif
// Erneutes Update nach Allianzänderung (optional)
call UpdateRufTooltip(damageSourcePlayer)
endif
set damagedUnit = null
set damageSource = null
endfunction
function InitTrig_TeamVerrat takes nothing returns nothing
set gg_trg_TeamVerrat = CreateTrigger()
call TriggerRegisterVariableEvent(gg_trg_TeamVerrat, "udg_GDD_Event", GREATER_THAN, 0.00)
call TriggerAddCondition(gg_trg_TeamVerrat, Condition(function TeamVerratConditions))
call TriggerAddAction(gg_trg_TeamVerrat, function TeamVerratActions)
endfunction
function Trig_Angstzone_Flug_Conditions takes nothing returns boolean
// Bedingung: Nur fliegende Einheiten werden überprüft
if ( not ( IsUnitType(GetEnteringUnit(), UNIT_TYPE_FLYING) == true ) ) then
return false
endif
// Bedingung: Einheit darf nicht den Buff 'B021' haben
if ( not ( UnitHasBuffBJ(gg_unit_Otch_0318, 'B021') == false ) ) then
return false
endif
return true
endfunction
function Trig_Angstzone_Flug_Func013C takes nothing returns boolean
// Bedingung: Einheit muss sich innerhalb des Rechtecks 'Angstzone_Flug_Sued_3' befinden
if ( not ( RectContainsUnit(gg_rct_Angstzone_Flug_Sued_3, GetEnteringUnit()) == true ) ) then
return false
endif
return true
endfunction
function Trig_Angstzone_Flug_Actions takes nothing returns nothing
local unit c
local location tempPoint0
local location tempPoint1
local location tempPoint2
local location tempPoint3
local integer randomPointIndex
set udg_UnitLocal = GetEnteringUnit()
set c = udg_UnitLocal
// Temporäre Locations definieren
set tempPoint0 = Location(-8040.00, -1814.00)
set tempPoint1 = Location(-12176.00, -7816.00)
set tempPoint2 = Location(-6740.00, -11722.00)
set tempPoint3 = Location(-14348.00, -426.00)
if ( Trig_Angstzone_Flug_Func013C() ) then
// Wenn die Einheit sich in 'Angstzone_Flug_Sued_3' befindet, greift sie Punkt 0 an
call IssuePointOrderLocBJ(GetEnteringUnit(), "attackground", tempPoint0)
else
// Zufällige Auswahl eines Punktes von tempPoint1 bis tempPoint3
set randomPointIndex = GetRandomInt(1, 3)
if randomPointIndex == 1 then
call IssuePointOrderLocBJ(GetEnteringUnit(), "attackground", tempPoint1)
elseif randomPointIndex == 2 then
call IssuePointOrderLocBJ(GetEnteringUnit(), "attackground", tempPoint2)
else
call IssuePointOrderLocBJ(GetEnteringUnit(), "attackground", tempPoint3)
endif
// Pausiert 15 Sekunden, bevor die Einheit gestoppt wird
call TriggerSleepAction(15.00)
set udg_UnitLocal = c
call IssueImmediateOrderBJ(udg_UnitLocal, "stop")
set udg_UnitLocal = null
endif
call RemoveLocation(tempPoint0)
call RemoveLocation(tempPoint1)
call RemoveLocation(tempPoint2)
call RemoveLocation(tempPoint3)
endfunction
//===========================================================================
function InitTrig_Angstzone_Flug takes nothing returns nothing
set gg_trg_Angstzone_Flug = CreateTrigger()
// Registriert das Trigger-Event, wenn eine Einheit in den spezifischen Bereich eintritt
call TriggerRegisterEnterRectSimple(gg_trg_Angstzone_Flug, gg_rct_Angstzone_Flug_Nord)
call TriggerRegisterEnterRectSimple(gg_trg_Angstzone_Flug, gg_rct_Angstzone_Flug_West)
call TriggerRegisterEnterRectSimple(gg_trg_Angstzone_Flug, gg_rct_Angstzone_Flug_Ost)
call TriggerRegisterEnterRectSimple(gg_trg_Angstzone_Flug, gg_rct_Angstzone_Flug_Sued)
call TriggerRegisterEnterRectSimple(gg_trg_Angstzone_Flug, gg_rct_Angstzone_Flug_Sued_2)
call TriggerRegisterEnterRectSimple(gg_trg_Angstzone_Flug, gg_rct_Angstzone_Flug_Sued_3)
// Bedingungen und Aktionen hinzufügen
call TriggerAddCondition(gg_trg_Angstzone_Flug, Condition(function Trig_Angstzone_Flug_Conditions))
call TriggerAddAction(gg_trg_Angstzone_Flug, function Trig_Angstzone_Flug_Actions)
endfunction
// GUI-Friendly Damage Detection -- v1.2.1 -- by Weep
// http:// www.thehelper.net/forums/showthread.php?t=137957
//
// Requires: only this trigger and its variables.
//
// -- What? --
// This snippet provides a leak-free, GUI-friendly implementation of an "any unit takes
// damage" event. It requires no JASS knowledge to use.
//
// It uses the Game - Value Of Real Variable event as its method of activating other
// triggers, and passes the event responses through a few globals.
//
// -- Why? --
// The traditional GUI method of setting up a trigger than runs when any unit is damaged
// leaks trigger events. This snippet is easy to implement and removes the need to do
// you own GUI damage detection setup.
//
// -- How To Implement --
// 0. Before you copy triggers that use GDD into a new map, you need to copy over GDD
// with its GDD Variable Creator trigger, or there will be a problem: the variables
// won't be automatically created correctly.
//
// 1. Be sure "Automatically create unknown variables while pasting trigger data" is
// enabled in the World Editor general preferences.
// 2. Copy this trigger category ("GDD") and paste it into your map.
// (Alternately: create the variables listed in the globals block below, create a
// trigger named "GUI Friendly Damage Detection", and paste in this entire text.)
// 3. Create your damage triggers using Game - Value Of Real Variable as the event,
// select GDD_Event as the variable, and leave the rest of the settings to the default
// "becomes Equal to 0.00".
// The event responses are the following variables:
// GDD_Damage is the amount of damage, replacing Event Response - Damage Taken.
// GDD_DamagedUnit is the damaged unit, replacing Event Response - Triggering Unit.
// Triggering Unit can still be used, if you need to use waits.
// Read the -- Notes -- section below for more info.
// GDD_DamageSource is the damaging unit, replacing Event Response - Damage Source.
//
// -- Notes --
// GDD's event response variables are not wait-safe; you can't use them after a wait in
// a trigger. If you need to use waits, Triggering Unit (a.k.a. GetTriggerUnit()) can
// be used in place of GDD_DamageSource. There is no usable wait-safe equivalent to
// Event Damage or Damage Source; you'll need to save the values yourself.
//
// Don't write any values to the variables used as the event responses, or it will mess
// up any other triggers using this snippet for their triggering. Only use their values.
//
// This uses arrays, so can detect damage for a maximum of 8190 units at a time, and
// cleans up data at a rate of 33.33 per second, by default. This should be enough for
// most maps, but if you want to change the rate, change the value returned in the
// GDD_RecycleRate function at the top of the code, below.
//
// By default, GDD will not register units that have Locust at the moment of their
// entering the game, and will not recognize when they take damage (which can only
// happen if the Locust ability is later removed from the unit.) To allow a unit to have
// Locust yet still cause GDD damage events if Locust is removed, you can either design
// the unit to not have Locust by default and add it via triggers after creation, or
// edit the GDD_Filter function at the top of the code, below.
//
// -- Credits --
// Captain Griffin on wc3c.net for the research and concept of GroupRefresh.
//
// Credit in your map not needed, but please include this README.
//
// -- Version History --
// 1.2.1: Minor code cleaning. Added configuration functions. Updated documentation.
// 1.2.0: Made this snippet work properly with recursive damage.
// 1.1.1: Added a check in order to not index units with the Locust ability (dummy units).
// If you wish to check for damage taken by a unit that is unselectable, do not
// give the unit-type Locust in the object editor; instead, add the Locust ability
// 'Aloc' via a trigger after its creation, then remove it.
// 1.1.0: Added a check in case a unit gets moved out of the map and back.
// 1.0.0: First release.
//===================================================================
// Configurables.
function GDD_RecycleRate takes nothing returns real //The rate at which the system checks units to see if they've been removed from the game
return 0.03
endfunction
function GDD_Filter takes unit u returns boolean //The condition a unit has to pass to have it registered for damage detection
return GetUnitAbilityLevel(u, 'Aloc') == 0 //By default, the system ignores Locust units, because they normally can't take damage anyway
endfunction
//===================================================================
// This is just for reference.
// If you use JassHelper, you could uncomment this section instead of creating the variables in the trigger editor.
// globals
// real udg_GDD_Event = 0.
// real udg_GDD_Damage = 0.
// unit udg_GDD_DamagedUnit
// unit udg_GDD_DamageSource
// trigger array udg_GDD__TriggerArray
// integer array udg_GDD__Integers
// unit array udg_GDD__UnitArray
// group udg_GDD__LeftMapGroup = CreateGroup()
// endglobals
//===================================================================
// System code follows. Don't touch!
function GDD_Event takes nothing returns boolean
local unit damagedcache = udg_GDD_DamagedUnit
local unit damagingcache = udg_GDD_DamageSource
local real damagecache = udg_GDD_Damage
set udg_GDD_DamagedUnit = GetTriggerUnit()
set udg_GDD_DamageSource = GetEventDamageSource()
set udg_GDD_Damage = GetEventDamage()
set udg_GDD_Event = 1.
set udg_GDD_Event = 0.
set udg_GDD_DamagedUnit = damagedcache
set udg_GDD_DamageSource = damagingcache
set udg_GDD_Damage = damagecache
set damagedcache = null
set damagingcache = null
return false
endfunction
function GDD_AddDetection takes nothing returns boolean
// if(udg_GDD__Integers[0] > 8190) then
// call BJDebugMsg("GDD: Too many damage events! Decrease number of units present in the map or increase recycle rate.")
// ***Recycle rate is specified in the GDD_RecycleRate function at the top of the code. Smaller is faster.***
// return
// endif
if(IsUnitInGroup(GetFilterUnit(), udg_GDD__LeftMapGroup)) then
call GroupRemoveUnit(udg_GDD__LeftMapGroup, GetFilterUnit())
elseif(GDD_Filter(GetFilterUnit())) then
set udg_GDD__Integers[0] = udg_GDD__Integers[0]+1
set udg_GDD__UnitArray[udg_GDD__Integers[0]] = GetFilterUnit()
set udg_GDD__TriggerArray[udg_GDD__Integers[0]] = CreateTrigger()
call TriggerRegisterUnitEvent(udg_GDD__TriggerArray[udg_GDD__Integers[0]], udg_GDD__UnitArray[udg_GDD__Integers[0]], EVENT_UNIT_DAMAGED)
call TriggerAddCondition(udg_GDD__TriggerArray[udg_GDD__Integers[0]], Condition(function GDD_Event))
endif
return false
endfunction
function GDD_PreplacedDetection takes nothing returns nothing
local group g = CreateGroup()
local integer i = 0
loop
call GroupEnumUnitsOfPlayer(g, Player(i), Condition(function GDD_AddDetection))
set i = i+1
exitwhen i == bj_MAX_PLAYER_SLOTS
endloop
call DestroyGroup(g)
set g = null
endfunction
function GDD_GroupRefresh takes nothing returns nothing
// Based on GroupRefresh by Captain Griffen on wc3c.net
if (bj_slotControlUsed[5063] == true) then
call GroupClear(udg_GDD__LeftMapGroup)
set bj_slotControlUsed[5063] = false
endif
call GroupAddUnit(udg_GDD__LeftMapGroup, GetEnumUnit())
endfunction
function GDD_Recycle takes nothing returns nothing
if(udg_GDD__Integers[0] <= 0) then
return
elseif(udg_GDD__Integers[1] <= 0) then
set udg_GDD__Integers[1] = udg_GDD__Integers[0]
endif
if(GetUnitTypeId(udg_GDD__UnitArray[udg_GDD__Integers[1]]) == 0) then
call DestroyTrigger(udg_GDD__TriggerArray[udg_GDD__Integers[1]])
set udg_GDD__TriggerArray[udg_GDD__Integers[1]] = null
set udg_GDD__TriggerArray[udg_GDD__Integers[1]] = udg_GDD__TriggerArray[udg_GDD__Integers[0]]
set udg_GDD__UnitArray[udg_GDD__Integers[1]] = udg_GDD__UnitArray[udg_GDD__Integers[0]]
set udg_GDD__UnitArray[udg_GDD__Integers[0]] = null
set udg_GDD__Integers[0] = udg_GDD__Integers[0]-1
endif
set udg_GDD__Integers[1] = udg_GDD__Integers[1]-1
endfunction
function GDD_LeaveMap takes nothing returns boolean
local boolean cached = bj_slotControlUsed[5063]
if(udg_GDD__Integers[2] < 64) then
set udg_GDD__Integers[2] = udg_GDD__Integers[2]+1
else
set bj_slotControlUsed[5063] = true
call ForGroup(udg_GDD__LeftMapGroup, function GDD_GroupRefresh)
set udg_GDD__Integers[2] = 0
endif
call GroupAddUnit(udg_GDD__LeftMapGroup, GetFilterUnit())
set bj_slotControlUsed[5063] = cached
return false
endfunction
// ===========================================================================
function InitTrig_GUI_Friendly_Damage_Detection takes nothing returns nothing
local region r = CreateRegion()
call RegionAddRect(r, GetWorldBounds())
call TriggerRegisterEnterRegion(CreateTrigger(), r, Condition(function GDD_AddDetection))
call TriggerRegisterLeaveRegion(CreateTrigger(), r, Condition(function GDD_LeaveMap))
call GDD_PreplacedDetection()
call TimerStart(CreateTimer(), GDD_RecycleRate(), true, function GDD_Recycle)
set r = null
endfunction
function IsDragonVulnerable takes nothing returns boolean
return (BlzIsUnitInvulnerable(gg_unit_Otch_0318) == false)
endfunction
//=====================================================
// =============== TAGESPOOL INITIALISIEREN UND MISCHEN
//=====================================================
function InitDayBag takes nothing returns nothing
local integer i = 1
// Starte mit vollem Beutel (1..24)
set udg_DayBagCount = udg_CalendarMaxDays // = 24
loop
exitwhen i > udg_CalendarMaxDays
set udg_DayBag[i] = i
set i = i + 1
endloop
// Optional: Falls du nicht am Cycle-Übergang
// denselben Tag erneut willst, setze udg_LastDayUsed = 0
set udg_LastDayUsed = 0
endfunction
function PullRandomDayFromBag takes nothing returns integer
local integer rndIndex
local integer day
local integer lastIndex
// Ist der Beutel leer? -> Neu füllen
if udg_DayBagCount <= 0 then
call InitDayBag()
endif
// Wir wählen einen zufälligen Index im Bereich [1..udg_DayBagCount]
set rndIndex = GetRandomInt(1, udg_DayBagCount)
// Den Tag holen
set day = udg_DayBag[rndIndex]
// OPTIONAL: Falls du wirklich verhindern willst,
// dass der selbe Tag wie "udg_LastDayUsed" gleich kommt,
// kannst du eine Schleife bauen:
if (udg_DayBagCount > 1) then
// Nur wenn es mehr als 1 Tag im Beutel gibt,
// kann man neu ziehen
loop
exitwhen day != udg_LastDayUsed
// Tag war der gleiche wie letztes Mal => neu ziehen
set rndIndex = GetRandomInt(1, udg_DayBagCount)
set day = udg_DayBag[rndIndex]
endloop
endif
// Letzten Eintrag aus dem Beutel nach vorne kopieren
set lastIndex = udg_DayBag[udg_DayBagCount]
set udg_DayBag[rndIndex] = lastIndex
// Einen Platz abziehen
set udg_DayBagCount = udg_DayBagCount - 1
// Letzter Tag gemerkt (verhindert Doppel am Übergang)
set udg_LastDayUsed = day
return day
endfunction
//=====================================================
// =============== TÄGLICHEN KALENDERTAG ANWENDEN
//=====================================================
function ApplyRandomCalendarDay takes nothing returns nothing
local integer day = PullRandomDayFromBag()
local string dayName = LoadStr(CalendarHash, day, 1)
local string dayIcon = LoadStr(CalendarHash, day, 2)
local integer researchCount = LoadInteger(CalendarHash, day, 3)
local integer i = 0
local integer childKey
local integer techId
local integer playerId
local integer rand1 = GetRandomInt(1, 7) // Erster zufälliger Punkt
local integer rand2 = GetRandomInt(1, 7) // Zweiter zufälliger Punkt
local real x1
local real y1
local real x2
local real y2
// Tooltip, Bildschirmtext, Icon
call BlzSetAbilityTooltip('A041', dayName, 0)
call DisplayTextToForce(GetPlayersAll(), dayName)
call BlzSetAbilityIcon('A041', dayIcon)
// Techs aktivieren
loop
exitwhen i >= researchCount
set childKey = 10 + (i * 2)
set techId = LoadInteger(CalendarHash, day, childKey)
set playerId = LoadInteger(CalendarHash, day, childKey + 1)
call SetPlayerTechResearchedSwap(techId, 1, Player(playerId))
set i = i + 1
endloop
// Spezialfall: "Day of the Flight Horrors" & "Day of the Swamp Monsters"
if day == 17 or day == 18 then
// Falls beide Punkte identisch sind, neu ziehen
loop
exitwhen rand1 != rand2
set rand2 = GetRandomInt(1, 7)
set x2 = LoadReal(CalendarHash, 18, 18 + (rand2 * 2))
set y2 = LoadReal(CalendarHash, 18, 19 + (rand2 * 2))
endloop
// Unterschiedliche Koordinaten je nach Tag
if day == 17 then
// Flight Horrors: Erste Koordinate fest, zweite zufällig aus Swamp-Monster-Liste
set x1 = LoadReal(CalendarHash, 17, 20)
set y1 = LoadReal(CalendarHash, 17, 21)
else
// Swamp Monsters: Beide zufällig aus der Liste
set x1 = LoadReal(CalendarHash, 18, 18 + (rand1 * 2))
set y1 = LoadReal(CalendarHash, 18, 19 + (rand1 * 2))
endif
// Erstes Monster erschaffen
set udg_TempPoint = Location(x1, y1)
if day == 17 then
call CreateUnit(Player(8), 'n00R', x1, y1, bj_UNIT_FACING) // Flight Horrors
else
call CreateUnit(Player(24), 'ndrj', x1, y1, bj_UNIT_FACING) // Swamp Monsters
endif
call RemoveLocation(udg_TempPoint)
// Zweites Monster erschaffen
set udg_TempPoint = Location(x2, y2)
if day == 17 then
call CreateUnit(Player(8), 'n00R', x2, y2, bj_UNIT_FACING) // Flight Horrors
else
call CreateUnit(Player(24), 'ndrj', x2, y2, bj_UNIT_FACING) // Swamp Monsters
endif
call RemoveLocation(udg_TempPoint)
endif
// Spezialfall "Day of the Dragons"
if day == 24 then
call UnitAddAbilityBJ('AX87', gg_unit_Otch_0318)
// Koordinatenwahl (Zufall)
if (GetRandomInt(1, 2) == 1) then
set udg_TempPoint = Location(13000., 3500.)
else
set udg_TempPoint = Location(12000., -8000.)
endif
call IssuePointOrderLocBJ(gg_unit_Otch_0318, "patrol", udg_TempPoint)
call RemoveLocation(udg_TempPoint)
endif
endfunction
//=====================================================
// =============== "KALENDER"-AKTION
//=====================================================
function Trig_Kalender_Actions takes nothing returns nothing
// Entferne Drachenfähigkeit
call UnitRemoveAbilityBJ('AX87', gg_unit_Otch_0318)
call UnitRemoveBuffBJ('B021', gg_unit_Otch_0318)
// Ist Drache verwundbar?
if IsDragonVulnerable() then
call TriggerExecute(gg_trg_Landdrache3)
else
set udg_TempPoint = Location(-7000., -5000.)
call IssuePointOrderLocBJ(gg_unit_Otch_0318, "patrol", udg_TempPoint)
call RemoveLocation(udg_TempPoint)
endif
// Tech-Reset
call ResetAllTechs()
// KalenderTag hochzählen
set udg_KalenderTag = udg_KalenderTag + 1
call QuestMessageBJ(GetPlayersAll(), bj_QUESTMESSAGE_ITEMACQUIRED, "Day " + I2S(udg_KalenderTag))
// => Neuer zufälliger Tag aus dem BAG
call ApplyRandomCalendarDay()
endfunction
//=====================================================
// =============== INIT KALENDER-TRIGGER
//=====================================================
function InitTrig_Kalender takes nothing returns nothing
// Trigger erstellen
set gg_trg_Kalender = CreateTrigger()
call DisableTrigger(gg_trg_Kalender)
// Auslösung um 6.50 Uhr
call TriggerRegisterGameStateEventTimeOfDay(gg_trg_Kalender, EQUAL, 6.50)
call TriggerAddAction(gg_trg_Kalender, function Trig_Kalender_Actions)
call InitDayBag() // Beutel erstmalig füllen
endfunction
function Trig_Nachtmonsterspawn_Actions takes nothing returns nothing
local integer spawnIndex = GetRandomInt(0, 24)
local integer monsterLevel = GetRandomInt(1, 5)
call SetUnitAbilityLevelSwapped('AX09', gg_unit_n008_0597, monsterLevel)
call IssuePointOrderLocBJ(gg_unit_n008_0597, "summonfactory", udg_PointNachtmonster[spawnIndex])
endfunction
//===========================================================================
function InitTrig_Nachtmonsterspawn takes nothing returns nothing
local integer i = 0
set gg_trg_Nachtmonsterspawn = CreateTrigger()
call TriggerRegisterGameStateEventTimeOfDay(gg_trg_Nachtmonsterspawn, EQUAL, 20.10)
call TriggerRegisterGameStateEventTimeOfDay(gg_trg_Nachtmonsterspawn, EQUAL, 20.20)
call TriggerRegisterGameStateEventTimeOfDay(gg_trg_Nachtmonsterspawn, EQUAL, 20.30)
call TriggerRegisterGameStateEventTimeOfDay(gg_trg_Nachtmonsterspawn, EQUAL, 20.40)
call TriggerRegisterGameStateEventTimeOfDay(gg_trg_Nachtmonsterspawn, EQUAL, 20.50)
call TriggerRegisterGameStateEventTimeOfDay(gg_trg_Nachtmonsterspawn, EQUAL, 21.00)
call TriggerRegisterGameStateEventTimeOfDay(gg_trg_Nachtmonsterspawn, EQUAL, 21.10)
call TriggerRegisterGameStateEventTimeOfDay(gg_trg_Nachtmonsterspawn, EQUAL, 21.20)
call TriggerRegisterGameStateEventTimeOfDay(gg_trg_Nachtmonsterspawn, EQUAL, 21.30)
call TriggerRegisterGameStateEventTimeOfDay(gg_trg_Nachtmonsterspawn, EQUAL, 21.40)
call TriggerRegisterGameStateEventTimeOfDay(gg_trg_Nachtmonsterspawn, EQUAL, 21.50)
call TriggerRegisterGameStateEventTimeOfDay(gg_trg_Nachtmonsterspawn, EQUAL, 22.00)
call TriggerAddAction(gg_trg_Nachtmonsterspawn, function Trig_Nachtmonsterspawn_Actions)
endfunction
function Trig_Nachtmonsterlauf_Conditions takes nothing returns boolean
local integer unitId = GetUnitTypeId(GetTriggerUnit())
return (unitId == 'nzom' or unitId == 'nhdc' or unitId == 'nwld' or unitId == 'uC28' or unitId == 'nsog')
endfunction
function Trig_Nachtmonsterlauf_Actions takes nothing returns nothing
local unit u = GetTriggerUnit()
local integer spawnIndex = GetRandomInt(0, 24)
if GetRandomInt(1, 2) == 1 then
call IssuePointOrder(u, "patrol", GetLocationX(udg_PointNachtmonster[spawnIndex]), GetLocationY(udg_PointNachtmonster[spawnIndex]))
else
call UnitAddAbility(u, 'Awan')
endif
set u = null
endfunction
//===========================================================================
function InitTrig_Nachtmonsterlauf takes nothing returns nothing
set gg_trg_Nachtmonsterlauf = CreateTrigger()
call TriggerRegisterEnterRectSimple(gg_trg_Nachtmonsterlauf, GetPlayableMapRect())
call TriggerAddCondition(gg_trg_Nachtmonsterlauf, Condition(function Trig_Nachtmonsterlauf_Conditions))
call TriggerAddAction(gg_trg_Nachtmonsterlauf, function Trig_Nachtmonsterlauf_Actions)
endfunction
function Trig_Spawn_Tod_Conditions takes nothing returns boolean
local unit killingUnit = GetKillingUnitBJ()
local integer unitId = GetUnitTypeId(GetTriggerUnit())
if killingUnit == null then
return false
endif
if (not IsUnitType(killingUnit, UNIT_TYPE_GROUND)) and (not IsUnitType(killingUnit, UNIT_TYPE_FLYING)) then
if unitId == 'nC33' or unitId == 'nspg' or unitId == 'nwlt' or unitId == 'nspb' or unitId == 'ngdk' or unitId == 'ogrk' or unitId == 'ohun' or unitId == 'nzom' or unitId == 'nwld' or unitId == 'uC28' or unitId == 'nhdc' or unitId == 'nsog' or unitId == 'nsno' or unitId == 'ndwm' or unitId == 'ngsp' or unitId == 'n00E' or unitId == 'nanb' or unitId == 'nanw' or unitId == 'hhes' or unitId == 'njks' then
return true
endif
endif
return false
endfunction
function Trig_Spawn_Tod_Actions takes nothing returns nothing
local unit u = GetTriggerUnit()
local real x
local real y
local effect e
if u == null then
return
endif
set x = GetUnitX(u)
set y = GetUnitY(u)
// Spezialeffekt für jede Einheit separat erzeugen
set e = AddSpecialEffect("Objects\\Spawnmodels\\Undead\\ImpaleTargetDust\\ImpaleTargetDust.mdl", x, y)
call DestroyEffect(e) // Effekt wird abgespielt & dann automatisch entfernt
// Einheit sofort entfernen
call RemoveUnit(u)
// Speicherbereinigung
set u = null
set e = null
endfunction
//===========================================================================
function InitTrig_Spawn_Tod takes nothing returns nothing
set gg_trg_Spawn_Tod = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Spawn_Tod, EVENT_PLAYER_UNIT_DEATH )
call TriggerAddCondition( gg_trg_Spawn_Tod, Condition( function Trig_Spawn_Tod_Conditions ) )
call TriggerAddAction( gg_trg_Spawn_Tod, function Trig_Spawn_Tod_Actions )
endfunction
function Trig_Schattenwald_Conditions takes nothing returns boolean
// Prüft, ob das auslösende Objekt ein Hero ist und von einem Benutzer-Kontrollierten Spieler kommt
if GetPlayerController(GetOwningPlayer(GetTriggerUnit())) != MAP_CONTROL_USER then
return false
endif
if not IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) then
return false
endif
return true
endfunction
function Waldzyklus takes nothing returns boolean
// True, wenn Tageszeit zwischen 6.00 und 18.00
local real t = GetTimeOfDay()
return (t >= 6.00 and t <= 18.00)
endfunction
function Waldwachstum takes nothing returns nothing
local destructable d = GetEnumDestructable()
// Zerstörbares Objekt "heilen"/wiederherstellen und anzeigen
call DestructableRestoreLife(d, 9000.00, false)
call ShowDestructable(d, true)
endfunction
function Waldsterben takes nothing returns nothing
local destructable d = GetEnumDestructable()
// Zerstörbares Objekt verstecken, töten und schnelle Sterbe-Animation abspielen
call ShowDestructable(d, false)
call KillDestructable(d)
call SetDestructableAnimationSpeed(d, 20.00) // entspricht 2000%
endfunction
function Trig_Schattenwald_Actions takes nothing returns nothing
local unit trigUnit = GetTriggerUnit()
local real x1 = GetUnitX(trigUnit)
local real y1 = GetUnitY(trigUnit)
local real angle = GetRandomReal(0., 360.)
local real distance = 850.
local real x2 = x1 + distance * Cos(angle * bj_DEGTORAD)
local real y2 = y1 + distance * Sin(angle * bj_DEGTORAD)
local boolean isDay = Waldzyklus()
local integer destructionChance
// Fähigkeit 'AX27' des Summon-Dummy (gg_unit_n01L_0269) auf Zufallslevel (1-10) setzen
call SetUnitAbilityLevelSwapped('AX27', gg_unit_n01L_0269, GetRandomInt(1, 10))
// Summon-Befehl an (x2, y2)
call IssuePointOrder(gg_unit_n01L_0269, "summonfactory", x2, y2)
// Rechteck gg_rct_Waldpick an die neuen Koordinaten verschieben
call MoveRectTo(gg_rct_Waldpick, x2, y2)
// Beispiel-Zerstörbares wiederherstellen + anzeigen
call DestructableRestoreLife(gg_dest_YT42_4212, 9000.00, false)
call ShowDestructable(gg_dest_YT42_4212, true)
// Tagsüber: Zerstörungswahrscheinlichkeit 63% (=> Vergleich >= 38)
// Nachts: Zerstörungswahrscheinlichkeit 56% (=> Vergleich >= 45)
if isDay then
set destructionChance = 38
else
set destructionChance = 45
endif
// Zufallsabfrage: ab destructionChance → Bäume zerstören, sonst wachsen lassen
if GetRandomInt(1, 100) >= destructionChance then
// Alle Zerstörbaren in gg_rct_Waldpick -> Waldsterben
call EnumDestructablesInRectAll(gg_rct_Waldpick, function Waldsterben)
// Spezielle Zerstörbare auf 100% Geschwindigkeit zurücksetzen, wieder anzeigen
call SetDestructableAnimationSpeed(gg_dest_LTt0_5919, 1.00)
call SetDestructableAnimationSpeed(gg_dest_LTt0_6053, 1.00)
call SetDestructableAnimationSpeed(gg_dest_ATt1_9249, 1.00)
call ShowDestructable(gg_dest_LTt0_5919, true)
call ShowDestructable(gg_dest_LTt0_6053, true)
call ShowDestructable(gg_dest_ATt1_9249, true)
else
// Alle Zerstörbaren in gg_rct_Waldpick -> Waldwachstum
call EnumDestructablesInRectAll(gg_rct_Waldpick, function Waldwachstum)
endif
// Aufräumen lokaler Variablen
set trigUnit = null
endfunction
//===========================================================================
function InitTrig_Schattenwald takes nothing returns nothing
local group dummyGroup = GetUnitsOfTypeIdAll('ncco') // Alle 'ncco'-Dummys
local unit dummy
// Neuen Trigger erstellen
set gg_trg_Schattenwald = CreateTrigger()
// Bedingung & Aktionen hinzufügen
call TriggerAddCondition(gg_trg_Schattenwald, Condition(function Trig_Schattenwald_Conditions))
call TriggerAddAction(gg_trg_Schattenwald, function Trig_Schattenwald_Actions)
// Trigger registrieren für jede Dummy-Einheit vom Typ 'ncco'
loop
set dummy = FirstOfGroup(dummyGroup)
exitwhen dummy == null
// Wenn ein Held dem Dummy auf 350 Reichweite nahekommt, löst er diesen Trigger aus
call TriggerRegisterUnitInRange(gg_trg_Schattenwald, dummy, 350.00, null)
call GroupRemoveUnit(dummyGroup, dummy)
endloop
// Gruppe löschen
call DestroyGroup(dummyGroup)
set dummyGroup = null
endfunction
// Überprüfung der Bedingung für NPC-Fähigkeiten mit dynamischer Chance
function Trig_NPCFahigkeiten_Conditions takes nothing returns boolean
local integer unitTypeId = GetUnitTypeId(udg_GDD_DamagedUnit)
local integer unitTypeIdSource = GetUnitTypeId(udg_GDD_DamageSource)
local player playerSource = GetOwningPlayer(udg_GDD_DamageSource)
local player playerTarget = GetOwningPlayer(udg_GDD_DamagedUnit)
// Überprüfung auf verbündete Spieler steurt friendly fiere aus
if IsPlayerAlly(playerSource, playerTarget) then
return false
endif
// Überprüfung der Einheitstypen
if unitTypeId == 'nchr' or unitTypeId == 'Udea' or unitTypeId == 'ownr' or unitTypeIdSource == 'nchr' or unitTypeIdSource == 'Udea' or unitTypeIdSource == 'ownr' then
return true // Immer 100% Chance für 'nchr' und 'Udea'
endif
// Chanceüberprüfung (30% Chance für alle anderen Einheiten)
if GetRandomInt(1, 100) > 30 then
return false
endif
// Überprüfung der Einheitstypen
return unitTypeId == 'ncer' or unitTypeId == 'ncen' or unitTypeId == 'nzom' or unitTypeId == 'nwld' or unitTypeId == 'nsog' or unitTypeId == 'hfoo' or unitTypeId == 'hhes' or unitTypeId == 'hcth' or unitTypeId == 'njks' or unitTypeId == 'ogru' or unitTypeId == 'orai' or unitTypeId == 'nbel' or unitTypeId == 'hC19' or unitTypeId == 'h004' or unitTypeId == 'nkob' or unitTypeId == 'nkog' or unitTypeIdSource == 'ownr' or unitTypeId == 'ownr' or unitTypeId == 'ogrk' or unitTypeId == 'uC28' or unitTypeId == 'ohun' or unitTypeId == 'nchg' or unitTypeId == 'ngdk' or unitTypeId == 'uskm' or unitTypeId == 'ndrj' or unitTypeId == 'nsqe' or unitTypeId == 'nbbc' or unitTypeId == 'nchr' or unitTypeIdSource == 'nchr' or unitTypeId == 'Udea'
endfunction
// Funktion zur Überprüfung der Entfernung für Behemoth
function BehemothRange takes nothing returns boolean
local real distance = DistanceBetweenPoints(udg_TempPointNPC[0], udg_TempPointNPC[1])
return distance >= 700.00
endfunction
// Funktion zur Bewegung und Fähigkeitenausführung
function HumanoidAbilities takes unit c, unit d returns nothing
local location tempPointNPC0 = GetUnitLoc(c)
local location tempPointNPC2 = PolarProjectionBJ(tempPointNPC0, 250.00, GetUnitFacing(c))
if GetRandomInt(1, 2) == 1 then
call UnitAddAbilityBJ('ACev', c)
call IssuePointOrderLocBJ(c, "move", PolarProjectionBJ(tempPointNPC2, 80.00, GetUnitFacing(c)))
endif
call TriggerSleepAction(2.00)
call UnitRemoveAbilityBJ('ACev', c)
call IssueTargetOrderBJ(c, "firebolt", d)
call IssueTargetOrderBJ(c, "cripple", d)
call RemoveLocation(tempPointNPC0)
call RemoveLocation(tempPointNPC2)
endfunction
// Funktion zur Behemoth-Fähigkeitenausführung
function BehemothAbilities takes unit c, unit d, integer unitTypeIdSource returns nothing
local location tempPointNPC0 = GetUnitLoc(c)
local location tempPointNPC1 = GetUnitLoc(d)
call UnitRemoveAbilityBJ('Awan', c)
call IssuePointOrderLocBJ(c, "far", tempPointNPC0)
if unitTypeIdSource == 'ownr' then
call IssuePointOrderLocBJ(d, "far", tempPointNPC0)
endif
call IssueImmediateOrderBJ(c, "creepthunderclap")
call TriggerSleepAction(3.00)
call RemoveLocation(tempPointNPC0)
call RemoveLocation(tempPointNPC1)
if BehemothRange() then
call UnitAddAbilityBJ('Awan', c)
endif
endfunction
// Funktion zur Verarbeitung von Fähigkeiten
function HandleUnitAbility takes unit c, unit d, integer unitTypeId, integer unitTypeIdSource returns nothing
if unitTypeId == 'nkog' and GetRandomInt(1, 6) == 1 then
call IssueTargetOrderBJ(c, "soulburn", d)
elseif unitTypeId == 'ohun' then
call IssueTargetOrderBJ(c, "shadowstrike", d)
elseif unitTypeId == 'nbbc' then
if GetRandomInt(1, 3) == 1 then
call IssueImmediateOrderBJ(c, "battleroar")
call IssueTargetOrderBJ(c, "drunkenhaze", d)
else
call IssuePointOrderLocBJ(c, "carrionswarm", GetUnitLoc(d))
endif
elseif unitTypeId == 'uskm' then
if GetRandomInt(1, 2) == 1 then
call IssueTargetOrderBJ(c, "parasite", d)
else
call IssuePointOrderLocBJ(c, "blizzard", GetUnitLoc(d))
endif
elseif unitTypeId == 'ndrj' then
if BlzGetUnitAbilityCooldownRemaining(c, 'ACcb') < 0.01 or BlzGetUnitAbilityCooldownRemaining(d, 'ACcb') < 0.01 then
call UnitAddAbilityBJ('Abun', c)
call UnitAddAbilityBJ('Abun', d)
call IssueTargetOrderBJ(d, "thunderbolt", c)
call IssueTargetOrderBJ(c, "thunderbolt", d)
endif
elseif unitTypeId == 'ncer' or unitTypeId == 'ncen' then
call IssueTargetOrderBJ(c, "attack", d)
elseif unitTypeId == 'nzom' or unitTypeId == 'nwld' or unitTypeId == 'nsog' or unitTypeId == 'uC28' then
call UnitRemoveAbilityBJ('Awan', c)
call IssueTargetOrderBJ(c, "cripple", d)
elseif unitTypeId == 'hhes' or unitTypeId == 'hfoo' or unitTypeId == 'hcth' or unitTypeId == 'njks' or unitTypeId == 'nbel' or unitTypeId == 'ogru' or unitTypeId == 'orai' or unitTypeId == 'hC19' or unitTypeId == 'h004' or unitTypeId == 'nkob' or unitTypeId == 'ogrk' or unitTypeId == 'nchg' or unitTypeId == 'ngdk' or unitTypeId == 'nbbc' then
call HumanoidAbilities(c, d)
elseif unitTypeId == 'nsqe' or unitTypeId == 'ownr' or unitTypeIdSource == 'ownr' then
call BehemothAbilities(c, d, unitTypeIdSource)
endif
endfunction
// Hauptaktionsfunktion
function Trig_NPCFahigkeiten_Actions takes nothing returns nothing
local unit c = udg_GDD_DamagedUnit
local unit d = udg_GDD_DamageSource
local location tempPointNPC0 = GetUnitLoc(c)
local location tempPointNPC1 = GetUnitLoc(d)
local location tempPointNPC2 = PolarProjectionBJ(tempPointNPC1, 800.00, GetUnitFacing(d))
local integer unitTypeId = GetUnitTypeId(c)
local integer unitTypeIdSource = GetUnitTypeId(d)
call HandleUnitAbility(c, d, unitTypeId, unitTypeIdSource)
if unitTypeId == 'nchr' then
set d = udg_GDD_DamagedUnit
elseif unitTypeIdSource == 'nchr' then
set d = udg_GDD_DamageSource
endif
if unitTypeIdSource == 'nchr' or unitTypeId == 'Udea' then
set tempPointNPC1 = GetUnitLoc(d)
set unitTypeIdSource = GetUnitTypeId(d)
call IssuePointOrderLocBJ(d, "flare", tempPointNPC2)
call RemoveLocation(tempPointNPC2)
endif
call RemoveLocation(tempPointNPC0)
call RemoveLocation(tempPointNPC1)
endfunction
// Registrierung des Triggers
function RegisterNPCFahigkeitenTrigger takes nothing returns nothing
call TriggerRegisterVariableEvent(gg_trg_NPCFahigkeiten, "udg_GDD_Event", GREATER_THAN, 0)
call TriggerAddCondition(gg_trg_NPCFahigkeiten, Condition(function Trig_NPCFahigkeiten_Conditions))
call TriggerAddAction(gg_trg_NPCFahigkeiten, function Trig_NPCFahigkeiten_Actions)
endfunction
// Initialisierung des Triggers
function InitTrig_NPCFahigkeiten takes nothing returns nothing
set gg_trg_NPCFahigkeiten = CreateTrigger()
call RegisterNPCFahigkeitenTrigger()
call DisableTrigger( gg_trg_NPCFahigkeiten )
endfunction
function Trig_KickAbility_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'AX89'
endfunction
function Trig_KickAbility_Actions takes nothing returns nothing
local unit caster
local unit target
local real casterX
local real casterY
local real targetX
local real targetY
local real angle
local real kickDistance
local real stepDistance
local real currentX
local real currentY
local real stepX
local real stepY
local boolean pathable
local integer steps
local integer i
set caster = GetTriggerUnit()
set target = GetSpellTargetUnit()
if target == null then
return
endif
set casterX = GetUnitX(caster)
set casterY = GetUnitY(caster)
set targetX = GetUnitX(target)
set targetY = GetUnitY(target)
// Calculate the angle from the caster to the target
set angle = Atan2(targetY - casterY, targetX - casterX)
// Play slam animation on the target
call SetUnitAnimation(target, "attack slam")
// Kick parameters
set kickDistance = 140.0
set stepDistance = 25.0
set steps = R2I(kickDistance / stepDistance)
set currentX = targetX
set currentY = targetY
set stepX = stepDistance * Cos(angle)
set stepY = stepDistance * Sin(angle)
// Move the target step by step
loop
exitwhen steps <= 0
set currentX = currentX + stepX
set currentY = currentY + stepY
// Check pathability for the current step
set pathable = not IsTerrainPathable(currentX, currentY, PATHING_TYPE_WALKABILITY)
if pathable then
call SetUnitPosition(target, currentX, currentY)
else
// Stop the movement if path is blocked
return
endif
call TriggerSleepAction(0.04) // Smooth movement
set steps = steps - 1
endloop
// Reset target animation to default
call QueueUnitAnimation(target, "stand")
endfunction
function InitTrig_KickAbility takes nothing returns nothing
set gg_trg_KickAbility = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_KickAbility, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(gg_trg_KickAbility, Condition(function Trig_KickAbility_Conditions))
call TriggerAddAction(gg_trg_KickAbility, function Trig_KickAbility_Actions)
endfunction
function Trig_Sumpfmonster_Conditions takes nothing returns boolean
return GetUnitTypeId(GetTriggerUnit()) == 'ndrj'
endfunction
function Trig_Sumpfmonster_CheckProximity takes nothing returns nothing
local timer t = GetExpiredTimer()
local timer newTimer = null
local unit monster = LoadUnitHandle(udg_hashSumpfmonster, GetHandleId(t), 0)
local unit hero = null
local real distance
local integer i
if monster == null then
return
endif
// Überprüfen, ob einer der Helden in der Nähe des Monsters ist
set i = 3
loop
exitwhen i > 5
set hero = udg_ZRPGHero[i]
if hero != null then
set distance = SquareRoot((GetUnitX(monster) - GetUnitX(hero)) * (GetUnitX(monster) - GetUnitX(hero)) + (GetUnitY(monster) - GetUnitY(hero)) * (GetUnitY(monster) - GetUnitY(hero)))
if distance <= 700.00 and GetUnitAbilityLevel(monster, 'Agho') == 0 then
// Ein Held ist in der Nähe, Monster bleibt sichtbar
call UnitRemoveAbilityBJ('Agho', monster) // Unsichtbarkeit entfernen
call UnitRemoveAbilityBJ('Abun', monster) // Angreifen wieder aktivieren
call UnitRemoveAbilityBJ('Awan', monster) // Wandern deaktivieren
// Timer erneut starten
set newTimer = CreateTimer()
call SaveUnitHandle(udg_hashSumpfmonster, GetHandleId(newTimer), 0, monster)
call TimerStart(newTimer, 13.00, false, function Trig_Sumpfmonster_CheckProximity)
set monster = null
set hero = null
return
endif
endif
set i = i + 1
endloop
// Kein Held in der Nähe, Monster wird unsichtbar und der Timer wird deaktiviert
call UnitAddAbilityBJ('Abun', monster) // Angreifen deaktivieren
call IssueImmediateOrder(monster, "phaseshift")
call SetUnitAnimation(monster, "morph") // Animation erzwingen
call UnitAddAbilityBJ('Awan', monster) // Wandern aktivieren nach Unsichtbarkeit
// Timer und Daten entfernen
call FlushChildHashtable(udg_hashSumpfmonster, GetHandleId(t))
call PauseTimer(t)
call DestroyTimer(t)
set monster = null
set hero = null
set newTimer = null
endfunction
function Trig_Sumpfmonster_Actions takes nothing returns nothing
local unit monster = GetTriggerUnit()
local timer monsterTimer = CreateTimer()
if monster == null then
return
endif
// Monster wird sichtbar
call UnitRemoveAbilityBJ('Agho', monster) // Unsichtbarkeit entfernen
call UnitRemoveAbilityBJ('Abun', monster) // Angreifen wieder aktivieren
call UnitRemoveAbilityBJ('Awan', monster) // Wandern deaktivieren
call IssueImmediateOrder(monster, "stomp")
// Timer-Daten speichern
call SaveUnitHandle(udg_hashSumpfmonster, GetHandleId(monsterTimer), 0, monster)
// Timer für regelmäßigen Check starten
call TimerStart(monsterTimer, 13.00, false, function Trig_Sumpfmonster_CheckProximity)
set monster = null
set monsterTimer = null
endfunction
function Sumpfmonsterangriff_Conditions takes nothing returns boolean
if ( not ( GetUnitTypeId(GetTriggerUnit()) == 'ndrj' ) ) then
return false
endif
if ( not ( GetSpellAbilityId() == 'ACcb' ) ) then
return false
endif
return true
endfunction
function Sumpfmonsterangriff takes nothing returns nothing
call UnitAddAbilityBJ( 'Awan', GetTriggerUnit() )
call UnitAddAbilityBJ( 'Abun', GetTriggerUnit() )
call UnitAddAbilityBJ( 'Agho', GetTriggerUnit() )
endfunction
//===========================================================================
function InitTrig_Sumpfmonster takes nothing returns nothing
local trigger trigSpellFinish = CreateTrigger()
set gg_trg_Sumpfmonster = CreateTrigger()
// Registrierung für Sumpfmonster in Reichweite
call TriggerRegisterUnitInRangeSimple(gg_trg_Sumpfmonster, 500.00, gg_unit_HC71_0017)
call TriggerRegisterUnitInRangeSimple(gg_trg_Sumpfmonster, 500.00, gg_unit_OC63_0012)
call TriggerRegisterUnitInRangeSimple(gg_trg_Sumpfmonster, 500.00, gg_unit_H005_0061)
call TriggerAddCondition(gg_trg_Sumpfmonster, Condition(function Trig_Sumpfmonster_Conditions))
call TriggerAddAction(gg_trg_Sumpfmonster, function Trig_Sumpfmonster_Actions)
call TriggerRegisterAnyUnitEventBJ(trigSpellFinish, EVENT_PLAYER_UNIT_SPELL_FINISH)
call TriggerAddCondition(trigSpellFinish, Condition(function Sumpfmonsterangriff_Conditions))
call TriggerAddAction(trigSpellFinish, function Sumpfmonsterangriff)
// Hashtable initialisieren
if udg_hashSumpfmonster == null then
set udg_hashSumpfmonster = InitHashtable()
endif
endfunction
globals
trigger HeroCheckTrigger = null
endglobals
function Trig_Landdrache1_Conditions takes nothing returns boolean
local unit u = GetTriggerUnit()
return u == udg_ZRPGHero[3] or u == udg_ZRPGHero[4] or u == udg_ZRPGHero[5]
endfunction
function Trig_Landdrache_Attack takes nothing returns nothing
local integer i = 3
local unit target = null
local unit randomHero = null
local real minDist = 800.0
local real dist
local real dx
local real dy
local real tx
local real ty
loop
exitwhen i > 5
if udg_ZRPGHero[i] != null and GetUnitState(udg_ZRPGHero[i], UNIT_STATE_LIFE) > 0 then
set dx = GetUnitX(gg_unit_Otch_0318) - GetUnitX(udg_ZRPGHero[i])
set dy = GetUnitY(gg_unit_Otch_0318) - GetUnitY(udg_ZRPGHero[i])
set dist = SquareRoot(dx * dx + dy * dy)
if dist < minDist then
set minDist = dist
set target = udg_ZRPGHero[i]
elseif dist < 1900.0 and randomHero == null then
set randomHero = udg_ZRPGHero[i]
endif
endif
set i = i + 1
endloop
if target == null then
set target = randomHero
endif
call UnitRemoveAbility(gg_unit_Otch_0318, 'Awan')
if target != null then
set tx = GetUnitX(target)
set ty = GetUnitY(target)
call IssueTargetOrder(gg_unit_Otch_0318, "attack", target)
call IssuePointOrder(gg_unit_Otch_0318, "clusterrockets", tx, ty)
call TriggerSleepAction(5.0)
call IssuePointOrder(gg_unit_Otch_0318, "breathoffire", tx, ty)
else
call TriggerExecute(gg_trg_Landdrache3)
endif
endfunction
function LanddracheLandung takes nothing returns nothing
local unit u = GetTriggerUnit()
call UnitRemoveAbility(gg_unit_Otch_0318, 'Awan')
call IssueTargetOrder(gg_unit_Otch_0318, "attack", u)
call SetUnitAnimation(gg_unit_Otch_0318, "walk swim")
call QueueUnitAnimation(gg_unit_Otch_0318, "walk swim")
call PauseUnit(gg_unit_Otch_0318, true)
call UnitAddAbility(gg_unit_Otch_0318, 'Amrf')
call SetUnitFlyHeight(gg_unit_Otch_0318, 120.0, 100.0)
call UnitRemoveAbility(gg_unit_Otch_0318, 'Amrf')
// Aktiviere den regelmäßigen Check nach Landung
call EnableTrigger(HeroCheckTrigger)
endfunction
function HeroDragonDistance takes nothing returns nothing
local integer i = 3
local real heroX
local real heroY
local real unitX = GetUnitX(gg_unit_Otch_0318)
local real unitY = GetUnitY(gg_unit_Otch_0318)
local real distance
local boolean found = false
if IsUnitPaused(gg_unit_Otch_0318) then
call SetUnitInvulnerable(gg_unit_Otch_0318, false)
call PauseUnit(gg_unit_Otch_0318, false)
call DisableTrigger(gg_trg_Landdrache5)
endif
if not BlzIsUnitInvulnerable(gg_unit_Otch_0318) then
call Trig_Landdrache_Attack()
endif
loop
exitwhen i > 5
if udg_ZRPGHero[i] != null then
set heroX = GetUnitX(udg_ZRPGHero[i])
set heroY = GetUnitY(udg_ZRPGHero[i])
set distance = SquareRoot((heroX - unitX)*(heroX - unitX) + (heroY - unitY)*(heroY - unitY))
if distance <= 1900.0 then
set found = true
exitwhen true
endif
endif
set i = i + 1
endloop
if not found then
call DisableTrigger(HeroCheckTrigger)
call TriggerExecute(gg_trg_Landdrache3)
endif
endfunction
//===========================================================================
function InitTrig_Landdrache1 takes nothing returns nothing
local trigger DrachenRangeTrigger = CreateTrigger()
set HeroCheckTrigger = CreateTrigger()
call TriggerRegisterTimerEventPeriodic(HeroCheckTrigger, 8.0)
call TriggerAddAction(HeroCheckTrigger, function HeroDragonDistance)
call DisableTrigger(HeroCheckTrigger)
call TriggerRegisterUnitInRange(DrachenRangeTrigger, gg_unit_Otch_0318, 1900.0, null)
call TriggerAddCondition(DrachenRangeTrigger, Condition(function Trig_Landdrache1_Conditions))
call TriggerAddAction(DrachenRangeTrigger, function LanddracheLandung)
endfunction
function Trig_Landdrache2_Conditions takes nothing returns boolean
return GetUnitTypeId(GetTriggerUnit()) == 'Otch'
endfunction
function Trig_Landdrache2_Actions takes nothing returns nothing
local unit u = GetTriggerUnit()
if u != null then
call SetUnitPosition(u, -17000.00, -6000.00)
endif
endfunction
//===========================================================================
function InitTrig_Landdrache2 takes nothing returns nothing
set gg_trg_Landdrache2 = CreateTrigger()
call TriggerRegisterUnitInRangeSimple(gg_trg_Landdrache2, 11000.00, gg_unit_nhym_1697)
call TriggerAddCondition(gg_trg_Landdrache2, Condition(function Trig_Landdrache2_Conditions))
call TriggerAddAction(gg_trg_Landdrache2, function Trig_Landdrache2_Actions)
endfunction
function Trig_Landdrache3_Conditions takes nothing returns boolean
return udg_GDD_DamageSource == gg_unit_Otch_0318 and GetUnitState(udg_GDD_DamagedUnit, UNIT_STATE_LIFE) < 100
endfunction
function Landdrache_Patrol takes nothing returns nothing
local timer t = GetExpiredTimer()
if GetUnitAbilityLevel(gg_unit_Otch_0318, 'B021') > 0 then
call IssuePointOrder(gg_unit_Otch_0318, "patrol", 7000.00, 4000.00)
else
call IssuePointOrder(gg_unit_Otch_0318, "move", -8000.00, -4000.00)
endif
call EnableTrigger(gg_trg_Landdrache7)
call DestroyTimer(t)
set t = null
endfunction
function Trig_Landdrache3_Actions takes nothing returns nothing
if GetRandomInt(1, 2) == 1 then
call EnableTrigger(gg_trg_Landdrache5)
call IssueTargetOrder(gg_unit_n019_0974, "holybolt", gg_unit_Otch_0318)
call SetUnitInvulnerable(gg_unit_Otch_0318, true)
call UnitAddAbility(gg_unit_Otch_0318, 'Amrf')
call UnitAddAbility(gg_unit_Otch_0318, 'Awan')
call SetUnitFlyHeight(gg_unit_Otch_0318, 500.00, 100.00)
call SetUnitAnimation(gg_unit_Otch_0318, "walk swim")
call QueueUnitAnimation(gg_unit_Otch_0318, "walk swim")
call TimerStart(CreateTimer(), 5.00, false, function Landdrache_Patrol)
endif
endfunction
function InitTrig_Landdrache3 takes nothing returns nothing
set gg_trg_Landdrache3 = CreateTrigger()
call TriggerRegisterVariableEvent(gg_trg_Landdrache3, "udg_GDD_Event", GREATER_THAN, 0.00)
call TriggerAddCondition(gg_trg_Landdrache3, Condition(function Trig_Landdrache3_Conditions))
call TriggerAddAction(gg_trg_Landdrache3, function Trig_Landdrache3_Actions)
endfunction
function Trig_Landdrache4_Actions takes nothing returns nothing
if GetRandomInt(1, 7) == 1 then
call PlaySoundOnUnitBJ(LoadSoundHandleBJ(40, 40, udg_HT_Sound), 100, gg_unit_Otch_0318)
if GetRandomInt(1, 2) == 1 then
call IssueTargetOrder(gg_unit_n019_0974, "holybolt", gg_unit_Otch_0318)
endif
elseif GetRandomInt(1, 5) == 1 then
call PlaySoundOnUnitBJ(LoadSoundHandleBJ(39, 40, udg_HT_Sound), 100, gg_unit_Otch_0318)
endif
endfunction
//===========================================================================
function InitTrig_Landdrache4 takes nothing returns nothing
set gg_trg_Landdrache4 = CreateTrigger()
call TriggerRegisterUnitEvent(gg_trg_Landdrache4, gg_unit_Otch_0318, EVENT_UNIT_DAMAGED)
call TriggerAddAction(gg_trg_Landdrache4, function Trig_Landdrache4_Actions)
endfunction
function Trig_Landdrache5_Actions takes nothing returns nothing
call SetUnitAnimation( gg_unit_Otch_0318, "walk swim" )
endfunction
//===========================================================================
function InitTrig_Landdrache5 takes nothing returns nothing
set gg_trg_Landdrache5 = CreateTrigger( )
call TriggerRegisterUnitEvent( gg_trg_Landdrache5, gg_unit_Otch_0318, EVENT_UNIT_ISSUED_POINT_ORDER )
call TriggerAddAction( gg_trg_Landdrache5, function Trig_Landdrache5_Actions )
endfunction
function Trig_Landdrache6_Conditions takes nothing returns boolean
return GetTriggerUnit() == gg_unit_Otch_0318 and GetPlayerController(GetOwningPlayer(GetAttacker())) != MAP_CONTROL_USER
endfunction
function Trig_Landdrache6_Actions takes nothing returns nothing
local boolean castMagicLeash = GetRandomInt(1, 2) == 1
local real x
local real y
call DisableTrigger(gg_trg_Landdrache5)
if castMagicLeash then
call IssueTargetOrder(gg_unit_Otch_0318, "magicleash", GetAttacker())
else
set x = GetUnitX(GetAttacker())
set y = GetUnitY(GetAttacker())
call IssuePointOrder(gg_unit_Otch_0318, "breathoffire", x, y)
endif
endfunction
//===========================================================================
function InitTrig_Landdrache6 takes nothing returns nothing
set gg_trg_Landdrache6 = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Landdrache6, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(gg_trg_Landdrache6, Condition(function Trig_Landdrache6_Conditions))
call TriggerAddAction(gg_trg_Landdrache6, function Trig_Landdrache6_Actions)
endfunction
function Trig_Landdrache7_Conditions takes nothing returns boolean
return GetAttacker() == gg_unit_Otch_0318 and GetPlayerController(GetOwningPlayer(GetTriggerUnit())) != MAP_CONTROL_USER
endfunction
function Trig_Landdrache7_Actions takes nothing returns nothing
call DisableTrigger(GetTriggeringTrigger())
call DisableTrigger(gg_trg_Landdrache5)
call UnitRemoveAbility(gg_unit_Otch_0318, 'Awan')
call SetUnitAnimation(gg_unit_Otch_0318, "walk swim")
call QueueUnitAnimation(gg_unit_Otch_0318, "walk swim")
call TriggerSleepAction(6.00)
call PauseUnit(gg_unit_Otch_0318, true)
call UnitAddAbility(gg_unit_Otch_0318, 'Amrf')
call SetUnitFlyHeight(gg_unit_Otch_0318, 120.00, 100.00)
call UnitRemoveAbility(gg_unit_Otch_0318, 'Amrf')
call TriggerSleepAction(5.00)
call SetUnitInvulnerable(gg_unit_Otch_0318, false)
call PauseUnit(gg_unit_Otch_0318, false)
endfunction
//===========================================================================
function InitTrig_Landdrache7 takes nothing returns nothing
set gg_trg_Landdrache7 = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Landdrache7, EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(gg_trg_Landdrache7, Condition(function Trig_Landdrache7_Conditions))
call TriggerAddAction(gg_trg_Landdrache7, function Trig_Landdrache7_Actions)
endfunction
/********************************************************************
* "Perfekter" JASS-Code
* 1) Bessere Funktionsnamen
* 2) Logik (Handicap-Werte etc.) identisch zum Original
* 3) Lokale Variable tempReal anstelle von udg_TempReal
********************************************************************/
// ----------------------------------------------------------
// Utility-Funktion: Prüft, ob ein Spieler-Slot aktiv ist
// ----------------------------------------------------------
function IsPlayerActive takes player whichPlayer returns boolean
return (GetPlayerSlotState(whichPlayer) == PLAYER_SLOT_STATE_PLAYING)
endfunction
// ----------------------------------------------------------
// Ermittelt, wie viele Spieler von (2, 3, 4) tatsächlich spielen
// ----------------------------------------------------------
function GetActiveHumanCount_234 takes nothing returns integer
local integer i = 2
local integer count = 0
loop
exitwhen i > 4
if IsPlayerActive(Player(i)) then
set count = count + 1
endif
set i = i + 1
endloop
return count
endfunction
// ----------------------------------------------------------
// Schwierigkeits-Abfragen
// ----------------------------------------------------------
function IsGameEasy takes nothing returns boolean
// KI = NEWBIE ODER Map-Schwierigkeitsgrad = EASY
return (GetAIDifficulty(Player(1)) == AI_DIFFICULTY_NEWBIE) or (GetGameDifficulty() == MAP_DIFFICULTY_EASY)
endfunction
function IsGameNormal takes nothing returns boolean
// KI = NORMAL ODER Map-Schwierigkeitsgrad = NORMAL
return (GetAIDifficulty(Player(1)) == AI_DIFFICULTY_NORMAL) or (GetGameDifficulty() == MAP_DIFFICULTY_NORMAL)
endfunction
function IsGameHard takes nothing returns boolean
// KI = INSANE ODER Map-Schwierigkeitsgrad = HARD
return (GetAIDifficulty(Player(1)) == AI_DIFFICULTY_INSANE) or (GetGameDifficulty() == MAP_DIFFICULTY_HARD)
endfunction
// ----------------------------------------------------------
// HAUPTFUNKTION: Führt alle Aktionen aus
// ----------------------------------------------------------
function Trig_Schwierigkeitsgrad_Actions takes nothing returns nothing
local real tempReal = 0.00
local integer activeCount = GetActiveHumanCount_234()
local integer i = 2
// 1) Anzeige & Tech je nach Anzahl aktiver Spieler (2..4)
if activeCount == 3 then
// -> 3 Spieler
call SetPlayerTechResearchedSwap( 'R013', 1, Player(8) )
call SetPlayerTechResearchedSwap( 'R013', 1, Player(PLAYER_NEUTRAL_AGGRESSIVE) )
call SetPlayerTechResearchedSwap( 'R013', 1, Player(PLAYER_NEUTRAL_PASSIVE) )
elseif activeCount == 2 then
// -> 2 Spieler
call SetPlayerTechResearchedSwap( 'R012', 1, Player(8) )
call SetPlayerTechResearchedSwap( 'R012', 1, Player(PLAYER_NEUTRAL_AGGRESSIVE) )
call SetPlayerTechResearchedSwap( 'R012', 1, Player(PLAYER_NEUTRAL_PASSIVE) )
else
// -> 1 Spieler => do nothing
endif
// 2) Pro aktivem Spieler(2..4): tempReal +20
loop
exitwhen i > 4
if IsPlayerActive(Player(i)) then
set tempReal = tempReal + 20.00
endif
set i = i + 1
endloop
// 3) Schwierigkeitsgrad prüfen & Handicaps setzen
// (Werte identisch wie im Originalcode)
if IsGameEasy() then
// -----------------------
// E A S Y
// -----------------------
call SetPlayerHandicapBJ(Player(2), 180.00 - tempReal)
call SetPlayerHandicapBJ(Player(3), 180.00 - tempReal)
call SetPlayerHandicapBJ(Player(4), 180.00 - tempReal)
call SetPlayerHandicapDamageBJ(Player(PLAYER_NEUTRAL_AGGRESSIVE), 50.00 + tempReal)
call SetPlayerHandicapDamageBJ(Player(0), 50.00 + tempReal)
call SetPlayerHandicapDamageBJ(Player(8), 50.00 + tempReal)
call SetPlayerHandicapBJ(Player(PLAYER_NEUTRAL_AGGRESSIVE), 80.00 + tempReal)
call SetPlayerHandicapBJ(Player(0), 80.00 + tempReal)
call SetPlayerHandicapBJ(Player(8), 80.00 + tempReal)
call SetPlayerHandicapBJ(Player(13), 80.00 + tempReal)
call SetPlayerHandicapBJ(Player(5), 80.00 + tempReal)
call SetPlayerHandicapBJ(Player(6), 80.00 + tempReal)
call SetPlayerHandicapBJ(Player(7), 80.00 + tempReal)
call SetPlayerHandicapBJ(Player(11), 80.00 + tempReal)
elseif IsGameHard() then
// -----------------------
// H A R D (INSANE)
// -----------------------
call SetPlayerHandicapBJ(Player(2), 130.00 - tempReal)
call SetPlayerHandicapBJ(Player(3), 130.00 - tempReal)
call SetPlayerHandicapBJ(Player(4), 130.00 - tempReal)
call SetPlayerHandicapDamageBJ(Player(PLAYER_NEUTRAL_AGGRESSIVE), 85.00 + tempReal)
call SetPlayerHandicapDamageBJ(Player(0), 85.00 + tempReal)
call SetPlayerHandicapDamageBJ(Player(8), 85.00 + tempReal)
call SetPlayerHandicapBJ(Player(PLAYER_NEUTRAL_AGGRESSIVE), 110.00 + tempReal)
call SetPlayerHandicapBJ(Player(0), 110.00 + tempReal)
call SetPlayerHandicapBJ(Player(8), 110.00 + tempReal)
call SetPlayerHandicapBJ(Player(13), 110.00 + tempReal)
call SetPlayerHandicapBJ(Player(5), 110.00 + tempReal)
call SetPlayerHandicapBJ(Player(6), 110.00 + tempReal)
call SetPlayerHandicapBJ(Player(7), 110.00 + tempReal)
call SetPlayerHandicapBJ(Player(11), 110.00 + tempReal)
elseif IsGameNormal() then
// -----------------------
// N O R M A L
// -----------------------
call SetPlayerHandicapBJ(Player(2), 140.00 - tempReal)
call SetPlayerHandicapBJ(Player(3), 140.00 - tempReal)
call SetPlayerHandicapBJ(Player(4), 140.00 - tempReal)
call SetPlayerHandicapDamageBJ(Player(PLAYER_NEUTRAL_AGGRESSIVE), 75.00 + tempReal)
call SetPlayerHandicapDamageBJ(Player(0), 75.00 + tempReal)
call SetPlayerHandicapDamageBJ(Player(8), 75.00 + tempReal)
call SetPlayerHandicapBJ(Player(PLAYER_NEUTRAL_AGGRESSIVE), 100.00 + tempReal)
call SetPlayerHandicapBJ(Player(0), 100.00 + tempReal)
call SetPlayerHandicapBJ(Player(8), 100.00 + tempReal)
call SetPlayerHandicapBJ(Player(13), 100.00 + tempReal)
call SetPlayerHandicapBJ(Player(5), 100.00 + tempReal)
call SetPlayerHandicapBJ(Player(6), 100.00 + tempReal)
call SetPlayerHandicapBJ(Player(7), 100.00 + tempReal)
call SetPlayerHandicapBJ(Player(11), 100.00 + tempReal)
else
// Weder Easy / Hard / Normal -> do nothing
endif
endfunction
// ----------------------------------------------------------
// Trigger-Initialisierung
// ----------------------------------------------------------
function InitTrig_Schwierigkeitsgrad takes nothing returns nothing
set gg_trg_Schwierigkeitsgrad = CreateTrigger()
call TriggerAddAction(gg_trg_Schwierigkeitsgrad, function Trig_Schwierigkeitsgrad_Actions)
endfunction
//=================================================================================
// 1) Hash-Funktionen
//=================================================================================
function IsTalentSpell takes integer abilId, integer pId returns boolean
local integer value = LoadInteger(TalentHash, abilId, pId)
return (value != 0)
endfunction
function GetTalentFromHash takes integer abilId, integer pId returns integer
local integer talent = LoadInteger(TalentHash, abilId, pId)
return talent
endfunction
function GetCurrentTalentLevel takes unit caster, integer abilId returns integer
local integer level
set level = BlzGetAbilityIntegerField(BlzGetUnitAbility(caster, abilId), ABILITY_IF_MISSILE_SPEED)
return level
endfunction
//=================================================================================
// 2) Conditions
//=================================================================================
function Trig_Talentbuch_Conditions takes nothing returns boolean
local unit castUnit = GetSpellAbilityUnit()
local integer abilId = GetSpellAbilityId()
local integer ownerId = GetPlayerId(GetOwningPlayer(castUnit))
local integer missileSpeed = 0
local ability abilityHandle
// 1) Held hat Skillpunkte?
if (GetHeroSkillPoints(castUnit) <= 0) then
return false
endif
// 2) Ability-Handle abfragen
set abilityHandle = BlzGetUnitAbility(castUnit, abilId)
// 3) Falls das Handle existiert, MissileSpeed auslesen
if (abilityHandle != null) then
set missileSpeed = BlzGetAbilityIntegerField(abilityHandle, ABILITY_IF_MISSILE_SPEED)
endif
// 4) Bereits auf Level 3?
if (missileSpeed >= 3) then
return false
endif
// 5) In Hash vorhanden?
if not IsTalentSpell(abilId, ownerId) then
return false
endif
return true
endfunction
//=================================================================================
// 3) Actions
//=================================================================================
function Trig_Talentbuch_Actions takes nothing returns nothing
local integer pIndex = GetConvertedPlayerId(GetTriggerPlayer())
local unit castUnit = GetSpellAbilityUnit()
local integer abilId = GetSpellAbilityId()
local integer ownerId = GetPlayerId(GetOwningPlayer(castUnit))
local integer currLevel
local integer newTalent
// 1) "Talent-Rawcode" aus der Hash laden
set newTalent = GetTalentFromHash(abilId, ownerId)
// 2) In globales Array speichern
set udg_Talent_Unit_in_Hero[pIndex] = newTalent
// 3) Aktuelles Talent-Level auslesen
set currLevel = GetCurrentTalentLevel(castUnit, abilId)
// 4) Je nach currLevel aufwerten
if (currLevel == 0) then
// -> Lerne Level 1
call BlzSetAbilityIntegerField(BlzGetUnitAbility(castUnit, abilId), ABILITY_IF_MISSILE_SPEED, 1)
call UnitAddAbility(udg_ZRPGHero[pIndex], newTalent)
call BlzSetAbilityTooltip(abilId, GetAbilityName(abilId) + BlzGetAbilityExtendedTooltip('AX28', 2), 0)
call SetUnitAbilityLevel(udg_ZRPGHero[pIndex], newTalent, 1)
call ModifyHeroSkillPoints(udg_ZRPGHero[pIndex], bj_MODIFYMETHOD_SUB, 1)
set udg_Talent_Punkte[pIndex] = udg_Talent_Punkte[pIndex] + 1
elseif (currLevel == 1) then
// -> Lerne Level 2
call BlzSetAbilityIntegerField(BlzGetUnitAbility(castUnit, abilId), ABILITY_IF_MISSILE_SPEED, 2)
call BlzSetAbilityTooltip(abilId, GetAbilityName(abilId) + BlzGetAbilityExtendedTooltip('AX28', 3), 0)
call SetUnitAbilityLevel(udg_ZRPGHero[pIndex], newTalent, 2)
call ModifyHeroSkillPoints(udg_ZRPGHero[pIndex], bj_MODIFYMETHOD_SUB, 1)
set udg_Talent_Punkte[pIndex] = udg_Talent_Punkte[pIndex] + 1
elseif (currLevel == 2) then
// -> Lerne Level 3
call BlzSetAbilityIntegerField(BlzGetUnitAbility(castUnit, abilId), ABILITY_IF_MISSILE_SPEED, 3)
call BlzSetUnitAbilityManaCost(castUnit, abilId, 0, 100000)
call BlzSetAbilityTooltip(abilId, GetAbilityName(abilId) + BlzGetAbilityExtendedTooltip('AX28', 1), 0)
call SetUnitAbilityLevel(udg_ZRPGHero[pIndex], newTalent, 3)
call ModifyHeroSkillPoints(udg_ZRPGHero[pIndex], bj_MODIFYMETHOD_SUB, 1)
set udg_Talent_Punkte[pIndex] = udg_Talent_Punkte[pIndex] + 1
else
// -> 3 oder höher
endif
// Held anhalten
call IssueImmediateOrder(castUnit, "holdposition")
endfunction
//=================================================================================
// 4) Trigger-Init
//=================================================================================
function InitTrig_Talentbuch takes nothing returns nothing
set gg_trg_Talentbuch = CreateTrigger()
// Spieler 2, 3, 4
call TriggerRegisterPlayerUnitEventSimple( gg_trg_Talentbuch, Player(2), EVENT_PLAYER_UNIT_SPELL_CAST )
call TriggerRegisterPlayerUnitEventSimple( gg_trg_Talentbuch, Player(3), EVENT_PLAYER_UNIT_SPELL_CAST )
call TriggerRegisterPlayerUnitEventSimple( gg_trg_Talentbuch, Player(4), EVENT_PLAYER_UNIT_SPELL_CAST )
// Condition & Action
call TriggerAddCondition( gg_trg_Talentbuch, Condition(function Trig_Talentbuch_Conditions) )
call TriggerAddAction( gg_trg_Talentbuch, function Trig_Talentbuch_Actions )
endfunction
// -----------------------------------------------------------
// Hilfsfunktion: Prüft, ob ein ability-Handle ungültig ist
// (Weil handle != null in altem JASS nicht erlaubt ist)
// -----------------------------------------------------------
function IsAbilityHandleValid takes ability a returns boolean
// GetHandleId(a) == 0.0 => ungültig; != 0.0 => gültig
return (GetHandleId(a) != 0)
endfunction
// -----------------------------------------------------------
// Hilfsfunktion: AY-Fähigkeit zurücksetzen
// (MissileSpeed=0, ManaCost=0, Tooltip="Stufe1")
// -----------------------------------------------------------
function ResetOneAY takes unit whichUnit, integer rawcode returns nothing
local ability a = BlzGetUnitAbility(whichUnit, rawcode)
if IsAbilityHandleValid(a) then
call BlzSetUnitAbilityManaCost(whichUnit, rawcode, 0, 0)
call BlzSetAbilityIntegerField(a, ABILITY_IF_MISSILE_SPEED, 0)
call BlzSetAbilityTooltip(rawcode, "Talente [Stufe 1]", 0)
endif
set a = null
endfunction
// -----------------------------------------------------------
// Basisfähigkeiten AIda / AY33 zurücksetzen
// -----------------------------------------------------------
function ResetBaseTalents takes unit whichUnit returns nothing
local ability a
// --- AIda ---
set a = BlzGetUnitAbility(whichUnit, 'AIda')
if IsAbilityHandleValid(a) then
call BlzSetUnitAbilityManaCost(whichUnit, 'AIda', 0, 0)
call BlzSetAbilityIntegerField(a, ABILITY_IF_MISSILE_SPEED, 0)
call BlzSetAbilityTooltip('AIda', "AIda [Stufe 1]", 0)
endif
// --- AY33 ---
set a = BlzGetUnitAbility(whichUnit, 'AY33')
if IsAbilityHandleValid(a) then
call BlzSetUnitAbilityManaCost(whichUnit, 'AY33', 0, 0)
call BlzSetAbilityIntegerField(a, ABILITY_IF_MISSILE_SPEED, 0)
call BlzSetAbilityTooltip('AY33', "AY33 [Stufe 1]", 0)
endif
// Entferne dazu noch die Held-Fähigkeiten 'APh1' und 'AHav'
call UnitRemoveAbilityBJ('APh1', whichUnit)
call UnitRemoveAbilityBJ('AHav', whichUnit)
set a = null
endfunction
// -----------------------------------------------------------
// Rassenabhängig alle AY-Fähigkeiten resetten & Held-Fähigkeiten entfernen
// -----------------------------------------------------------
function UnlearnTalentsForPlayer takes unit whichUnit, integer playerId returns nothing
if (playerId == 2) then
// Mensch
call SetUnitScalePercent(whichUnit, 99.50, 99.50, 99.50)
call ResetOneAY(whichUnit, 'AY00')
call ResetOneAY(whichUnit, 'AY01')
call ResetOneAY(whichUnit, 'AY02')
call ResetOneAY(whichUnit, 'AY03')
call ResetOneAY(whichUnit, 'AY04')
call ResetOneAY(whichUnit, 'AY05')
call ResetOneAY(whichUnit, 'AY18')
call ResetOneAY(whichUnit, 'AY19')
call ResetOneAY(whichUnit, 'AY21')
call ResetOneAY(whichUnit, 'AY22')
call ResetOneAY(whichUnit, 'AY23')
call UnitRemoveAbilityBJ('A01S', whichUnit)
call UnitRemoveAbilityBJ('AHds', whichUnit)
call UnitRemoveAbilityBJ('A00J', whichUnit)
call UnitRemoveAbilityBJ('AHhb', whichUnit)
call UnitRemoveAbilityBJ('ANdh', whichUnit)
call UnitRemoveAbilityBJ('A00L', whichUnit)
call UnitRemoveAbilityBJ('AX46', whichUnit)
call UnitRemoveAbilityBJ('A01K', whichUnit)
call UnitRemoveAbilityBJ('AX22', whichUnit)
call UnitRemoveAbilityBJ('AX49', whichUnit)
call UnitRemoveAbilityBJ('AX47', whichUnit)
elseif (playerId == 3) then
// Ork
call SetUnitScalePercent(whichUnit, 125.00, 125.00, 125.00)
call ResetOneAY(whichUnit, 'AY16')
call ResetOneAY(whichUnit, 'AY10')
call ResetOneAY(whichUnit, 'AY14')
call ResetOneAY(whichUnit, 'Awrh')
call ResetOneAY(whichUnit, 'ACsf')
call ResetOneAY(whichUnit, 'AY15')
call ResetOneAY(whichUnit, 'AY11')
call ResetOneAY(whichUnit, 'AY12')
call ResetOneAY(whichUnit, 'AY17')
call ResetOneAY(whichUnit, 'AY08')
call ResetOneAY(whichUnit, 'AY20')
call UnitRemoveAbilityBJ('ANdr', whichUnit)
call UnitRemoveAbilityBJ('AX38', whichUnit)
call UnitRemoveAbilityBJ('AX40', whichUnit)
call UnitRemoveAbilityBJ('AOww', whichUnit)
call UnitRemoveAbilityBJ('AX35', whichUnit)
call UnitRemoveAbilityBJ('AX34', whichUnit)
call UnitRemoveAbilityBJ('AX37', whichUnit)
call UnitRemoveAbilityBJ('AEsh', whichUnit)
call UnitRemoveAbilityBJ('AUfn', whichUnit)
call UnitRemoveAbilityBJ('AOcl', whichUnit)
call UnitRemoveAbilityBJ('ANms', whichUnit)
elseif (playerId == 4) then
// Nachtelf
call SetUnitScalePercent(whichUnit, 90.00, 90.00, 90.00)
call ResetOneAY(whichUnit, 'AY24')
call ResetOneAY(whichUnit, 'AY07')
call ResetOneAY(whichUnit, 'AY27')
call ResetOneAY(whichUnit, 'AY09')
call ResetOneAY(whichUnit, 'AY25')
call ResetOneAY(whichUnit, 'AY26')
call ResetOneAY(whichUnit, 'AY13')
call ResetOneAY(whichUnit, 'AY28')
call ResetOneAY(whichUnit, 'AY29')
call ResetOneAY(whichUnit, 'AY30')
call ResetOneAY(whichUnit, 'AY31')
call UnitRemoveAbilityBJ('AX63', whichUnit)
call UnitRemoveAbilityBJ('A01P', whichUnit)
call UnitRemoveAbilityBJ('AOws', whichUnit)
call UnitRemoveAbilityBJ('AX48', whichUnit)
call UnitRemoveAbilityBJ('ANcs', whichUnit)
call UnitRemoveAbilityBJ('AX12', whichUnit)
call UnitRemoveAbilityBJ('AX62', whichUnit)
call UnitRemoveAbilityBJ('A01L', whichUnit)
call UnitRemoveAbilityBJ('AX64', whichUnit)
call UnitRemoveAbilityBJ('AX66', whichUnit)
call UnitRemoveAbilityBJ('AX65', whichUnit)
endif
endfunction
// -----------------------------------------------------------
// CONDITION
// -----------------------------------------------------------
function Trig_Talente_Verlernen_Conditions takes nothing returns boolean
local item it = GetManipulatedItem()
// 1) Handle-Check: Falls it == null => GetHandleId(it) = 0
if (GetHandleId(it) == 0) then
return false
endif
// 2) Typcheck: Muss 'tret' sein
if (GetItemTypeId(it) != 'tret') then
return false
endif
// Aufräumen
set it = null
return true
endfunction
// -----------------------------------------------------------
// ACTIONS
// -----------------------------------------------------------
function Trig_Talente_Verlernen_Actions takes nothing returns nothing
local unit u = GetManipulatingUnit()
local integer pIndex = GetConvertedPlayerId(GetTriggerPlayer())
// 1) Talentpunkte zurückgeben
call ModifyHeroSkillPoints(u, bj_MODIFYMETHOD_ADD, udg_Talent_Punkte[pIndex])
set udg_Talent_Punkte[pIndex] = 0
// 2) AIda & AY33 resetten
call ResetBaseTalents(u)
// 3) Rassen-abhängig alles resetten
call UnlearnTalentsForPlayer(u, GetPlayerId(GetOwningPlayer(u)))
// Aufräumen
set u = null
endfunction
// -----------------------------------------------------------
// INIT
// -----------------------------------------------------------
function InitTrig_Talente_Verlernen takes nothing returns nothing
// Trigger erzeugen
set gg_trg_Talente_Verlernen = CreateTrigger()
// Event: Irgendeine Einheit hebt ein Item auf
call TriggerRegisterAnyUnitEventBJ(gg_trg_Talente_Verlernen, EVENT_PLAYER_UNIT_PICKUP_ITEM)
// Condition + Action
call TriggerAddCondition(gg_trg_Talente_Verlernen, Condition(function Trig_Talente_Verlernen_Conditions))
call TriggerAddAction(gg_trg_Talente_Verlernen, function Trig_Talente_Verlernen_Actions)
endfunction
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 1) Conditions
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function Trig_Bergbau_Mineral takes nothing returns boolean
if (GetUnitTypeId(GetSpellTargetUnit()) == 'n018') then
return true
endif
if (GetUnitTypeId(GetSpellTargetUnit()) == 'n00A') then
return true
endif
return false
endfunction
function Trig_Bergbau_Conditions takes nothing returns boolean
if (GetSpellAbilityId() != 'AX06') then
return false
endif
if not Trig_Bergbau_Mineral() then
return false
endif
return true
endfunction
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 2) Timer-Callback (PostWait)
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function Trig_Bergbau_PostWait takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
// Laden aus Hashtable
local unit target = LoadUnitHandle(udg_BergbauHash, id, 0)
local unit caster = LoadUnitHandle(udg_BergbauHash, id, 1)
local location locMine = LoadLocationHandle(udg_BergbauHash, id, 2)
local location locDrop = LoadLocationHandle(udg_BergbauHash, id, 3)
local integer dropIdx = LoadInteger(udg_BergbauHash, id, 4)
local effect pickEffect= LoadEffectHandle(udg_BergbauHash, id, 5)
// Timer & Child-Hash
call FlushChildHashtable(udg_BergbauHash, id)
call DestroyTimer(t)
set t = null
// Sicherheitsabbruch
if (target == null or caster == null) then
return
endif
// 1.Drop
call PlaySoundOnUnitBJ( gg_snd_MetalLightChopStone2, 100, target )
call CreateItemLoc(udg_BergbauUNDSchatzItemTyp[dropIdx], locDrop)
// 2.Drop
if (GetUnitTypeId(target) == 'n018') then
set dropIdx = GetRandomInt(0, 9)
else
set dropIdx = GetRandomInt(9, 16)
endif
call CreateItemLoc(udg_BergbauUNDSchatzItemTyp[dropIdx], locDrop)
call QueueUnitAnimationBJ(caster, "stand")
// Effekt entfernen, falls vorhanden
if pickEffect != null then
call DestroyEffect(pickEffect)
set pickEffect = null
endif
// entfernen & nullen
call RemoveLocation(locMine)
call RemoveLocation(locDrop)
set target = null
set caster = null
set locMine = null
set locDrop = null
endfunction
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 3) Hauptaktion (sofort)
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function Trig_Bergbau_Actions takes nothing returns nothing
local unit target = GetSpellTargetUnit()
local unit caster = GetSpellAbilityUnit()
local player ownerP = GetOwningPlayer(caster)
local location locMine
local location locDrop
local timer t = CreateTimer()
local integer id = GetHandleId(t)
local integer dropIdx
local boolean hasPickCaster = false
local boolean hasPickHero = false
local effect pickEffect = null
if UnitHasItemOfTypeBJ(caster, 'rump') then
set hasPickCaster = true
endif
if UnitHasItemOfTypeBJ(udg_ZRPGHeroAusr[GetConvertedPlayerId(ownerP)], 'rump') then
set hasPickHero = true
endif
// Falls weder Ausr. noch Caster 'rump' -> Abbruch
if (not hasPickCaster and not hasPickHero) then
call DisplayTextToForce(GetForceOfPlayer(ownerP), "|cffff0000A pickaxe is required|r")
// Clean
set target = null
set caster = null
set ownerP = null
set t = null
return
endif
if hasPickCaster then
set pickEffect = AddSpecialEffectTarget("war3mapImported\\Waffe1.mdx", caster, "hand,left")
endif
// Standard-Bergbau: Sound1, Animation, HP -300, etc.
set locMine = GetUnitLoc(target)
set locDrop = PolarProjectionBJ(locMine, -150.00, GetUnitFacing(caster))
call PlaySoundOnUnitBJ( gg_snd_MetalLightChopStone1, 100, target )
call SetUnitAnimation(caster, "attack")
call QueueUnitAnimationBJ(caster, "attack")
call UnitRemoveAbility(target, 'Afih')
if (GetUnitTypeId(target) == 'n018') then
set dropIdx = GetRandomInt(0, 9)
else
set dropIdx = GetRandomInt(9, 16)
endif
call SetUnitLifeBJ(target, GetUnitStateSwap(UNIT_STATE_LIFE, target) - 300.00)
// In Hashtable speichern
call SaveUnitHandle(udg_BergbauHash, id, 0, target)
call SaveUnitHandle(udg_BergbauHash, id, 1, caster)
call SaveLocationHandle(udg_BergbauHash, id, 2, locMine)
call SaveLocationHandle(udg_BergbauHash, id, 3, locDrop)
call SaveInteger(udg_BergbauHash, id, 4, dropIdx)
call SaveEffectHandle(udg_BergbauHash, id, 5, pickEffect)
// Timer -> PostWait
call TimerStart(t, 1.25, false, function Trig_Bergbau_PostWait)
// Cleanup
set target = null
set caster = null
set ownerP = null
set locMine = null
set locDrop = null
set pickEffect = null
set t = null
endfunction
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 4) Init Trigger
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function InitTrig_Bergbau takes nothing returns nothing
set gg_trg_Bergbau = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ( gg_trg_Bergbau, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Bergbau, Condition(function Trig_Bergbau_Conditions))
call TriggerAddAction( gg_trg_Bergbau, function Trig_Bergbau_Actions )
endfunction
function Trig_Zauberschaden_Conditions takes nothing returns boolean
local integer spellId = GetSpellAbilityId()
return spellId == 'A01P' or spellId == 'AX48' or spellId == 'AX62' or spellId == 'A00J' or spellId == 'ANdh' or spellId == 'AHhb' or spellId == 'AUfn' or spellId == 'AX37' or spellId == 'AEsh' or spellId == 'AOcl'
endfunction
function Trig_Zauberschaden_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local unit target = GetSpellTargetUnit()
local integer spellId = GetSpellAbilityId()
local real intelligence = I2R(GetHeroStatBJ(bj_HEROSTAT_INT, caster, true))
local real damage = 2.00 * intelligence
if spellId == 'AHhb' then
set damage = -damage // Heiliges Licht = Heilung
endif
call UnitDamageTarget(caster, target, damage, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, WEAPON_TYPE_WHOKNOWS)
set caster = null
set target = null
endfunction
function InitTrig_Zauberschaden takes nothing returns nothing
set gg_trg_Zauberschaden = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Zauberschaden, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(gg_trg_Zauberschaden, Condition(function Trig_Zauberschaden_Conditions))
call TriggerAddAction(gg_trg_Zauberschaden, function Trig_Zauberschaden_Actions)
endfunction
function Trig_Mana_XP_Conditions takes nothing returns boolean
local unit killer = GetKillingUnit()
local player killerOwner = GetOwningPlayer(killer)
return GetUnitLevel(GetDyingUnit()) > 0 and GetPlayerController(killerOwner) == MAP_CONTROL_USER
endfunction
function Trig_Mana_XP_Actions takes nothing returns nothing
local unit killer = GetKillingUnit()
local real maxMana = GetUnitState(killer, UNIT_STATE_MAX_MANA)
// Mana-Boost um 8% des maximalen Manas + 15 XP hinzufügen
call SetUnitState(killer, UNIT_STATE_MANA, GetUnitState(killer, UNIT_STATE_MANA) + (maxMana * 0.08))
call AddHeroXP(killer, 15, false)
set killer = null
endfunction
function InitTrig_Mana_XP takes nothing returns nothing
set gg_trg_Mana_XP = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Mana_XP, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(gg_trg_Mana_XP, Condition(function Trig_Mana_XP_Conditions))
call TriggerAddAction(gg_trg_Mana_XP, function Trig_Mana_XP_Actions)
endfunction
function Trig_Mana_Reg_Conditions takes nothing returns boolean
local unit damageSource = udg_GDD_DamageSource
local unit damagedUnit = udg_GDD_DamagedUnit
local player owner
local real lifePercent
// Falls kein Schadensverursacher existiert, beende die Bedingung sofort
if damageSource == null then
return false
endif
set owner = GetOwningPlayer(damageSource)
// Falls der Schadensverursacher NICHT ein MAP_CONTROL_USER-Spieler ist, beende die Funktion
if GetPlayerController(owner) != MAP_CONTROL_USER then
return false
endif
set lifePercent = GetUnitLifePercent(damagedUnit)
// 30% Chance prüfen + Bedingungen
return lifePercent >= 10.00 and lifePercent <= 80.00 and GetRandomReal(0.00, 1.00) <= 0.30
endfunction
function Trig_Mana_Reg_Actions takes nothing returns nothing
local unit damageSource = udg_GDD_DamageSource
local real maxMana = GetUnitState(damageSource, UNIT_STATE_MAX_MANA)
local real currentMana = GetUnitState(damageSource, UNIT_STATE_MANA)
call SetUnitState(damageSource, UNIT_STATE_MANA, currentMana + (maxMana * 0.01))
endfunction
function InitTrig_Mana_Reg takes nothing returns nothing
set gg_trg_Mana_Reg = CreateTrigger()
call TriggerRegisterVariableEvent(gg_trg_Mana_Reg, "udg_GDD_Event", GREATER_THAN, 0.00)
call TriggerAddCondition(gg_trg_Mana_Reg, Condition(function Trig_Mana_Reg_Conditions))
call TriggerAddAction(gg_trg_Mana_Reg, function Trig_Mana_Reg_Actions)
endfunction
function Trig_Klippe_Action takes nothing returns nothing
local integer i = 1
local unit hero
local unit caster
loop
exitwhen i > 5
set hero = udg_ZRPGHero[i]
if hero != null and IsUnitType(hero, UNIT_TYPE_HERO) then
set caster = udg_UnitExtraDmg[i]
if caster != null then
call IssuePointOrder(caster, "farsight", GetUnitX(hero), GetUnitY(hero))
endif
endif
set i = i + 1
endloop
endfunction
function InitTrig_Klippe takes nothing returns nothing
set gg_trg_Klippe = CreateTrigger()
call TriggerRegisterTimerEventPeriodic(gg_trg_Klippe, 9.5)
call TriggerAddAction(gg_trg_Klippe, function Trig_Klippe_Action)
endfunction
function Trig_Sehnenriss_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A00L'
endfunction
function Trig_Sehnenriss_Actions takes nothing returns nothing
local unit caster = GetSpellAbilityUnit()
local unit target = GetSpellTargetUnit()
local integer playerId = GetConvertedPlayerId(GetOwningPlayer(caster))
local integer abilityLevel = GetUnitAbilityLevelSwapped('A00L', caster)
local integer multiplier = 1 + (2 * abilityLevel) // Stärkere Skalierung: 3x, 5x, 7x
local integer bonusDamage = ZRPGDmg(playerId, caster) * multiplier
call UnitDamageTarget(caster, target, I2R(bonusDamage), true, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
set caster = null
set target = null
endfunction
//===========================================================================
function InitTrig_Sehnenriss takes nothing returns nothing
set gg_trg_Sehnenriss = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Sehnenriss, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(gg_trg_Sehnenriss, Condition(function Trig_Sehnenriss_Conditions))
call TriggerAddAction(gg_trg_Sehnenriss, function Trig_Sehnenriss_Actions)
endfunction
function Trig_Paralyseschlag_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'AX34'
endfunction
function Trig_Paralyseschlag_Actions takes nothing returns nothing
local unit caster = GetSpellAbilityUnit()
local unit target = GetSpellTargetUnit()
local integer playerId = GetConvertedPlayerId(GetOwningPlayer(caster))
local integer abilityLevel = GetUnitAbilityLevelSwapped('AX34', caster)
local integer ZRPGDmgValue = ZRPGDmg(playerId, caster) // Holt den Schaden aus der Bibliothek
local integer bonusDamage = ZRPGDmgValue * abilityLevel * 2 // Anpassung der Schadensberechnung
call UnitDamageTarget(caster, target, I2R(bonusDamage), true, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
// Speicherbereinigung
set caster = null
set target = null
endfunction
//===========================================================================
function InitTrig_Paralyseschlag takes nothing returns nothing
set gg_trg_Paralyseschlag = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Paralyseschlag, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(gg_trg_Paralyseschlag, Condition(function Trig_Paralyseschlag_Conditions))
call TriggerAddAction(gg_trg_Paralyseschlag, function Trig_Paralyseschlag_Actions)
endfunction
function Trig_Ausweiden_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A01K'
endfunction
function Trig_Ausweiden_Actions takes nothing returns nothing
local unit caster = GetSpellAbilityUnit()
local unit target = GetSpellTargetUnit()
local integer playerId = GetConvertedPlayerId(GetOwningPlayer(caster))
local integer abilityLevel = GetUnitAbilityLevelSwapped('A01K', caster)
local integer baseDmg = ZRPGDmg(playerId, caster) // Holt den Schaden aus der Bibliothek
local integer bonusAgiDmg = 10 * GetHeroStatBJ(bj_HEROSTAT_AGI, caster, true) // AGI x 10
local integer totalDmg = abilityLevel * baseDmg
// Erster Angriff: Basis-Schaden
call UnitDamageTarget(caster, target, I2R(totalDmg), true, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
// Falls das Ziel <= 50% HP hat, zusätzlicher AGI-Schaden
if GetUnitLifePercent(target) <= 50 then
call UnitDamageTarget(caster, target, I2R(abilityLevel * bonusAgiDmg), true, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
call SetUnitAnimation(caster, "Attack Slam")
endif
// Speicherbereinigung
set caster = null
set target = null
endfunction
//===========================================================================
function InitTrig_Ausweiden takes nothing returns nothing
set gg_trg_Ausweiden = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Ausweiden, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(gg_trg_Ausweiden, Condition(function Trig_Ausweiden_Conditions))
call TriggerAddAction(gg_trg_Ausweiden, function Trig_Ausweiden_Actions)
endfunction
function Trig_Kraftrausch_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'AX35'
endfunction
function Trig_Kraftrausch_Actions takes nothing returns nothing
local unit caster = GetSpellAbilityUnit()
local unit target = GetSpellTargetUnit()
local integer playerId = GetConvertedPlayerId(GetTriggerPlayer()) // Einheitlich mit Bibliotheksfunktion
local integer abilityLevel = GetUnitAbilityLevelSwapped('AX35', caster)
local integer ZRPGDmgValue = ZRPGDmg(playerId, caster) // Holt den Schaden aus der Bibliothek
local integer bonusDamage = ZRPGDmgValue * (1 + abilityLevel) // Weniger starker Multiplikator
local integer manaRegenLevel = abilityLevel
local real newMana = GetUnitState(caster, UNIT_STATE_MANA) + (10.00 * I2R(manaRegenLevel))
// Schaden zufügen
call UnitDamageTarget(caster, target, I2R(bonusDamage), true, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
// Mana wiederherstellen
call SetUnitState(caster, UNIT_STATE_MANA, newMana)
// Speicherbereinigung
set caster = null
set target = null
endfunction
//===========================================================================
function InitTrig_Kraftrausch takes nothing returns nothing
set gg_trg_Kraftrausch = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Kraftrausch, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(gg_trg_Kraftrausch, Condition(function Trig_Kraftrausch_Conditions))
call TriggerAddAction(gg_trg_Kraftrausch, function Trig_Kraftrausch_Actions)
endfunction
function Trig_Speerwurf_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'ANc1'
endfunction
function Trig_Speerwurf_Actions takes nothing returns nothing
local unit caster = GetSpellAbilityUnit()
local location targetLoc = GetSpellTargetLoc()
local integer playerId
local integer abilityLevel
local integer multiplier
local integer bonusDamage
if targetLoc == null then
set caster = null
return
endif
call TriggerSleepAction(1.00) // Verzögerung bleibt bestehen
// Überprüfe, ob der Cooldown aktiv ist (d.h. die Fähigkeit wurde nicht abgebrochen)
if BlzGetUnitAbilityCooldownRemaining(caster, 'ANc1') > 0.00 then
set playerId = GetConvertedPlayerId(GetOwningPlayer(caster))
set abilityLevel = GetUnitAbilityLevelSwapped('ANc1', caster)
set multiplier = 2 * abilityLevel + 1 // 3x, 5x, 7x Skalierung
set bonusDamage = ZRPGDmg(playerId, caster) * multiplier
call UnitDamagePointLoc(caster, 0, 150.00, targetLoc, I2R(bonusDamage), ATTACK_TYPE_SIEGE, DAMAGE_TYPE_NORMAL)
call IssuePointOrderLocBJ(gg_unit_n019_0974, "flamestrike", targetLoc) // Dummy-Einheit führt Zauber aus
endif
call RemoveLocation(targetLoc)
set targetLoc = null
set caster = null
endfunction
//===========================================================================
function InitTrig_Speerwurf takes nothing returns nothing
set gg_trg_Speerwurf = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Speerwurf, EVENT_PLAYER_UNIT_SPELL_CAST)
call TriggerAddCondition(gg_trg_Speerwurf, Condition(function Trig_Speerwurf_Conditions))
call TriggerAddAction(gg_trg_Speerwurf, function Trig_Speerwurf_Actions)
endfunction
function IsHeroKiller takes nothing returns boolean
local unit killer = GetKillingUnitBJ()
return (udg_ZRPGHero[3] == killer) or (udg_ZRPGHero[4] == killer) or (udg_ZRPGHero[5] == killer)
endfunction
function Trig_WaffenZaehler_Conditions takes nothing returns boolean
local integer playerId = GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))
local item itm = UnitItemInSlot(udg_ZRPGHeroAusr[playerId], 0)
if (itm != null) and IsUnitEnemy(GetDyingUnit(), Player(2)) and (GetUnitTypeId(GetDyingUnit()) != 'ngsp') and IsHeroKiller() and (BlzGetItemIntegerField(itm, ITEM_IF_MAX_HIT_POINTS) < 30) then
return true
endif
return false
endfunction
function Trig_WaffenZaehler_Actions takes nothing returns nothing
local integer playerId = GetConvertedPlayerId(GetOwningPlayer(GetKillingUnitBJ()))
local item itm = UnitItemInSlot(udg_ZRPGHeroAusr[playerId], 0)
// Verzögerung zum sicheren Abfragen, ob AX13 noch Cooldown hat
call TriggerSleepAction(0.50)
if (BlzGetUnitAbilityCooldownRemaining(udg_ZRPGHero[playerId], 'AX13') > 0.00) and (itm != null) then
call BlzSetItemIntegerField(itm, ITEM_IF_MAX_HIT_POINTS, BlzGetItemIntegerField(itm, ITEM_IF_MAX_HIT_POINTS) + 1)
call BlzSetItemExtendedTooltip(itm, BlzGetItemDescription(itm) + I2S(BlzGetItemIntegerField(itm, ITEM_IF_MAX_HIT_POINTS)))
endif
// Aufräumen
set itm = null
endfunction
//===========================================================================
function InitTrig_WaffenZaehler takes nothing returns nothing
set gg_trg_WaffenZaehler = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_WaffenZaehler, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(gg_trg_WaffenZaehler, Condition(function Trig_WaffenZaehler_Conditions))
call TriggerAddAction(gg_trg_WaffenZaehler, function Trig_WaffenZaehler_Actions)
endfunction
function Trig_WaffenSchwung_Conditions takes integer playerId returns boolean
return udg_BoolExtraDmg and BlzGetUnitAbilityCooldownRemaining(udg_ZRPGHero[playerId], 'AX13') == 0.00 and IsUnitAliveBJ(udg_ZRPGHero[playerId]) and not UnitHasBuffBJ(udg_UnitExtraDmg[playerId], 'Bpsh')
endfunction
function Trig_WaffenSchwung_Press takes nothing returns nothing
local integer playerId = GetConvertedPlayerId(GetTriggerPlayer())
local unit wsUnit = udg_ZRPGHero[playerId]
local real wsFacing = GetUnitFacing(wsUnit)
local real wsX = GetUnitX(wsUnit)
local real wsY = GetUnitY(wsUnit)
local real wsAttackX = wsX + 50.00 * Cos(wsFacing * bj_DEGTORAD)
local real wsAttackY = wsY + 50.00 * Sin(wsFacing * bj_DEGTORAD)
// Timer starten, wenn er noch nicht läuft
if TimerGetElapsed(udg_TimerDmg[playerId]) == 0.00 then
call TimerStart(udg_TimerDmg[playerId], 5.50, false, null)
endif
if udg_WaffenSchwungCounter[playerId] == 0.0 then
if BlzGetUnitAbilityCooldownRemaining(wsUnit, 'AX13') > 0.00 then
call IssueTargetOrder(wsUnit, "attack", udg_SelectUnit[playerId])
call BlzStartUnitAbilityCooldown(wsUnit, 'AX13', 1.50)
else
call IssuePointOrder(wsUnit, "carrionswarm", wsAttackX, wsAttackY)
endif
endif
if udg_BoolExtraDmg and udg_WaffenSchwungCounter[playerId] == 1.0 then
call SetUnitAnimation(wsUnit, "Stand Defend")
call IssueTargetOrder(gg_unit_n01A_0975, "slow", wsUnit)
endif
if udg_BoolExtraDmg and udg_WaffenSchwungCounter[playerId] == 6.0 then
call PlaySoundForSpecificPlayer(GetTriggerPlayer(), gg_snd_GoodJob)
call BlzSetUnitIntegerField(wsUnit, UNIT_IF_FORMATION_RANK, 1)
// Zeige Castbar individuell für den Spieler
if GetLocalPlayer() == GetTriggerPlayer() then
call BlzFrameSetVisible(CastbarExtra, true)
endif
endif
// Erhöhe den WaffenSchwungCounter um 0.1
set udg_WaffenSchwungCounter[playerId] = udg_WaffenSchwungCounter[playerId] + 0.1
// Speicher freigeben
set wsUnit = null
endfunction
function Trig_WaffenSchwung_Release takes nothing returns nothing
local integer playerId = GetConvertedPlayerId(GetTriggerPlayer())
local unit wsUnit = udg_ZRPGHero[playerId]
local real wsFacing = GetUnitFacing(wsUnit)
local real wsX = GetUnitX(wsUnit)
local real wsY = GetUnitY(wsUnit)
local real wsAttackX = wsX + 50.00 * Cos(wsFacing * bj_DEGTORAD)
local real wsAttackY = wsY + 50.00 * Sin(wsFacing * bj_DEGTORAD)
// Timer stoppen und zurücksetzen
call PauseTimer(udg_TimerDmg[playerId])
call DestroyTimer(udg_TimerDmg[playerId])
set udg_TimerDmg[playerId] = CreateTimer()
call IssuePointOrder(wsUnit, "carrionswarm", wsAttackX, wsAttackY)
// Speicher freigeben
set wsUnit = null
set udg_WaffenSchwungCounter[playerId] = 0
endfunction
//===========================================================================
function InitTrig_WaffenSchwung takes nothing returns nothing
local integer index = 0
local trigger trigRelease = CreateTrigger()
set gg_trg_WaffenSchwung = CreateTrigger()
call TriggerAddAction(gg_trg_WaffenSchwung, function Trig_WaffenSchwung_Press)
call TriggerAddAction(trigRelease, function Trig_WaffenSchwung_Release)
loop
exitwhen index >= bj_MAX_PLAYERS
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_WaffenSchwung, Player(index), OSKEY_E, 0, true) //Taste drücken oder dauerdruck
call BlzTriggerRegisterPlayerKeyEvent(trigRelease, Player(index), OSKEY_E, 0, false) //Release / Tasten loslassen
set index = index + 1
endloop
endfunction
function Trig_WaffenSchwung2_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'AX13'
endfunction
function Trig_WaffenSchwung2_Actions takes nothing returns nothing
local unit caster = GetSpellAbilityUnit()
local location pointAttack = GetSpellTargetLoc()
local integer playerId = GetConvertedPlayerId(GetTriggerPlayer())
local integer totalDmg = ZRPGDmg(playerId, caster)
local real range = 80.00
local real damageRadius
local integer i = 1 // Startet bei 1, weil Level 0 nicht genutzt wird
local ability casterAbility = BlzGetUnitAbility(caster, 'AX13') // Speichert die Fähigkeit einmalig
// Spezialangriff: Formation_Rank == 1
if BlzGetUnitIntegerField(caster, UNIT_IF_FORMATION_RANK) == 1 then
set range = 170.00
set totalDmg = totalDmg * 5
set damageRadius = 140.00
call SetUnitAnimation(caster, "attack slam")
call QueueUnitAnimation(caster, "stand")
else
set damageRadius = 110.00
endif
loop
exitwhen i > 5
call BlzSetAbilityRealLevelFieldBJ(casterAbility, ABILITY_RLF_DISTANCE_UCS3, i, range)
set i = i + 1
endloop
call UnitDamagePointLoc(caster, 0, damageRadius, pointAttack, I2R(totalDmg), ATTACK_TYPE_SIEGE, DAMAGE_TYPE_NORMAL)
call UnitRemoveBuffBJ('Bslo', caster)
call BlzSetUnitIntegerField(caster, UNIT_IF_FORMATION_RANK, 0)
call IssuePointOrderLocBJ(gg_unit_n019_0974, "flamestrike", pointAttack)
// Castbar ausblenden (nur lokal für zaubernden Spieler)
if GetLocalPlayer() == GetTriggerPlayer() then
call BlzFrameSetVisible(CastbarExtra, false)
endif
call RemoveLocation(pointAttack)
set caster = null
endfunction
//===========================================================================
function InitTrig_WaffenSchwung2 takes nothing returns nothing
set gg_trg_WaffenSchwung2 = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_WaffenSchwung2, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(gg_trg_WaffenSchwung2, Condition(function Trig_WaffenSchwung2_Conditions))
call TriggerAddAction(gg_trg_WaffenSchwung2, function Trig_WaffenSchwung2_Actions)
endfunction
function Trig_WaffenSchwung3_Conditions takes nothing returns boolean
local unit caster = GetSpellAbilityUnit()
local real x1 = GetUnitX(caster)
local real y1 = GetUnitY(caster)
local real x2 = GetSpellTargetX()
local real y2 = GetSpellTargetY()
local real dx = x2 - x1
local real dy = y2 - y1
local real distanceSquared = dx * dx + dy * dy
if GetSpellAbilityId() != 'AX11' then
return false
endif
if distanceSquared >= 160000.00 then
return false
endif
return true
endfunction
function Trig_WaffenSchwung3_Actions takes nothing returns nothing
local unit caster = GetSpellAbilityUnit()
local unit target = GetSpellTargetUnit()
local integer playerId = GetConvertedPlayerId(GetTriggerPlayer())
local integer damage = ZRPGDmg(playerId, caster) / 5
call UnitDamageTarget(caster, target, I2R(damage), true, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
set caster = null
set target = null
endfunction
//===========================================================================
function InitTrig_WaffenSchwung3 takes nothing returns nothing
set gg_trg_WaffenSchwung3 = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_WaffenSchwung3, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(gg_trg_WaffenSchwung3, Condition(function Trig_WaffenSchwung3_Conditions))
call TriggerAddAction(gg_trg_WaffenSchwung3, function Trig_WaffenSchwung3_Actions)
endfunction
function IsWaffenWirbelSpell takes nothing returns boolean
local integer spellId = GetSpellAbilityId()
return spellId == 'AHtc' or spellId == 'ACt2'
endfunction
function Trig_WaffenWirbel_Actions takes nothing returns nothing
local integer spellId = GetSpellAbilityId()
local unit caster = GetSpellAbilityUnit()
local location casterLoc = GetUnitLoc(caster)
local integer playerId = GetConvertedPlayerId(GetOwningPlayer(caster))
local item casterItem = UnitItemInSlot(udg_ZRPGHeroAusr[playerId], 1)
local integer abilityLevel = GetUnitAbilityLevelSwapped(spellId, caster)
local integer baseDmg = BlzGetUnitBaseDamage(caster, 0) + BlzGetItemIntegerField(casterItem, ITEM_IF_PRIORITY)
local integer totalDmg = baseDmg * abilityLevel // Verstärkung: Schaden skaliert mit Level
// Flächenschaden am Standort des Casters
call UnitDamagePointLoc(caster, 0, 160.00, casterLoc, I2R(totalDmg), ATTACK_TYPE_SIEGE, DAMAGE_TYPE_NORMAL)
// Zauber basierend auf Spell-ID auslösen
if spellId == 'ACt2' then
call IssueTargetOrder(gg_unit_n01A_0975, "cyclone", caster)
else
call IssuePointOrderLoc(gg_unit_n01A_0975, "flamestrike", casterLoc)
endif
// Speicherbereinigung
call RemoveLocation(casterLoc)
set casterItem = null
set caster = null
endfunction
//===========================================================================
function InitTrig_WaffenWirbel takes nothing returns nothing
set gg_trg_WaffenWirbel = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_WaffenWirbel, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(gg_trg_WaffenWirbel, Condition(function IsWaffenWirbelSpell))
call TriggerAddAction(gg_trg_WaffenWirbel, function Trig_WaffenWirbel_Actions)
endfunction
// ---------------------------
// Überprüft: Nur Held, Fähigkeit 'A02R'
// ---------------------------
function Trig_RechtsKlick_Conditions takes nothing returns boolean
if GetPlayerController(GetOwningPlayer(GetSpellAbilityUnit())) != MAP_CONTROL_USER then
return false
endif
if not IsUnitType(GetSpellAbilityUnit(), UNIT_TYPE_HERO) then
return false
endif
if GetSpellAbilityId() != 'A02R' then
return false
endif
return true
endfunction
// ---------------------------
// Prüft, ob Item = Powerup Level 1 -> Anti Item RPG Bug !
// ---------------------------
function IsPowerupItem takes item itm returns boolean
return (GetItemType(itm) == ITEM_TYPE_POWERUP) and (BlzGetItemIntegerField(itm, ITEM_IF_LEVEL) == 1)
endfunction
// ---------------------------
// Prüft, ob Item am Boden
// ---------------------------
function IsItemUnowned takes item itm returns boolean
return not CheckItemStatus(itm, bj_ITEM_STATUS_OWNED)
endfunction
// ---------------------------
// Enum-Callback, wird für jedes gefundene Item aufgerufen
// Hebt Item mit gCaster auf, falls kein Powerup-Bug
// ---------------------------
function Trig_RechtsKlick_PickItem takes nothing returns nothing
local item itm = GetEnumItem()
if IsItemUnowned(itm) then
if not IsPowerupItem(itm) then
call UnitAddItemSwapped(itm, gCaster)
endif
// CD für 'AX06' auf 1 Sekunde
call BlzStartUnitAbilityCooldown(gCaster, 'AX06', 1.00)
endif
set itm = null
endfunction
// ---------------------------
// Reichweitenprüfung (250 AoE)
// ---------------------------
function IsWithinRange takes unit caster, real x, real y returns boolean
local real dx = GetUnitX(caster) - x
local real dy = GetUnitY(caster) - y
return (dx * dx + dy * dy) <= 62500.00 // 250 * 250
endfunction
// ---------------------------
// Hauptroutine:
// - Items aufheben in definierter Rect
// - zufällige Einheit für "eattree" anvisieren
// ---------------------------
function Trig_RechtsKlick_Actions takes nothing returns nothing
local unit caster = GetSpellAbilityUnit()
local real targetX = GetSpellTargetX()
local real targetY = GetSpellTargetY()
local group wsGroup = CreateGroup()
local unit tempUnit
local rect pickRect
local real size = 100.0 // Radius um das Ziel,
// 1) Globalen (unit gCaster = null), damit Enum-Callback weiß, wer Items aufhebt
set gCaster = caster
// 2) Gruppe naheliegender Einheiten (Radius 50) ermitteln für eattree!
call GroupClear(wsGroup)
set wsGroup = GetUnitsInRangeOfLocAll(50.0, Location(targetX, targetY))
// 3) Zufällig eine Einheit nehmen aus Gruppe
set tempUnit = FirstOfGroup(wsGroup)
// 4) Rechteck um (targetX, targetY) herum mit definierter Größe für alle Items darin
set pickRect = Rect(targetX - size, targetY - size, targetX + size, targetY + size)
// 5) Falls Caster in Reichweite <= 250 / Items in pickRect durchgehen -> Trig_RechtsKlick_PickItem
if IsWithinRange(caster, targetX, targetY) then
call EnumItemsInRectBJ(pickRect, function Trig_RechtsKlick_PickItem)
endif
call IssueTargetOrderBJ(caster, "eattree", tempUnit)
call RemoveRect(pickRect)
set pickRect = null
call DestroyGroup(wsGroup)
set wsGroup = null
set tempUnit = null
set gCaster = null
endfunction
// ---------------------------
// Initialisierung
// ---------------------------
function InitTrig_RechtsKlick takes nothing returns nothing
set gg_trg_RechtsKlick = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_RechtsKlick, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(gg_trg_RechtsKlick, Condition(function Trig_RechtsKlick_Conditions))
call TriggerAddAction(gg_trg_RechtsKlick, function Trig_RechtsKlick_Actions)
endfunction
//===========================================================================
// Prüft, ob das Spell-Ziel "interagierbar" ist (eine bestimmte Unit, ein nicht verstecktes Item oder ein lebendes Destructable).
function Interagieren_IsTargetInteractable takes nothing returns boolean
local unit u = GetSpellTargetUnit()
local item it = GetSpellTargetItem()
local destructable d = GetSpellTargetDestructable()
// 1) Bestimmte Einheiten: 'hrdh', 'nfrt', 'h00G', 'h00F', 'nnsa'
if (u != null) and (GetUnitTypeId(u) == 'hrdh' or GetUnitTypeId(u) == 'nfrt' or GetUnitTypeId(u) == 'h00G' or GetUnitTypeId(u) == 'h00F' or GetUnitTypeId(u) == 'nnsa') then
return true
endif
// 2) Item vorhanden und nicht versteckt
if (it != null) and (not IsItemHiddenBJ(it)) then
return true
endif
// 3) Destructable vorhanden und lebendig
if (d != null) and IsDestructableAliveBJ(d) then
return true
endif
return false
endfunction
//===========================================================================
// Prüft, ob die gewirkte Fähigkeit die richtige (AX06) ist und das Ziel "interagierbar".
function Interagieren_Conditions takes nothing returns boolean
if (GetSpellAbilityId() != 'AX06') then
return false
endif
if not Interagieren_IsTargetInteractable() then
return false
endif
return true
endfunction
//===========================================================================
// Prüft, ob das Item 'kysn' beim Caster mehr als 1 Aufladung hat.
function Interagieren_HasMultipleCharges takes nothing returns boolean
local unit caster = GetSpellAbilityUnit()
local item kysn = GetItemOfTypeFromUnitBJ(caster, 'kysn')
return (GetItemCharges(kysn) > 1)
endfunction
//===========================================================================
// Prüft, ob das Ziel die Einheit 'hrdh' ist.
function Interagieren_TargetIsHrdh takes nothing returns boolean
return (GetUnitTypeId(GetSpellTargetUnit()) == 'hrdh')
endfunction
//===========================================================================
// Prüft, ob das Zieleinheit eine von drei Spezial-Nfrt-Einheiten ist (gg_unit_nfrt_1361 / 1362 / 1491).
function Interagieren_TargetIsSpecialNfrt takes nothing returns boolean
local unit u = GetSpellTargetUnit()
if (u == gg_unit_nfrt_1361) or (u == gg_unit_nfrt_1362) or (u == gg_unit_nfrt_1491) then
return true
endif
return false
endfunction
//===========================================================================
// Prüft, ob der Caster das Item 'kysn' besitzt, ob das Ziel mechanisch ist und eine der Spezial-Nfrt-Einheiten.
function Interagieren_CanRepairSpecialNfrt takes nothing returns boolean
local unit caster = GetSpellAbilityUnit()
local unit target = GetSpellTargetUnit()
if not UnitHasItemOfTypeBJ(caster, 'kysn') then
return false
endif
if not IsUnitType(target, UNIT_TYPE_MECHANICAL) then
return false
endif
if not Interagieren_TargetIsSpecialNfrt() then
return false
endif
return true
endfunction
//===========================================================================
// Prüft, ob das Zieleinheit 'nfrt' ist, mechanisch ist und KEIN Peon.
function Interagieren_TargetIsNfrtMechNotPeon takes nothing returns boolean
local unit target = GetSpellTargetUnit()
if (GetUnitTypeId(target) != 'nfrt') then
return false
endif
if not IsUnitType(target, UNIT_TYPE_MECHANICAL) then
return false
endif
if IsUnitType(target, UNIT_TYPE_PEON) then
return false
endif
return true
endfunction
//===========================================================================
// Prüft, ob das Zieleinheit 'nfrt' ist, aber NICHT mechanisch und KEIN Peon.
function Interagieren_TargetIsNfrtNotMechNotPeon takes nothing returns boolean
local unit target = GetSpellTargetUnit()
if (GetUnitTypeId(target) != 'nfrt') then
return false
endif
if IsUnitType(target, UNIT_TYPE_MECHANICAL) then
return false
endif
if IsUnitType(target, UNIT_TYPE_PEON) then
return false
endif
return true
endfunction
//===========================================================================
// Prüft, ob das Destructable am Leben ist.
function Interagieren_DestructableAlive takes nothing returns boolean
return IsDestructableAliveBJ(GetSpellTargetDestructable())
endfunction
//===========================================================================
// Prüft, ob ein Item existiert und nicht versteckt ist.
function Interagieren_ItemNotHidden takes nothing returns boolean
local item it = GetSpellTargetItem()
return (it != null) and (not IsItemHiddenBJ(it))
endfunction
//===========================================================================
// Prüft, ob die Zieleinheit NICHT 'hrdh' ist.
function Interagieren_TargetNotHrdh takes nothing returns boolean
return (GetUnitTypeId(GetSpellTargetUnit()) != 'hrdh')
endfunction
//===========================================================================
// Haupt-Aktion: Reparieren / Tür öffnen / Tür schließen / Items entfernen / Animationen
function Interagieren_Actions takes nothing returns nothing
local unit caster = GetSpellAbilityUnit()
local unit target = GetSpellTargetUnit()
local item kysnItem
local integer i = 1
// (1) Reparieren von Spezial-Nfrt-Einheiten per 'kysn'
if Interagieren_CanRepairSpecialNfrt() then
set kysnItem = GetItemOfTypeFromUnitBJ(caster, 'kysn')
// Falls 'kysn' mehr als 1 Ladung hat, -1 abziehen. Ansonsten Item entfernen.
if Interagieren_HasMultipleCharges() then
call SetItemCharges(kysnItem, GetItemCharges(kysnItem) - 1)
else
call RemoveItem(kysnItem)
endif
// Entferne PEON-Typ von der Zieleinheit
call UnitRemoveTypeBJ(UNIT_TYPE_PEON, target)
// (2) Wenn das Ziel 'hrdh' ist, alle Items in den Slots 1..6 entfernen
elseif Interagieren_TargetIsHrdh() then
loop
exitwhen i > 6
call UnitRemoveItemFromSlotSwapped(i, target)
set i = i + 1
endloop
endif
// (3) Türlogik
// -> "Nfrt nicht mechanisch" => Tür stand / Fähigkeit Aeth entfernen
// -> "Nfrt mechanisch" => Tür Death Alternate / Fähigkeit Aeth geben
if Interagieren_TargetIsNfrtNotMechNotPeon() then
// "Non Mechanical" = Tür offen -> Schließe Tür!
call SetUnitAnimation(target, "stand")
call UnitAddTypeBJ(UNIT_TYPE_MECHANICAL, target)
call UnitRemoveAbilityBJ('Aeth', target)
elseif Interagieren_TargetIsNfrtMechNotPeon() then
// "Mechanical" = Tür geschlossen -> Öffne Tür!
call SetUnitAnimation(target, "Death Alternate")
call UnitRemoveTypeBJ(UNIT_TYPE_MECHANICAL, target)
call UnitAddAbilityBJ('Aeth', target)
else
// (4) Sonstige Fälle
// -> Destructable lebendig -> Caster animiert Angriffsanimation
// -> Item nicht versteckt -> "smart" Order auf Item
// -> Ziel nicht 'hrdh' -> "move" Order auf Zieleinheit
if Interagieren_DestructableAlive() then
call SetUnitAnimation(caster, "attack")
call QueueUnitAnimationBJ(caster, "stand")
elseif Interagieren_ItemNotHidden() then
call IssueTargetItemOrder(caster, "smart", GetSpellTargetItem())
elseif Interagieren_TargetNotHrdh() then
call IssueTargetOrderBJ(caster, "move", target)
endif
endif
endfunction
//===========================================================================
// Trigger-Initialisierung
function InitTrig_Interagieren1 takes nothing returns nothing
set gg_trg_Interagieren1 = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Interagieren1, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(gg_trg_Interagieren1, Condition(function Interagieren_Conditions))
call TriggerAddAction(gg_trg_Interagieren1, function Interagieren_Actions)
endfunction
// -------------------------------------------
// Hilfsfunktionen
// -------------------------------------------
function IsPermanentOrArtifact takes item it returns boolean
local itemtype itType = GetItemType(it)
return (itType == ITEM_TYPE_PERMANENT) or (itType == ITEM_TYPE_ARTIFACT)
endfunction
function IsRealPlayerHero takes unit u returns boolean
return (GetPlayerController(GetOwningPlayer(u)) == MAP_CONTROL_USER) and IsUnitType(u, UNIT_TYPE_HERO)
endfunction
function IsNotBuilding takes unit u returns boolean
return not IsUnitType(u, UNIT_TYPE_STRUCTURE)
endfunction
// ------------------------------------------------------------------------
// NEU: Prüft, ob im Dummy-Helden bereits ein Ring dieses "rawcodes" liegt
// ------------------------------------------------------------------------
function AlreadyHasRingOfSameType takes unit heroDummy, integer itemId returns boolean
local integer i = 4
local item slotItem
loop
exitwhen i > 6
set slotItem = UnitItemInSlotBJ(heroDummy, i)
if slotItem != null then
// Vergleiche Rawcode
if GetItemTypeId(slotItem) == itemId then
return true
endif
endif
set i = i + 1
endloop
return false
endfunction
// -------------------------------------------
// Haupt-Conditions
// -------------------------------------------
function InventarZuAusruestung_Conditions takes nothing returns boolean
local unit manipUnit = GetManipulatingUnit()
local item usedItem = GetManipulatedItem()
// 1) Nur menschl. Spielerhelden
if not IsRealPlayerHero(manipUnit) then
return false
endif
// 2) Item muss permanent oder artifact sein
if not IsPermanentOrArtifact(usedItem) then
return false
endif
return true
endfunction
// -------------------------------------------
// Aktionen
// -------------------------------------------
function InventarZuAusruestung_Actions takes nothing returns nothing
local unit manipUnit = GetManipulatingUnit()
local player p = GetOwningPlayer(manipUnit)
local integer pid = GetConvertedPlayerId(p)
local unit heroReal = udg_ZRPGHero[pid] // ECHTER Held
local unit heroDummy = udg_ZRPGHeroAusr[pid] // Dummy (Ausrüstungshalter)
local item it = GetManipulatedItem()
local integer rawcode = GetItemTypeId(it)
// Sicherheitshalber auf 1 setzen
call SetItemCharges(it, 1)
// Held -> Dummy (wenn "manipUnit" KEIN Gebäude ist)
if IsNotBuilding(manipUnit) then
// 1) Waffen-Slot (Slot #1) leer, Item ist PERMANENT?
if (UnitItemInSlotBJ(heroDummy, 1) == null) and (GetItemType(it) == ITEM_TYPE_PERMANENT) then
call UnitAddItemSwapped(it, heroDummy)
call UnitDropItemSlotBJ(heroDummy, it, 1)
call SetItemDroppableBJ(it, false)
// 2) Rüstungs-Slot (Slot #2) leer, Item ist ARTIFACT + Priority=2?
elseif (UnitItemInSlotBJ(heroDummy, 2) == null) and (GetItemType(it) == ITEM_TYPE_ARTIFACT) and (BlzGetItemIntegerField(it, ITEM_IF_PRIORITY) == 2) then
call UnitAddItemSwapped(it, heroDummy)
call UnitDropItemSlotBJ(heroDummy, it, 2)
call SetItemDroppableBJ(it, false)
// 3) Helm-Slot (Slot #3) leer, Item ist ARTIFACT + Priority=3?
elseif (UnitItemInSlotBJ(heroDummy, 3) == null) and (GetItemType(it) == ITEM_TYPE_ARTIFACT) and (BlzGetItemIntegerField(it, ITEM_IF_PRIORITY) == 3) then
call UnitAddItemSwapped(it, heroDummy)
call UnitDropItemSlotBJ(heroDummy, it, 3)
call SetItemDroppableBJ(it, false)
// 4) Ring-Slot (Slot #4) leer, Item = ARTIFACT + Priority=4?
// & Prüfe, ob NICHT schon derselbe Ringtyp vorhanden ist
elseif (UnitItemInSlotBJ(heroDummy, 4) == null) and (GetItemType(it) == ITEM_TYPE_ARTIFACT) and (BlzGetItemIntegerField(it, ITEM_IF_PRIORITY) == 4) and (not AlreadyHasRingOfSameType(heroDummy, rawcode)) then
call UnitAddItemSwapped(it, heroDummy)
call UnitDropItemSlotBJ(heroDummy, it, 4)
call SetItemDroppableBJ(it, false)
// 5) Ring-Slot (Slot #5) leer, Item = ARTIFACT + Priority=4?
elseif (UnitItemInSlotBJ(heroDummy, 5) == null) and (GetItemType(it) == ITEM_TYPE_ARTIFACT) and (BlzGetItemIntegerField(it, ITEM_IF_PRIORITY) == 4) and (not AlreadyHasRingOfSameType(heroDummy, rawcode)) then
call UnitAddItemSwapped(it, heroDummy)
call UnitDropItemSlotBJ(heroDummy, it, 5)
call SetItemDroppableBJ(it, false)
// 6) Ring-Slot (Slot #6) leer, Item = ARTIFACT + Priority=4?
elseif (UnitItemInSlotBJ(heroDummy, 6) == null) and (GetItemType(it) == ITEM_TYPE_ARTIFACT) and (BlzGetItemIntegerField(it, ITEM_IF_PRIORITY) == 4) and (not AlreadyHasRingOfSameType(heroDummy, rawcode)) then
call UnitAddItemSwapped(it, heroDummy)
call UnitDropItemSlotBJ(heroDummy, it, 6)
call SetItemDroppableBJ(it, false)
else
// Falls keiner der Slots passt oder bereits ein identischer Ring vorhanden ist, mach nichts
endif
// Dummy -> Held
else
// Waffe zurück zum Held (wenn PERMANENT)
if (GetItemType(it) == ITEM_TYPE_PERMANENT) then
call UnitAddItemSwapped(it, heroReal)
call SetItemDroppableBJ(it, true)
// Rüstung zurück (Priority=2)
elseif (GetItemType(it) == ITEM_TYPE_ARTIFACT) and (BlzGetItemIntegerField(it, ITEM_IF_PRIORITY) == 2) then
call UnitAddItemSwapped(it, heroReal)
call SetItemDroppableBJ(it, true)
// Helm zurück (Priority=3)
elseif (GetItemType(it) == ITEM_TYPE_ARTIFACT) and (BlzGetItemIntegerField(it, ITEM_IF_PRIORITY) == 3) then
call UnitAddItemSwapped(it, heroReal)
call SetItemDroppableBJ(it, true)
// Ringe zurück (Priority=4)
elseif (GetItemType(it) == ITEM_TYPE_ARTIFACT) and (BlzGetItemIntegerField(it, ITEM_IF_PRIORITY) == 4) then
call UnitAddItemSwapped(it, heroReal)
call SetItemDroppableBJ(it, true)
else
// Nichts
endif
endif
endfunction
// -------------------------------------------
// Trigger-Init
// -------------------------------------------
function InitTrig_InventarZuAusruestung takes nothing returns nothing
set gg_trg_InventarZuAusruestung = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_InventarZuAusruestung, EVENT_PLAYER_UNIT_USE_ITEM)
call TriggerAddCondition(gg_trg_InventarZuAusruestung, Condition(function InventarZuAusruestung_Conditions))
call TriggerAddAction(gg_trg_InventarZuAusruestung, function InventarZuAusruestung_Actions)
endfunction
//===========================================================================
// AusruestungMaster (vereint Ringe, Waffen, Rüstungen & Helme)
// Basierend auf deinem alten Nebencode - mit Priority=2(Rüstung), 3(Helm), 4(Ring), PERMANENT=Weapon
//===========================================================================
// -------------------------------------------
// Prüft, ob manipulierende Einheit ein Gebäude (Dummy) ist
// -------------------------------------------
function IsDummyStructure takes unit u returns boolean
return IsUnitType(u, UNIT_TYPE_STRUCTURE)
endfunction
// -------------------------------------------
// A) WAFFEN => itemType = PERMANENT
// -------------------------------------------
function ApplyWeapon takes item it, unit hero returns nothing
local boolean equipOn = not IsItemInvulnerable(it)
local integer raw = GetItemTypeId(it)
local integer wpnBonus = BlzGetItemIntegerField(it, ITEM_IF_PRIORITY) // Bonus-Schaden
local real oldManaPct = GetUnitManaPercent(hero)
local integer pid = GetConvertedPlayerId(GetTriggerPlayer())
// 1) Angriffswert anpassen
if equipOn then
set udg_IntegerAngriffskraft[pid] = BlzGetUnitWeaponIntegerField(hero, UNIT_WEAPON_IF_ATTACK_DAMAGE_BASE, 1)
call BlzSetUnitWeaponIntegerFieldBJ(hero, UNIT_WEAPON_IF_ATTACK_DAMAGE_BASE, 1, udg_IntegerAngriffskraft[pid] + wpnBonus)
else
set udg_IntegerAngriffskraft[pid] = BlzGetUnitWeaponIntegerField(hero, UNIT_WEAPON_IF_ATTACK_DAMAGE_BASE, 1)
call BlzSetUnitWeaponIntegerFieldBJ(hero, UNIT_WEAPON_IF_ATTACK_DAMAGE_BASE, 1, udg_IntegerAngriffskraft[pid] - wpnBonus)
endif
// 2) Waffentypen anhand RAWCODE
if (raw == 'rump') then
// 1. Spitzhacke *
if equipOn then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A038', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A038', hero)
endif
elseif (raw == 'mlst') then
// 2. Holzfäller-Axt *
if equipOn then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A03O', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A03O', hero)
endif
elseif (raw == 'rat3') then
// 3. WC2-Schwert *
if equipOn then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A03N', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A03N', hero)
endif
elseif (raw == 'asbl') then
// 4. Kampfaxt *
if equipOn then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A03M', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A03M', hero)
endif
elseif (raw == 'srtl') then
// 5. WC2 Grunzer-Axt *
if equipOn then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A03Q', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A03Q', hero)
endif
elseif (raw == 'frhg') then
// 6. Hordenmacht *
if equipOn then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A03R', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A03R', hero)
endif
elseif (raw == 'rat9') then
// 7. Vergeltung *
if equipOn then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A03P', hero)
call UnitAddAbilityBJ('A048', hero)
call BlzSetAbilityRealLevelFieldBJ( BlzGetUnitAbility(hero, 'AIev'), ABILITY_RLF_CHANCE_TO_EVADE_EEV1, 0, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, hero, true)) / 200.00 )
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A03P', hero)
call UnitRemoveAbilityBJ('A048', hero)
call BlzSetAbilityRealLevelFieldBJ( BlzGetUnitAbility(hero, 'AIev'), ABILITY_RLF_CHANCE_TO_EVADE_EEV1, 0, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, hero, true)) / 200.00 )
endif
// Mana-Limit für alle != Player(4)
if (GetOwningPlayer(GetTriggerUnit()) != Player(4)) then
call BlzSetUnitMaxMana(hero, 100)
call SetUnitManaPercentBJ(hero, oldManaPct)
endif
elseif (raw == 'frgd') then
// 8. Bronzeschwert *
if equipOn then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A03S', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A03S', hero)
endif
elseif (raw == 'rst1') then
// 9. Schmiedehammer *
if equipOn then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A03X', hero)
call UnitAddAbilityBJ('A045', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A03X', hero)
call UnitRemoveAbilityBJ('A045', hero)
endif
elseif (raw == 'lhst') then
// 10. Berserker-Axt *
if equipOn then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A03B', hero)
call UnitAddAbilityBJ('A04A', hero)
call BlzSetAbilityRealLevelFieldBJ( BlzGetUnitAbility(hero, 'AIev'), ABILITY_RLF_CHANCE_TO_EVADE_EEV1, 0, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, hero, true)) / 200.00 )
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A03B', hero)
call UnitRemoveAbilityBJ('A04A', hero)
call BlzSetAbilityRealLevelFieldBJ( BlzGetUnitAbility(hero, 'AIev'), ABILITY_RLF_CHANCE_TO_EVADE_EEV1, 0, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, hero, true)) / 200.00 )
endif
elseif (raw == 'ratc') then
// 11. Scharfklinge *
if equipOn then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A03V', hero)
call UnitAddAbilityBJ('A049', hero)
call BlzSetAbilityRealLevelFieldBJ( BlzGetUnitAbility(hero, 'AIev'), ABILITY_RLF_CHANCE_TO_EVADE_EEV1, 0, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, hero, true)) / 200.00 )
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A03V', hero)
call UnitRemoveAbilityBJ('A049', hero)
call BlzSetAbilityRealLevelFieldBJ( BlzGetUnitAbility(hero, 'AIev'), ABILITY_RLF_CHANCE_TO_EVADE_EEV1, 0, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, hero, true)) / 200.00 )
endif
if (GetOwningPlayer(GetTriggerUnit()) != Player(4)) then
call BlzSetUnitMaxMana(hero, 100)
call SetUnitManaPercentBJ(hero, oldManaPct)
endif
elseif (raw == 'ratf') then
// 12. Nagelbrett *
if equipOn then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A02G', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A02G', hero)
endif
elseif (raw == 'rwiz') then
// 13. Stab der Inspiration
if equipOn then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A03T', hero)
call UnitAddAbilityBJ('A047', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A03T', hero)
call UnitRemoveAbilityBJ('A047', hero)
endif
if (GetOwningPlayer(GetTriggerUnit()) != Player(4)) then
call BlzSetUnitMaxMana(hero, 100)
call SetUnitManaPercentBJ(hero, oldManaPct)
endif
elseif (raw == 'kpin') then
// 14. Piratensäbel
if equipOn then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A044', hero)
call UnitAddAbilityBJ('A046', hero)
call BlzSetAbilityRealLevelFieldBJ( BlzGetUnitAbility(hero, 'AIev'), ABILITY_RLF_CHANCE_TO_EVADE_EEV1, 0, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, hero, true)) / 200.00 )
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A044', hero)
call UnitRemoveAbilityBJ('A046', hero)
call BlzSetAbilityRealLevelFieldBJ( BlzGetUnitAbility(hero, 'AIev'), ABILITY_RLF_CHANCE_TO_EVADE_EEV1, 0, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, hero, true)) / 200.00 )
endif
if (GetOwningPlayer(GetTriggerUnit()) != Player(4)) then
call BlzSetUnitMaxMana(hero, 100)
call SetUnitManaPercentBJ(hero, oldManaPct)
endif
else
// Unbekannte Waffe
endif
set oldManaPct = 0
endfunction
// -------------------------------------------
// B) RINGE => itemType = ARTIFACT, priority=4
// -------------------------------------------
function ApplyRing takes item it, unit hero returns nothing
local integer raw = GetItemTypeId(it)
local boolean vulnerable = not IsItemInvulnerable(it)
local real oldManaPct
if (raw == 'lnrn') then
// 1. Löwenring
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('AIs1', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('AIs1', hero)
endif
elseif (raw == 'brag') then
// 2. Wolfsring
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('AIa1', hero)
call BlzSetAbilityRealLevelFieldBJ( BlzGetUnitAbility(hero, 'AIev'), ABILITY_RLF_CHANCE_TO_EVADE_EEV1, 0, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, hero, true)) / 200.00 )
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('AIa1', hero)
call BlzSetAbilityRealLevelFieldBJ( BlzGetUnitAbility(hero, 'AIev'), ABILITY_RLF_CHANCE_TO_EVADE_EEV1, 0, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, hero, true)) / 200.00 )
endif
elseif (raw == 'drph') then
// 3. Eulenring
set oldManaPct = GetUnitManaPercent(hero)
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('AIi1', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('AIi1', hero)
endif
if (GetOwningPlayer(GetTriggerUnit()) != Player(4)) then
call BlzSetUnitMaxMana(hero, 100)
call SetUnitManaPercentBJ(hero, oldManaPct)
endif
set oldManaPct = 0
elseif (raw == 'rde0') then
// 4. Rüstung +1 Ring
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('AId1', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('AId1', hero)
endif
elseif (raw == 'rde1') then
// 5. Rüstung +2 Ring
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('AId2', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('AId2', hero)
endif
elseif (raw == 'rde2') then
// 6. Rüstung +3 Ring
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('AId3', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('AId3', hero)
endif
elseif (raw == 'brac') then
// 7. Rüstung Runen-Ring
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('AIsr', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('AIsr', hero)
endif
elseif (raw == 'rlif') then
// 8. Regenerations Ring
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('Arel', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('Arel', hero)
endif
else
// Kein bekannter Ring
endif
endfunction
// ---------------------------------------------------------
// C) RÜSTUNGEN => itemType=ARTIFACT, priority=2
// ---------------------------------------------------------
function ApplyArmor takes item it, unit hero returns nothing
local integer raw = GetItemTypeId(it)
local boolean vulnerable = not IsItemInvulnerable(it)
local real oldManaPct = GetUnitManaPercent(hero)
if (raw == 'prvt') then
// 1. Vitalität R.
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A01C', hero)
call UnitAddAbilityBJ('A02E', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A01C', hero)
call UnitRemoveAbilityBJ('A02E', hero)
endif
elseif (raw == 'clfm') then
// 2. Drachenleder R.
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A01I', hero)
call UnitAddAbilityBJ('AIcf', hero)
call BlzUnitHideAbility(hero, 'AIcf', true)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A01I', hero)
call UnitRemoveAbilityBJ('AIcf', hero)
endif
elseif (raw == 'pmna') then
// 3. Magistrat R.
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('AId7', hero)
call UnitAddAbilityBJ('AIi3', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('AId7', hero)
call UnitRemoveAbilityBJ('AIi3', hero)
endif
if (GetOwningPlayer(GetTriggerUnit()) != Player(4)) then
call BlzSetUnitMaxMana(hero, 100)
call SetUnitManaPercentBJ(hero, oldManaPct)
endif
elseif (raw == 'spsh') then
// 4. Horden R.
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A01W', hero)
call UnitAddAbilityBJ('AIx3', hero)
call BlzSetAbilityRealLevelFieldBJ( BlzGetUnitAbility(hero, 'AIev'), ABILITY_RLF_CHANCE_TO_EVADE_EEV1, 0, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, hero, true)) / 200.00 )
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A01W', hero)
call UnitRemoveAbilityBJ('AIx3', hero)
call BlzSetAbilityRealLevelFieldBJ( BlzGetUnitAbility(hero, 'AIev'), ABILITY_RLF_CHANCE_TO_EVADE_EEV1, 0, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, hero, true)) / 200.00 )
endif
if (GetOwningPlayer(GetTriggerUnit()) != Player(4)) then
call BlzSetUnitMaxMana(hero, 100)
call SetUnitManaPercentBJ(hero, oldManaPct)
endif
elseif (raw == 'blba') then
// 5. Klingenbann R.
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('AId8', hero)
call UnitAddAbilityBJ('AIx5', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('AId8', hero)
call UnitRemoveAbilityBJ('AIx5', hero)
endif
if (GetOwningPlayer(GetTriggerUnit()) != Player(4)) then
call BlzSetUnitMaxMana(hero, 100)
call SetUnitManaPercentBJ(hero, oldManaPct)
endif
elseif (raw == 'rde3') then
// 6. Hartleder R.
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('AId4', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('AId4', hero)
endif
elseif (raw == 'hcun') then
// 7. Eisenschmiede R.
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('AId0', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('AId0', hero)
endif
elseif (raw == 'sksh') then
// 8. Leder R.
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A01G', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A01G', hero)
endif
elseif (raw == 'rin1') then
// 9. Eisen R.
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A01N', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A01N', hero)
endif
elseif (raw == 'anfg') then
// 10. Zauberschutz R.
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('AId5', hero)
call UnitAddAbilityBJ('ANss', hero)
call BlzUnitHideAbility(hero, 'ANss', true)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('AId5', hero)
call UnitRemoveAbilityBJ('ANss', hero)
endif
else
// Nichts sonst
endif
set oldManaPct = 0
endfunction
// ---------------------------------------------------------
// D) HELME => itemType=ARTIFACT, priority=3
// ---------------------------------------------------------
function ApplyHelmet takes item it, unit hero returns nothing
local integer raw = GetItemTypeId(it)
local boolean vulnerable = not IsItemInvulnerable(it)
local real oldManaPct = GetUnitManaPercent(hero)
if (raw == 'modt') then
// 1. Piratenhut H.
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A00M', hero)
call UnitAddAbilityBJ('AIs6', hero)
call UnitAddAbilityBJ('AIa6', hero)
call BlzSetAbilityRealLevelFieldBJ( BlzGetUnitAbility(hero, 'AIev'), ABILITY_RLF_CHANCE_TO_EVADE_EEV1, 0, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, hero, true)) / 200.00 )
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A00M', hero)
call UnitRemoveAbilityBJ('AIs6', hero)
call UnitRemoveAbilityBJ('AIa6', hero)
call BlzSetAbilityRealLevelFieldBJ( BlzGetUnitAbility(hero, 'AIev'), ABILITY_RLF_CHANCE_TO_EVADE_EEV1, 0, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, hero, true)) / 200.00 )
endif
elseif (raw == 'fwss') then
// 2. Horden Grunzer H.
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A01U', hero)
call UnitAddAbilityBJ('AIs4', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A01U', hero)
call UnitRemoveAbilityBJ('AIs4', hero)
endif
elseif (raw == 'rhth') then
// 3. Schamanen H.
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A027', hero)
call UnitAddAbilityBJ('AIi4', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A027', hero)
call UnitRemoveAbilityBJ('AIi4', hero)
endif
if (GetOwningPlayer(GetTriggerUnit()) != Player(4)) then
call BlzSetUnitMaxMana(hero, 100)
call SetUnitManaPercentBJ(hero, oldManaPct)
endif
elseif (raw == 'hval') then
// 4. Soldaten H.
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A02F', hero)
call UnitAddAbilityBJ('AIs6', hero)
call UnitAddAbilityBJ('AIi6', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A02F', hero)
call UnitRemoveAbilityBJ('AIs6', hero)
call UnitRemoveAbilityBJ('AIi6', hero)
endif
if (GetOwningPlayer(GetTriggerUnit()) != Player(4)) then
call BlzSetUnitMaxMana(hero, 100)
call SetUnitManaPercentBJ(hero, oldManaPct)
endif
elseif (raw == 'sbch') then
// 5. Ritter H. (original)
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A02L', hero)
call UnitAddAbilityBJ('AIx4', hero)
call BlzSetAbilityRealLevelFieldBJ( BlzGetUnitAbility(hero, 'AIev'), ABILITY_RLF_CHANCE_TO_EVADE_EEV1, 0, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, hero, true)) / 200.00 )
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A02L', hero)
call UnitRemoveAbilityBJ('AIx4', hero)
call BlzSetAbilityRealLevelFieldBJ( BlzGetUnitAbility(hero, 'AIev'), ABILITY_RLF_CHANCE_TO_EVADE_EEV1, 0, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, hero, true)) / 200.00 )
endif
if (GetOwningPlayer(GetTriggerUnit()) != Player(4)) then
call BlzSetUnitMaxMana(hero, 100)
call SetUnitManaPercentBJ(hero, oldManaPct)
endif
elseif (raw == 'cnob') then
// 6. Magierin H.
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A028', hero)
call UnitAddAbilityBJ('AIi4', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A028', hero)
call UnitRemoveAbilityBJ('AIi4', hero)
endif
if (GetOwningPlayer(GetTriggerUnit()) != Player(4)) then
call BlzSetUnitMaxMana(hero, 100)
call SetUnitManaPercentBJ(hero, oldManaPct)
endif
elseif (raw == 'sehr') then
// 7. Waldläuferin H.
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A001', hero)
call UnitAddAbilityBJ('AIa4', hero)
call BlzSetAbilityRealLevelFieldBJ( BlzGetUnitAbility(hero, 'AIev'), ABILITY_RLF_CHANCE_TO_EVADE_EEV1, 0, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, hero, true)) / 200.00 )
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A001', hero)
call UnitRemoveAbilityBJ('AIa4', hero)
call BlzSetAbilityRealLevelFieldBJ( BlzGetUnitAbility(hero, 'AIev'), ABILITY_RLF_CHANCE_TO_EVADE_EEV1, 0, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, hero, true)) / 200.00 )
endif
elseif (raw == 'ssil') then
// 8. Kopftuch H.
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A01J', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A01J', hero)
endif
elseif (raw == 'gcel') then
// 9. Leder H.
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A020', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A020', hero)
endif
elseif (raw == 'arsh') then
// 10. Eisen H.
if vulnerable then
call SetItemInvulnerableBJ(it, true)
call UnitAddAbilityBJ('A021', hero)
else
call SetItemInvulnerableBJ(it, false)
call UnitRemoveAbilityBJ('A021', hero)
endif
else
// Kein bekannter Helm
endif
set oldManaPct = 0
endfunction
// --------------------------------------------------------------------------
// Trigger-Condition & -Action (EINZIGER Trigger)
// --------------------------------------------------------------------------
function AusruestungAll_Conditions takes nothing returns boolean
// Nur ausführen, wenn manipulierende Einheit ein Dummy-Gebäude ist
return IsDummyStructure(GetManipulatingUnit())
endfunction
function AusruestungAll_Actions takes nothing returns nothing
local integer pid = GetConvertedPlayerId(GetTriggerPlayer())
local unit hero = udg_ZRPGHero[pid]
local item it = GetManipulatedItem()
local itemtype itTp = GetItemType(it)
local integer prio = BlzGetItemIntegerField(it, ITEM_IF_PRIORITY)
// 1) Waffe (PERMANENT)
if (itTp == ITEM_TYPE_PERMANENT) then
call ApplyWeapon(it, hero)
// 2) Artifact => Ring(4), Rüstung(2), Helm(3)
elseif (itTp == ITEM_TYPE_ARTIFACT) then
if (prio == 4) then
call ApplyRing(it, hero)
elseif (prio == 2) then
call ApplyArmor(it, hero)
elseif (prio == 3) then
call ApplyHelmet(it, hero)
else
// Priority != 2,3,4 -> ignorieren
endif
else
// Kein PERMANENT & kein ARTIFACT => ignorieren
endif
endfunction
// --------------------------------------------------------------------------
// Trigger-Init
// --------------------------------------------------------------------------
function InitTrig_AusruestungMaster takes nothing returns nothing
set gg_trg_AusruestungMaster = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_AusruestungMaster, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerRegisterAnyUnitEventBJ(gg_trg_AusruestungMaster, EVENT_PLAYER_UNIT_DROP_ITEM)
call TriggerAddCondition(gg_trg_AusruestungMaster, Condition(function AusruestungAll_Conditions))
call TriggerAddAction(gg_trg_AusruestungMaster, function AusruestungAll_Actions)
endfunction
// ===============================================================
// DropItems Trigger (inkl. Fleischkrallen & Essenz-Logik)
//===============================================================
// -------------------------------------------------------------
// 1) BEDINGUNG (gilt für ALLE Drops)
// -------------------------------------------------------------
function DropItems_Conditions takes nothing returns boolean
local unit dyingUnit = GetDyingUnit()
local player killerOwner = GetOwningPlayer(GetKillingUnitBJ())
// A) Nur wenn Killer ein User ist
if GetPlayerController(killerOwner) != MAP_CONTROL_USER then
set dyingUnit = null
set killerOwner = null
return false
endif
// B) Optional: Muss Feind von Player(2) sein? (Wenn du das für ALLE Drops willst)
if not IsUnitEnemy(dyingUnit, Player(2)) then
set dyingUnit = null
set killerOwner = null
return false
endif
set dyingUnit = null
set killerOwner = null
return true
endfunction
// -------------------------------------------------------------
// 2) HILFSFUNKTIONEN
// -------------------------------------------------------------
// -- Zeit
function IsDaytime takes nothing returns boolean
local real t = GetTimeOfDay()
return (t > 6.00) and (t < 18.00)
endfunction
// -- Held-Check (für Runenquarz-Logik)
function IsHero takes unit whichUnit returns boolean
return IsUnitType(whichUnit, UNIT_TYPE_HERO)
endfunction
// -- Fleischkrallen Haupt-Liste
function IsFleischKrallen_Unit takes integer unitId returns boolean
// ID-Liste, an deine Einheiten angepasst
if unitId == 'nwlg' or unitId == 'nC30' or unitId == 'nanb' or unitId == 'n00E' or unitId == 'nwlt' or unitId == 'ncer' or unitId == 'ncen' or unitId == 'nanw' or unitId == 'ntrh' or unitId == 'ntrt' or unitId == 'nwld' or unitId == 'n00R' or unitId == 'ngz4' or unitId == 'ngdk' or unitId == 'njga' or unitId == 'ndrj' then
return true
endif
return false
endfunction
// -- Fleischkrallen Unterliste (für 'pclr'-Drop)
function IsFleischKrallen_Sublist takes integer unitId returns boolean
// ID-Liste, an deine Einheiten angepasst
if unitId == 'nC30' or unitId == 'nanb' or unitId == 'nwlt' or unitId == 'nanw' or unitId == 'ntrh' or unitId == 'ntrt' or unitId == 'nwld' or unitId == 'ngz4' or unitId == 'ngdk' then
return true
endif
return false
endfunction
// -------------------------------------------------------------
// 3) HAUPT-LOGIK (Actions)
// -------------------------------------------------------------
function DropItems_Actions takes nothing returns nothing
local unit dyingUnit = GetDyingUnit()
local unit killer = GetKillingUnitBJ()
local location tempPoint = GetUnitLoc(dyingUnit)
local integer lvl = GetUnitLevel(dyingUnit)
local integer unitId = GetUnitTypeId(dyingUnit)
local boolean isHeroUnit = IsHero(dyingUnit)
local integer specialItemId
local integer integerLocal
local integer tempInteger
local integer playerId= GetConvertedPlayerId(GetOwningPlayer(killer))
call Trig_DeSelect_Actions(GetOwningPlayer(killer))
// =========== (A) FLEISCHKREALLEN-LOGIK ===========
// => nur ID-Check + Globale Booleans
if IsFleischKrallen_Unit(unitId) then
// 1) Krallen + NICHT Zähne -> 'lure'
if udg_BoolKrallen and not udg_BoolZaehne then
call CreateItemLoc('lure', tempPoint)
set udg_TempItem = GetLastCreatedItem()
call SetItemCharges(udg_TempItem, GetRandomInt(2, 2 * lvl))
// 2) Krallen + Zähne -> 'sxpl'
elseif udg_BoolKrallen and udg_BoolZaehne then
call CreateItemLoc('sxpl', tempPoint)
set udg_TempItem = GetLastCreatedItem()
call SetItemCharges(udg_TempItem, GetRandomInt(2, 2 * lvl))
endif
// Sublist => Drop 'pclr'
if IsFleischKrallen_Sublist(unitId) then
call CreateItemLoc('pclr', tempPoint)
endif
endif
// =========== (B) ESSENZ DES GEISTES ===========
// => 1/3 Zufall, BoolManaGeist => droppe 'rspd'
// => Erfordert KEINE Quest/Level-Bedingungen
if IsUnitType(killer, UNIT_TYPE_HERO) and (GetRandomInt(1,3) == 1) and udg_BoolManaGeist then
call CreateItemLoc('rspd', tempPoint)
endif
// =========== (C) RUNENQUARZ-LOGIK ===========
// => Quest[40] entdeckt, Level>2, kein Ausschlusstyp
if IsQuestDiscovered(udg_Quest[40]) and (lvl > 2) and not (unitId == 'Ewar' or unitId == 'Ulic' or unitId == 'Edem' or unitId == 'Hmkg') then
// 1) Held stirbt => immer 'rsps'
if isHeroUnit then
call CreateItemLoc('rsps', tempPoint)
else
// 2) Chance auf Spezial-Item (Level>3, 1/90)
if (lvl > 3) and (GetRandomInt(1,90) <= 1) then
set specialItemId = GetRandomInt(40, 45)
call CreateItemLoc(udg_BergbauUNDSchatzItemTyp[specialItemId], tempPoint)
else
// 3) Runenquarz-Item
set integerLocal = lvl * 3
if IsDaytime() then
set tempInteger = 0
else
set tempInteger = 5
endif
if GetRandomInt(1, 100) <= (1 + tempInteger + integerLocal) then
call CreateItemLoc('rsps', tempPoint)
endif
endif
endif
endif
// AUFRÄUMEN
call RemoveLocation(tempPoint)
set tempPoint = null
set dyingUnit = null
set killer = null
endfunction
// -------------------------------------------------------------
// 4) INITIALISIERUNG
// -------------------------------------------------------------
function InitTrig_DropItems takes nothing returns nothing
set gg_trg_DropItems = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_DropItems, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddCondition(gg_trg_DropItems, Condition(function DropItems_Conditions))
call TriggerAddAction(gg_trg_DropItems, function DropItems_Actions)
endfunction
function Trig_TradeItems_Actions takes nothing returns nothing
local item cosl = CreateItem('cosl', 11500, 15100) // Pearl
local item flag = CreateItem('flag', 11500, 15100) // Glyphstone
local item nflg = CreateItem('nflg', 11500, 15100) // Eggs
local item tfar = CreateItem('tfar', 11500, 15100) // Crystal Glass
local item vpur = CreateItem('vpur', 11500, 15100) // Ancient Relic
local item sclp = CreateItem('sclp', 11500, 15100) // Bundle of Herbs
local item mgtk = CreateItem('mgtk', 11500, 15100) // Flour
local item cnhn = CreateItem('cnhn', 11500, 15100) // Spices
local item oflg = CreateItem('oflg', 11500, 15100) // Silk
local item spre = CreateItem('spre', 11500, 15100) // Heartstone
local item brac = CreateItem('brac', 11500, 15100) // Runed Ring
local item mnsf = CreateItem('mnsf', 11500, 15100) // Necklace of Omniscience
local item evtl = CreateItem('evtl', 11500, 15100) // Sentinel's Necklace
local item bspd = CreateItem('bspd', 11500, 15100) // Boots of Speed
local item esaz = CreateItem('esaz', 11500, 15100) // Life Giver's Necklace
local item ktrm = CreateItem('ktrm', 11500, 15100) // Royal Hay
local item lnrn = CreateItem('lnrn', 11500, 15100) // Lion Ring
local item brag = CreateItem('brag', 11500, 15100) // Wolf Ring
local item drph = CreateItem('drph', 11500, 15100) // Owl Ring
local item shrs = CreateItem('shrs', 11500, 15100) // Flamed bread
local item rlif = CreateItem('rlif', 11500, 15100) // Ring of Regeneration
local item I00J = CreateItem('I00J', 11500, 15100) // Iron ore
local item I00Q = CreateItem('I00Q', 11500, 15100) // Thorium ore
local item I00I = CreateItem('I00I', 11500, 15100) // Gold ore
local item mlst = CreateItem('mlst', 11500, 15100) // Lumberjack axe
local item asbl = CreateItem('asbl', 11500, 15100) // Battle axe
local item srtl = CreateItem('srtl', 11500, 15100) // Life splitter
local item frhg = CreateItem('frhg', 11500, 15100) // Horde power
local item lhst = CreateItem('lhst', 11500, 15100) // Berserker axe
local item rin1 = CreateItem('rin1', 11500, 15100) // Iron armor
local item hcun = CreateItem('hcun', 11500, 15100) // Ironforge armor
local item prvt = CreateItem('prvt', 11500, 15100) // Armor of the Vitality
local item pmna = CreateItem('pmna', 11500, 15100) // Armour of the Magistrate
local item spsh = CreateItem('spsh', 11500, 15100) // Horde Armor
local item sbch = CreateItem('sbch', 11500, 15100) // Knight's Helmet
local item sor1 = CreateItem('sor1', 11500, 15100) // Essence of fire
local item sor2 = CreateItem('sor2', 11500, 15100) // Essence of water
local item sor3 = CreateItem('sor3', 11500, 15100) // Essence of earth
local item sor4 = CreateItem('sor4', 11500, 15100) // Amulet of the Elements
local item arsh = CreateItem('arsh', 11500, 15100) // Ironhelm
local item lure = CreateItem('lure', 11500, 15100) // Claws
// Glyphstone (ID 1)
call SaveInteger(hTradeItems, 1, 0, GetItemTypeId(flag)) // Glyphstone
call SaveInteger(hTradeItems, 1, 1, 0) // Gold
call SaveInteger(hTradeItems, 1, 2, 0) // Holz
call SaveInteger(hTradeItems, 1, 3, GetItemTypeId(cnhn)) // Item1
call SaveInteger(hTradeItems, 1, 4, 2) // It1 menge
call SaveInteger(hTradeItems, 1, 5, 0) // Item2 (0=kein item)
call SaveInteger(hTradeItems, 1, 6, 0) // It2 menge
call SaveInteger(hTradeItems, 1, 7, 0) // Item3 (0=kein item)
call SaveInteger(hTradeItems, 1, 8, 0) // It3 menge
call SaveInteger(hTradeItems, 1, 9, GetUnitTypeId(gg_unit_n00B_0416)) // Engard
call SaveStr(hTradeItems, 1, 10, "Valuable glyph stone that will make you rich with a bit of luck! Or a powerful ring for you that will make you really strong? Take a look at the price list of the item of your choice")
// Ancient Relic (ID 2)
call SaveInteger(hTradeItems, 2, 0, GetItemTypeId(vpur)) // Ancient Relic
call SaveInteger(hTradeItems, 2, 1, 0) // Gold
call SaveInteger(hTradeItems, 2, 2, 0) // Holz
call SaveInteger(hTradeItems, 2, 3, GetItemTypeId(tfar)) // Crystal Glass
call SaveInteger(hTradeItems, 2, 4, 1) // It1 menge
call SaveInteger(hTradeItems, 2, 5, GetItemTypeId(sclp)) // Bundle of Herbs
call SaveInteger(hTradeItems, 2, 6, 1) // It2 menge
call SaveInteger(hTradeItems, 2, 7, 0) // Item3 (0=kein item)
call SaveInteger(hTradeItems, 2, 8, 0) // It3 menge
call SaveInteger(hTradeItems, 2, 9, GetUnitTypeId(gg_unit_n01K_1056)) // Gamble
call SaveStr(hTradeItems, 2, 10, "I come from the great stone circle to the west of here to trade rare goods from the Ancient Settlers. Do you perhaps need something because you have messed with magicians? Then you have come to the right place! Take a look at the price list of the item of your choice")
// Bundle of Herbs (ID 3)
call SaveInteger(hTradeItems, 3, 0, GetItemTypeId(sclp)) // Bundle of Herbs
call SaveInteger(hTradeItems, 3, 1, 0) // Gold
call SaveInteger(hTradeItems, 3, 2, 0) // Holz
call SaveInteger(hTradeItems, 3, 3, GetItemTypeId(mgtk)) // Flour
call SaveInteger(hTradeItems, 3, 4, 4) // It1 menge
call SaveInteger(hTradeItems, 3, 5, 0) // Item2 (0=kein item)
call SaveInteger(hTradeItems, 3, 6, 0) // It2 menge
call SaveInteger(hTradeItems, 3, 7, 0) // Item3 (0=kein item)
call SaveInteger(hTradeItems, 3, 8, 0) // It3 menge
call SaveInteger(hTradeItems, 3, 9, GetUnitTypeId(gg_unit_n01J_0420)) // Agatha
call SaveStr(hTradeItems, 3, 10, "I have spices and herb bundles that I picked myself in the Shadow Forest. Or do you need a Hearthstone in this town? Take a look at the price list of the item of your choice.")
// Spices (ID 4)
call SaveInteger(hTradeItems, 4, 0, GetItemTypeId(cnhn)) // Spices
call SaveInteger(hTradeItems, 4, 1, 0) // Gold
call SaveInteger(hTradeItems, 4, 2, 0) // Holz
call SaveInteger(hTradeItems, 4, 3, GetItemTypeId(nflg)) // Eggs
call SaveInteger(hTradeItems, 4, 4, 2) // It1 menge
call SaveInteger(hTradeItems, 4, 5, 0) // Item2 (0=kein item)
call SaveInteger(hTradeItems, 4, 6, 0) // It2 menge
call SaveInteger(hTradeItems, 4, 7, 0) // Item3 (0=kein item)
call SaveInteger(hTradeItems, 4, 8, 0) // It3 menge
call SaveInteger(hTradeItems, 4, 9, GetUnitTypeId(gg_unit_n01I_1047)) // Talja
call SaveStr(hTradeItems, 4, 10, "I come from the Ashvalan expedition to trade with the people here. I trade in Spices or are you looking for a necklace that increases the mana of wizards? Take a look at the price list of the item of your choice.")
// Silk (ID 5)
call SaveInteger(hTradeItems, 5, 0, GetItemTypeId(oflg)) // Silk
call SaveInteger(hTradeItems, 5, 1, 0) // Gold
call SaveInteger(hTradeItems, 5, 2, 0) // Holz
call SaveInteger(hTradeItems, 5, 3, GetItemTypeId(cosl)) // Pearl
call SaveInteger(hTradeItems, 5, 4, 2) // It1 menge
call SaveInteger(hTradeItems, 5, 5, 0) // Item2 (0=kein item)
call SaveInteger(hTradeItems, 5, 6, 0) // It2 menge
call SaveInteger(hTradeItems, 5, 7, 0) // Item3 (0=kein item)
call SaveInteger(hTradeItems, 5, 8, 0) // It3 menge
call SaveInteger(hTradeItems, 5, 9, GetUnitTypeId(gg_unit_n01D_0295)) // Torwahn
call SaveStr(hTradeItems, 5, 10, "I trade in the finest Silk or do you want a ring that increases your Intelligence? Take a look at the price list of the item of your choice.")
// Heartstone (ID 6)
call SaveInteger(hTradeItems, 6, 0, GetItemTypeId(spre)) // Heartstone
call SaveInteger(hTradeItems, 6, 1, 100) // Gold
call SaveInteger(hTradeItems, 6, 2, 0) // Holz
call SaveInteger(hTradeItems, 6, 3, GetItemTypeId(tfar)) // Crystal Glass
call SaveInteger(hTradeItems, 6, 4, 4) // It1 menge
call SaveInteger(hTradeItems, 6, 5, 0) // Item2 (0=kein item)
call SaveInteger(hTradeItems, 6, 6, 0) // It2 menge
call SaveInteger(hTradeItems, 6, 7, 0) // Item3 (0=kein item)
call SaveInteger(hTradeItems, 6, 8, 0) // It3 menge
call SaveInteger(hTradeItems, 6, 9, GetUnitTypeId(gg_unit_n01J_0420)) // Agatha
call SaveStr(hTradeItems, 6, 10, "I found this Hearthstone in the Shadow Forest. Do you need a Hearthstone in this town?")
// Runed Ring (ID 7)
call SaveInteger(hTradeItems, 7, 0, GetItemTypeId(brac)) // Runed Ring
call SaveInteger(hTradeItems, 7, 1, 0) // Gold
call SaveInteger(hTradeItems, 7, 2, 0) // Holz
call SaveInteger(hTradeItems, 7, 3, GetItemTypeId(rlif)) // Ring of regeneration
call SaveInteger(hTradeItems, 7, 4, 1) // It1 menge
call SaveInteger(hTradeItems, 7, 5, GetItemTypeId(ktrm)) // Royal Hay
call SaveInteger(hTradeItems, 7, 6, 1) // It2 menge
call SaveInteger(hTradeItems, 7, 7, GetItemTypeId(oflg)) // Silk
call SaveInteger(hTradeItems, 7, 8, 3) // It3 menge
call SaveInteger(hTradeItems, 7, 9, GetUnitTypeId(gg_unit_n01K_1056)) // Gamble
call SaveStr(hTradeItems, 7, 10, "I come from the great stone circle to the west of here to trade rare goods like my Runed Ring from the Ancient Settlers. Do you perhaps need something because you have messed with magicians? Then you have come to the right place!")
// Necklace of omniscience (ID 8)
call SaveInteger(hTradeItems, 8, 0, GetItemTypeId(mnsf)) // Necklace of omniscience
call SaveInteger(hTradeItems, 8, 1, 0) // Gold
call SaveInteger(hTradeItems, 8, 2, 0) // Holz
call SaveInteger(hTradeItems, 8, 3, GetItemTypeId(drph)) // Owl Ring
call SaveInteger(hTradeItems, 8, 4, 1) // It1 menge
call SaveInteger(hTradeItems, 8, 5, GetItemTypeId(vpur)) // Ancient Relic
call SaveInteger(hTradeItems, 8, 6, 1) // It2 menge
call SaveInteger(hTradeItems, 8, 7, GetItemTypeId(cosl)) // Pearl
call SaveInteger(hTradeItems, 8, 8, 6) // It3 menge
call SaveInteger(hTradeItems, 8, 9, GetUnitTypeId(gg_unit_n01I_1047)) // Talja
call SaveStr(hTradeItems, 8, 10, "I come from the Ashvalan expedition to trade with the people here. I think you are looking for a necklace that increases the mana of wizards?")
// Sentinel's Necklace (ID 9)
call SaveInteger(hTradeItems, 9, 0, GetItemTypeId(evtl)) // Sentinel's Necklace
call SaveInteger(hTradeItems, 9, 1, 0) // Gold
call SaveInteger(hTradeItems, 9, 2, 0) // Holz
call SaveInteger(hTradeItems, 9, 3, GetItemTypeId(brag)) // Wolf ring
call SaveInteger(hTradeItems, 9, 4, 1) // It1 menge
call SaveInteger(hTradeItems, 9, 5, GetItemTypeId(cosl)) // Pearl
call SaveInteger(hTradeItems, 9, 6, 4) // It2 menge
call SaveInteger(hTradeItems, 9, 7, GetItemTypeId(tfar)) // Crystal Glass
call SaveInteger(hTradeItems, 9, 8, 4) // It3 menge
call SaveInteger(hTradeItems, 9, 9, GetUnitTypeId(gg_unit_n01K_1056)) // Gamble
call SaveStr(hTradeItems, 9, 10, "I come from the great stone circle to the west of here to trade rare goods like my Sentinel's Necklace from the Ancient Settlers.")
// Boots of speed (ID 10)
call SaveInteger(hTradeItems, 10, 0, GetItemTypeId(bspd)) // Boots of speed
call SaveInteger(hTradeItems, 10, 1, 0) // Gold
call SaveInteger(hTradeItems, 10, 2, 0) // Holz
call SaveInteger(hTradeItems, 10, 3, GetItemTypeId(shrs)) // Flamed Bread
call SaveInteger(hTradeItems, 10, 4, 10) // It1 menge
call SaveInteger(hTradeItems, 10, 5, 0) // It2
call SaveInteger(hTradeItems, 10, 6, 0) // It2 menge
call SaveInteger(hTradeItems, 10, 7, 0) // It3
call SaveInteger(hTradeItems, 10, 8, 0) // It3 menge
call SaveInteger(hTradeItems, 10, 9, GetUnitTypeId(gg_unit_n01G_0424)) // Frederick
call SaveStr(hTradeItems, 10, 10, "I trade in fresh fish! Or do you want something else that I caught? Take a look at the price list of the item of your choice.")
// Life Giver's Necklace (ID 11)
call SaveInteger(hTradeItems, 11, 0, GetItemTypeId(esaz)) // Life Giver's Necklace
call SaveInteger(hTradeItems, 11, 1, 0) // Gold
call SaveInteger(hTradeItems, 11, 2, 20) // Holz
call SaveInteger(hTradeItems, 11, 3, GetItemTypeId(lnrn)) // Lion ring
call SaveInteger(hTradeItems, 11, 4, 1) // It1 menge
call SaveInteger(hTradeItems, 11, 5, GetItemTypeId(sclp)) // Bundle of Herbs
call SaveInteger(hTradeItems, 11, 6, 1) // It2 menge
call SaveInteger(hTradeItems, 11, 7, GetItemTypeId(cosl)) // Pearl
call SaveInteger(hTradeItems, 11, 8, 6) // It3 menge
call SaveInteger(hTradeItems, 11, 9, GetUnitTypeId(gg_unit_n01F_1039)) // Winfred
call SaveStr(hTradeItems, 11, 10, "Do you need Crystal Glass for potions or to trade, or do you want to purchase the life giver's necklace? This necklace could save your life! Take a look at the price list of the item of your choice.")
// Royal Hay (ID 12)
call SaveInteger(hTradeItems, 12, 0, GetItemTypeId(ktrm)) // Royal Hay
call SaveInteger(hTradeItems, 12, 1, 0) // Gold
call SaveInteger(hTradeItems, 12, 2, 10) // Holz
call SaveInteger(hTradeItems, 12, 3, GetItemTypeId(oflg)) // Silk
call SaveInteger(hTradeItems, 12, 4, 2) // It1 menge
call SaveInteger(hTradeItems, 12, 5, 0) // It2
call SaveInteger(hTradeItems, 12, 6, 0) // It2 menge
call SaveInteger(hTradeItems, 12, 7, 0) // It3
call SaveInteger(hTradeItems, 12, 8, 0) // It3 menge
call SaveInteger(hTradeItems, 12, 9, GetUnitTypeId(gg_unit_n01B_0996)) // Hildrud
call SaveStr(hTradeItems, 12, 10, "I sell flour freshly milled from the windmills at Seawatch. I also trade in the best hay in this country! Take a look at the price list of the item of your choice.")
// Lion ring (ID 13)
call SaveInteger(hTradeItems, 13, 0, GetItemTypeId(lnrn)) // Lion ring
call SaveInteger(hTradeItems, 13, 1, 0) // Gold
call SaveInteger(hTradeItems, 13, 2, 10) // Holz
call SaveInteger(hTradeItems, 13, 3, GetItemTypeId(vpur)) // Ancient Relic
call SaveInteger(hTradeItems, 13, 4, 2) // It1 menge
call SaveInteger(hTradeItems, 13, 5, GetItemTypeId(shrs)) // Flamed Bread
call SaveInteger(hTradeItems, 13, 6, 1) // It2 menge
call SaveInteger(hTradeItems, 13, 7, 0) // Item3 (0=kein item)
call SaveInteger(hTradeItems, 13, 8, 0) // It3 menge
call SaveInteger(hTradeItems, 13, 9, GetUnitTypeId(gg_unit_n00B_0416)) // Engard
call SaveStr(hTradeItems, 13, 10, "You need my powerful Lion ring that will make you really strong!")
// Wolf ring (ID 14)
call SaveInteger(hTradeItems, 14, 0, GetItemTypeId(brag)) // Wolf ring
call SaveInteger(hTradeItems, 14, 1, 50) // Gold
call SaveInteger(hTradeItems, 14, 2, 0) // Holz
call SaveInteger(hTradeItems, 14, 3, GetItemTypeId(ktrm)) // Royal Hay
call SaveInteger(hTradeItems, 14, 4, 1) // It1 menge
call SaveInteger(hTradeItems, 14, 5, GetItemTypeId(sclp)) // Bundle of Herbs
call SaveInteger(hTradeItems, 14, 6, 1) // It2 menge
call SaveInteger(hTradeItems, 14, 7, 0) // It3
call SaveInteger(hTradeItems, 14, 8, 0) // It3 menge
call SaveInteger(hTradeItems, 14, 9, GetUnitTypeId(gg_unit_n01E_1038)) // Inca
call SaveStr(hTradeItems, 14, 10, "My chickens have laid fresh eggs, do you want some?. Or do you need one of those rings that my agile chickens pecked out of the ground? Take a look at the price list of the item of your choice.")
// Owl Ring (ID 15)
call SaveInteger(hTradeItems, 15, 0, GetItemTypeId(drph)) // Owl Ring
call SaveInteger(hTradeItems, 15, 1, 0) // Gold
call SaveInteger(hTradeItems, 15, 2, 0) // Holz
call SaveInteger(hTradeItems, 15, 3, GetItemTypeId(flag)) // Glyphstone
call SaveInteger(hTradeItems, 15, 4, 2) // It1 menge
call SaveInteger(hTradeItems, 15, 5, GetItemTypeId(vpur)) // Ancient Relic
call SaveInteger(hTradeItems, 15, 6, 2) // It2 menge
call SaveInteger(hTradeItems, 15, 7, 0) // Item3 (0=kein item)
call SaveInteger(hTradeItems, 15, 8, 0) // It3 menge
call SaveInteger(hTradeItems, 15, 9, GetUnitTypeId(gg_unit_n01D_0295)) // Torwahn
call SaveStr(hTradeItems, 15, 10, "The wise customer buys an owl ring...")
// Flamed Bread (ID 16)
call SaveInteger(hTradeItems, 16, 0, GetItemTypeId(shrs)) // Flamed Bread
call SaveInteger(hTradeItems, 16, 1, 0) // Gold
call SaveInteger(hTradeItems, 16, 2, 0) // Holz
call SaveInteger(hTradeItems, 16, 3, GetItemTypeId(mgtk)) // Flour
call SaveInteger(hTradeItems, 16, 4, 3) // It1 menge
call SaveInteger(hTradeItems, 16, 5, GetItemTypeId(nflg)) // Eggs
call SaveInteger(hTradeItems, 16, 6, 2) // It2 menge
call SaveInteger(hTradeItems, 16, 7, 0) // Item3 (0=kein item)
call SaveInteger(hTradeItems, 16, 8, 0) // It3 menge
call SaveInteger(hTradeItems, 16, 9, GetUnitTypeId(gg_unit_n01H_1045)) // Thomas
call SaveStr(hTradeItems, 16, 10, "If you bring me fresh Eggs and Flour, I'll bake you Flamed Bread. Or are you hungry for something else? Take a look at the price list of the item of your choice.")
// Battle Axe (ID 17)
call SaveInteger(hTradeItems, 17, 0, GetItemTypeId(asbl)) // Battle Axe
call SaveInteger(hTradeItems, 17, 1, 50) // Gold
call SaveInteger(hTradeItems, 17, 2, 0) // Holz
call SaveInteger(hTradeItems, 17, 3, GetItemTypeId(I00J)) // Iron Ore
call SaveInteger(hTradeItems, 17, 4, 4) // It1 menge
call SaveInteger(hTradeItems, 17, 5, GetItemTypeId(I00Q)) // Thorium Ore
call SaveInteger(hTradeItems, 17, 6, 2) // It2 menge
call SaveInteger(hTradeItems, 17, 7, GetItemTypeId(lure)) // claws
call SaveInteger(hTradeItems, 17, 8, 1) // It3 menge
call SaveInteger(hTradeItems, 17, 9, GetUnitTypeId(gg_unit_n01M_0398)) // Gordush
call SaveStr(hTradeItems, 17, 10, "I'm skeptical of outsiders, but for 50 coins and the right materials, I'll forge the best weapons and armor you can imagine.")
// Life Splitter (ID 18)
call SaveInteger(hTradeItems, 18, 0, GetItemTypeId(srtl)) // Life Splitter
call SaveInteger(hTradeItems, 18, 1, 50) // Gold
call SaveInteger(hTradeItems, 18, 2, 0) // Holz
call SaveInteger(hTradeItems, 18, 3, GetItemTypeId(I00J)) // Iron Ore
call SaveInteger(hTradeItems, 18, 4, 5) // It1 menge
call SaveInteger(hTradeItems, 18, 5, GetItemTypeId(I00Q)) // Thorium Ore
call SaveInteger(hTradeItems, 18, 6, 5) // It2 menge
call SaveInteger(hTradeItems, 18, 7, GetItemTypeId(mlst)) // Lumberjack Axe
call SaveInteger(hTradeItems, 18, 8, 1) // It3 menge
call SaveInteger(hTradeItems, 18, 9, GetUnitTypeId(gg_unit_n01M_0398)) // Gordush
call SaveStr(hTradeItems, 18, 10, "look at the price...")
// Horde Power (ID 19)
call SaveInteger(hTradeItems, 19, 0, GetItemTypeId(frhg)) // Horde Power
call SaveInteger(hTradeItems, 19, 1, 50) // Gold
call SaveInteger(hTradeItems, 19, 2, 0) // Holz
call SaveInteger(hTradeItems, 19, 3, GetItemTypeId(I00Q)) // Thorium Ore
call SaveInteger(hTradeItems, 19, 4, 10) // It1 menge
call SaveInteger(hTradeItems, 19, 5, GetItemTypeId(I00I)) // Gold Ore
call SaveInteger(hTradeItems, 19, 6, 4) // It2 menge
call SaveInteger(hTradeItems, 19, 7, GetItemTypeId(srtl)) // Life Splitter
call SaveInteger(hTradeItems, 19, 8, 1) // It3 menge
call SaveInteger(hTradeItems, 19, 9, GetUnitTypeId(gg_unit_n01M_0398)) // Gordush
call SaveStr(hTradeItems, 19, 10, "look at the price...")
// Berserker Axe (ID 20)
call SaveInteger(hTradeItems, 20, 0, GetItemTypeId(lhst)) // Berserker Axe
call SaveInteger(hTradeItems, 20, 1, 50) // Gold
call SaveInteger(hTradeItems, 20, 2, 0) // Holz
call SaveInteger(hTradeItems, 20, 3, GetItemTypeId(I00Q)) // Thorium Ore
call SaveInteger(hTradeItems, 20, 4, 20) // It1 menge
call SaveInteger(hTradeItems, 20, 5, GetItemTypeId(I00I)) // Gold Ore
call SaveInteger(hTradeItems, 20, 6, 10) // It2 menge
call SaveInteger(hTradeItems, 20, 7, GetItemTypeId(frhg)) // Horde Power
call SaveInteger(hTradeItems, 20, 8, 1) // It3 menge
call SaveInteger(hTradeItems, 20, 9, GetUnitTypeId(gg_unit_n01M_0398)) // Gordush
call SaveStr(hTradeItems, 20, 10, "look at the price...")
// Amulet of the Elements (ID 21)
call SaveInteger(hTradeItems, 21, 0, GetItemTypeId(sor4)) // Amulet of the Elements
call SaveInteger(hTradeItems, 21, 1, 0) // Gold
call SaveInteger(hTradeItems, 21, 2, 0) // Holz
call SaveInteger(hTradeItems, 21, 3, GetItemTypeId(sor1)) // Essence of fire
call SaveInteger(hTradeItems, 21, 4, 1) // It1 menge
call SaveInteger(hTradeItems, 21, 5, GetItemTypeId(sor2)) // Essence of water
call SaveInteger(hTradeItems, 21, 6, 1) // It2 menge
call SaveInteger(hTradeItems, 21, 7, GetItemTypeId(sor3)) // Essence of earth
call SaveInteger(hTradeItems, 21, 8, 1) // It3 menge
call SaveInteger(hTradeItems, 21, 9, GetUnitTypeId(gg_unit_n01M_0398)) // Gordush
call SaveStr(hTradeItems, 21, 10, "look at the price...")
// Ironforge armor (ID 22)
call SaveInteger(hTradeItems, 22, 0, GetItemTypeId(hcun)) // Ironforge armor
call SaveInteger(hTradeItems, 22, 1, 50) // Gold
call SaveInteger(hTradeItems, 22, 2, 0) // Holz
call SaveInteger(hTradeItems, 22, 3, GetItemTypeId(I00J)) // Iron Ore
call SaveInteger(hTradeItems, 22, 4, 5) // It1 menge
call SaveInteger(hTradeItems, 22, 5, GetItemTypeId(I00Q)) // Thorium Ore
call SaveInteger(hTradeItems, 22, 6, 5) // It2 menge
call SaveInteger(hTradeItems, 22, 7, GetItemTypeId(rin1)) // Iron Armor
call SaveInteger(hTradeItems, 22, 8, 1) // It3 menge
call SaveInteger(hTradeItems, 22, 9, GetUnitTypeId(gg_unit_n01M_0398)) // Gordush
call SaveStr(hTradeItems, 22, 10, "look at the price...")
// Armor of the Vitality (ID 23)
call SaveInteger(hTradeItems, 23, 0, GetItemTypeId(prvt)) // Armor of the Vitality
call SaveInteger(hTradeItems, 23, 1, 50) // Gold
call SaveInteger(hTradeItems, 23, 2, 0) // Holz
call SaveInteger(hTradeItems, 23, 3, GetItemTypeId(I00I)) // Gold Ore
call SaveInteger(hTradeItems, 23, 4, 3) // It1 menge
call SaveInteger(hTradeItems, 23, 5, GetItemTypeId(I00Q)) // Thorium Ore
call SaveInteger(hTradeItems, 23, 6, 10) // It2 menge
call SaveInteger(hTradeItems, 23, 7, GetItemTypeId(rin1)) // Iron Armor
call SaveInteger(hTradeItems, 23, 8, 1) // It3 menge
call SaveInteger(hTradeItems, 23, 9, GetUnitTypeId(gg_unit_n01M_0398)) // Gordush
call SaveStr(hTradeItems, 23, 10, "look at the price...")
// Armour of the Magistrate (ID 24)
call SaveInteger(hTradeItems, 24, 0, GetItemTypeId(pmna)) // Armour of the Magistrate
call SaveInteger(hTradeItems, 24, 1, 50) // Gold
call SaveInteger(hTradeItems, 24, 2, 0) // Holz
call SaveInteger(hTradeItems, 24, 3, GetItemTypeId(I00Q)) // Thorium Ore
call SaveInteger(hTradeItems, 24, 4, 15) // It1 menge
call SaveInteger(hTradeItems, 24, 5, GetItemTypeId(I00I)) // Gold Ore
call SaveInteger(hTradeItems, 24, 6, 10) // It2 menge
call SaveInteger(hTradeItems, 24, 7, GetItemTypeId(vpur)) // Ancient Relic
call SaveInteger(hTradeItems, 24, 8, 4) // It3 menge
call SaveInteger(hTradeItems, 24, 9, GetUnitTypeId(gg_unit_n01M_0398)) // Gordush
call SaveStr(hTradeItems, 24, 10, "look at the price...")
// Horde Armor (ID 25)
call SaveInteger(hTradeItems, 25, 0, GetItemTypeId(spsh)) // Horde Armor
call SaveInteger(hTradeItems, 25, 1, 50) // Gold
call SaveInteger(hTradeItems, 25, 2, 0) // Holz
call SaveInteger(hTradeItems, 25, 3, GetItemTypeId(I00Q)) // Thorium Ore
call SaveInteger(hTradeItems, 25, 4, 20) // It1 menge
call SaveInteger(hTradeItems, 25, 5, GetItemTypeId(I00I)) // Gold Ore
call SaveInteger(hTradeItems, 25, 6, 15) // It2 menge
call SaveInteger(hTradeItems, 25, 7, GetItemTypeId(pmna)) // Armour of the Magistrate
call SaveInteger(hTradeItems, 25, 8, 1) // It3 menge
call SaveInteger(hTradeItems, 25, 9, GetUnitTypeId(gg_unit_n01M_0398)) // Gordush
call SaveStr(hTradeItems, 25, 10, "look at the price...")
// Knight's Helmet (ID 26)
call SaveInteger(hTradeItems, 26, 0, GetItemTypeId(sbch)) // Knight's Helmet
call SaveInteger(hTradeItems, 26, 1, 50) // Gold
call SaveInteger(hTradeItems, 26, 2, 0) // Holz
call SaveInteger(hTradeItems, 26, 3, GetItemTypeId(I00Q)) // Thorium Ore
call SaveInteger(hTradeItems, 26, 4, 15) // It1 menge
call SaveInteger(hTradeItems, 26, 5, GetItemTypeId(I00I)) // Gold Ore
call SaveInteger(hTradeItems, 26, 6, 15) // It2 menge
call SaveInteger(hTradeItems, 26, 7, GetItemTypeId(arsh)) // Ironhelm
call SaveInteger(hTradeItems, 26, 8, 1) // It3 menge
call SaveInteger(hTradeItems, 26, 9, GetUnitTypeId(gg_unit_n01M_0398)) // Gordush
call SaveStr(hTradeItems, 26, 10, "look at the price...")
// Iron Armor (ID 27)
call SaveInteger(hTradeItems, 27, 0, GetItemTypeId(rin1)) // Iron Armor
call SaveInteger(hTradeItems, 27, 1, 50) // Gold
call SaveInteger(hTradeItems, 27, 2, 0) // Holz
call SaveInteger(hTradeItems, 27, 3, GetItemTypeId(I00J)) // Iron Ore
call SaveInteger(hTradeItems, 27, 4, 10) // It1 menge
call SaveInteger(hTradeItems, 27, 5, 0) // Item2 (0=kein item)
call SaveInteger(hTradeItems, 27, 6, 0) // It2 menge
call SaveInteger(hTradeItems, 27, 7, 0) // Item3 (0=kein item)
call SaveInteger(hTradeItems, 27, 8, 0) // It3 menge
call SaveInteger(hTradeItems, 27, 9, GetUnitTypeId(gg_unit_n01M_0398)) // Gordush
call SaveStr(hTradeItems, 27, 10, "look at the price...")
endfunction
function InitTrig_TradeItems takes nothing returns nothing
set gg_trg_TradeItems = CreateTrigger()
call TriggerRegisterTimerEventSingle(gg_trg_TradeItems, 5)
call TriggerAddAction(gg_trg_TradeItems, function Trig_TradeItems_Actions)
endfunction
function Trig_HandelX_Conditions takes nothing returns boolean
local boolean spellCheck = GetSpellAbilityId() == 'AX06'
local unit target = GetSpellTargetUnit()
if (not (UnitInventorySizeBJ(target) >= 1)) then
return false
endif
if (not (IsUnitType(target, UNIT_TYPE_STRUCTURE) == true)) then
return false
endif
return spellCheck
endfunction
function Trig_HandelX_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local unit target = GetSpellTargetUnit()
local integer targetUnitId = GetUnitTypeId(target)
local integer key1 = 1
local integer adjustedKey1
local integer rawCode
local boolean unitFound = false
local integer slot
local item itemSlot
local integer itemId
local boolean allItemsMatch = true
local boolean itemFound = false
local boolean tooltipLoaded = false // Neue Variable, um sicherzustellen, dass der Tooltip nur einmal geladen wird
local integer rawCode1
local integer rawCode2
local integer rawCode3
local integer rawCode4
local integer playerGold = GetPlayerState(GetOwningPlayer(caster), PLAYER_STATE_RESOURCE_GOLD)
local integer playerLumber = GetPlayerState(GetOwningPlayer(caster), PLAYER_STATE_RESOURCE_LUMBER)
local integer itemGoldCost
local integer itemLumberCost
local integer itemCharges
local string unitName
local string itemTooltip
local integer maxSlots = UnitInventorySize(target)
local boolean foundRawCode1 = true
local boolean foundRawCode2 = true
local boolean foundRawCode3 = true
// Abrufen des Namens der festen Einheit 'ndfl'
if GetUnitTypeId(gg_unit_ndfl_1777) == 'ndfl' then
set unitName = GetUnitName(gg_unit_ndfl_1777)
else
set unitName = "Unbekannte Einheit"
endif
// Schleife zur Suche nach der passenden Einheit
loop
exitwhen key1 > 28
set adjustedKey1 = key1 - 1
set rawCode = LoadInteger(hTradeItems, adjustedKey1, 9) // Überprüfe Händler (key1 - 1, um den richtigen Key zu nutzen)
if rawCode == targetUnitId then
set unitFound = true
// Rohcodes für die Slot-Überprüfung laden
set rawCode1 = LoadInteger(hTradeItems, adjustedKey1, 3)
set rawCode2 = LoadInteger(hTradeItems, adjustedKey1, 5)
set rawCode3 = LoadInteger(hTradeItems, adjustedKey1, 7)
// Lade den Tooltip (String) aus der Hashtabelle, nur wenn er noch nicht geladen wurde
if not tooltipLoaded then
set itemTooltip = LoadStr(hTradeItems, adjustedKey1, 10)
set tooltipLoaded = true // Tooltip wurde jetzt geladen
endif
// Initialisieren der Variablen für die Überprüfung
set foundRawCode1 = (rawCode1 == 0)
set foundRawCode2 = (rawCode2 == 0)
set foundRawCode3 = (rawCode3 == 0)
set allItemsMatch = true
// Dynamische Überprüfung aller Items in den Slots des Ziels
set slot = 0
loop
exitwhen slot >= maxSlots
set itemSlot = UnitItemInSlot(target, slot)
if itemSlot != null then
set itemId = GetItemTypeId(itemSlot)
// Überprüfung, ob das Item einem der Rohcodes entspricht und genug Charges hat
if itemId == rawCode1 and not foundRawCode1 then
set itemCharges = LoadInteger(hTradeItems, adjustedKey1, 4)
if GetItemCharges(itemSlot) >= itemCharges then
set foundRawCode1 = true
else
set allItemsMatch = false
endif
elseif itemId == rawCode2 and not foundRawCode2 then
set itemCharges = LoadInteger(hTradeItems, adjustedKey1, 6)
if GetItemCharges(itemSlot) >= itemCharges then
set foundRawCode2 = true
else
set allItemsMatch = false
endif
elseif itemId == rawCode3 and not foundRawCode3 then
set itemCharges = LoadInteger(hTradeItems, adjustedKey1, 8)
if GetItemCharges(itemSlot) >= itemCharges then
set foundRawCode3 = true
else
set allItemsMatch = false
endif
endif
endif
set slot = slot + 1
endloop
// Überprüfen, ob alle benötigten Items gefunden wurden
if not foundRawCode1 or not foundRawCode2 or not foundRawCode3 then
set allItemsMatch = false
endif
// Wenn alle Items übereinstimmen, fahre mit dem Kaufprozess fort
if allItemsMatch then
set itemGoldCost = LoadInteger(hTradeItems, adjustedKey1, 1) // Goldkosten
set itemLumberCost = LoadInteger(hTradeItems, adjustedKey1, 2) // Holzkosten
if playerGold >= itemGoldCost and playerLumber >= itemLumberCost then
// Ressourcen abziehen
call SetPlayerState(GetOwningPlayer(caster), PLAYER_STATE_RESOURCE_GOLD, playerGold - itemGoldCost)
call SetPlayerState(GetOwningPlayer(caster), PLAYER_STATE_RESOURCE_LUMBER, playerLumber - itemLumberCost)
// Item-Charges vom Händler abziehen
set slot = 0
loop
exitwhen slot >= maxSlots
set itemSlot = UnitItemInSlot(target, slot)
if itemSlot != null then
set itemId = GetItemTypeId(itemSlot)
if itemId == rawCode1 then
set itemCharges = LoadInteger(hTradeItems, adjustedKey1, 4)
call SetItemCharges(itemSlot, GetItemCharges(itemSlot) - itemCharges)
if GetItemCharges(itemSlot) <= 0 then
call RemoveItem(itemSlot) // Entferne das Item, wenn keine Charges mehr übrig sind
endif
elseif itemId == rawCode2 then
set itemCharges = LoadInteger(hTradeItems, adjustedKey1, 6)
call SetItemCharges(itemSlot, GetItemCharges(itemSlot) - itemCharges)
if GetItemCharges(itemSlot) <= 0 then
call RemoveItem(itemSlot) // Entferne das Item, wenn keine Charges mehr übrig sind
endif
elseif itemId == rawCode3 then
set itemCharges = LoadInteger(hTradeItems, adjustedKey1, 8)
call SetItemCharges(itemSlot, GetItemCharges(itemSlot) - itemCharges)
if GetItemCharges(itemSlot) <= 0 then
call RemoveItem(itemSlot) // Entferne das Item, wenn keine Charges mehr übrig sind
endif
endif
endif
set slot = slot + 1
endloop
set itemFound = true
// Aktualisiere die Dialoginformationen mit dem Namen der Einheit & Das Item (rawCode4) wird dem Caster hinzugefügt
set udg_StringDialog1[udg_Pint] = GetUnitName(target) // Name der Ziel-Einheit
set udg_StringDialog2[udg_Pint] = unitName // Name der festen Einheit 'ndfl'
set rawCode4 = LoadInteger(hTradeItems, adjustedKey1, 0)
call UnitAddItemById(caster, rawCode4)
exitwhen true
endif
endif
endif
set key1 = key1 + 1
endloop
// Aktualisiere die Dialoginformationen mit dem Tooltip des Items, wenn kein passendes Item gefunden wurde
if not itemFound and unitFound then
set udg_StringDialog1[udg_Pint] = GetUnitName(target) // Name der Ziel-Einheit
if itemTooltip == null or itemTooltip == "" then
set itemTooltip = LoadStr(hTradeItems, adjustedKey1, 10) // Lade den Tooltip (String) aus der Hashtabelle
endif
set udg_StringDialog2[udg_Pint] = itemTooltip
endif
// Dialog für den lokalen Spieler anzeigen
set udg_Player = GetTriggerPlayer()
if GetLocalPlayer() == udg_Player then
call BlzFrameSetVisible(FrameDialog, true)
call BlzFrameSetText(FrameDialogText, udg_StringDialog1[udg_Pint] + "\n" + udg_StringDialog2[udg_Pint])
endif
set udg_Pint = 0
endfunction
function InitTrig_HandelX takes nothing returns nothing
set gg_trg_HandelX = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_HandelX, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(gg_trg_HandelX, Condition(function Trig_HandelX_Conditions))
call TriggerAddAction(gg_trg_HandelX, function Trig_HandelX_Actions)
endfunction
//===========================================================================
// Utility-Funktionen für Wiederverwendbarkeit
function IsItemTypeMatch takes item itm, integer itemId returns boolean
if ( GetItemTypeId(itm) == itemId ) then
return true
endif
return false
endfunction
function IsAtFlugzone takes unit u, rect zone returns boolean
return RectContainsUnit(zone, u)
endfunction
function KameraUebergabeAnFlugzeug takes integer playerId, unit flugzeug returns nothing
set udg_ZRotaFocusHero[playerId] = false
set udg_ZRotaAutoAn[playerId] = false
call ResetToGameCameraForPlayer(Player(playerId - 1), 0)
call SetCameraTargetControllerNoZForPlayer(Player(playerId - 1), flugzeug, 0, 0, false)
endfunction
function KameraUebergabeAnHelden takes integer playerId, unit held returns nothing
set udg_ZRotaFocusHero[playerId] = true
set udg_ZRotaAutoAn[playerId] = true
call ResetToGameCameraForPlayer(Player(playerId - 1), 0)
call SetCameraTargetControllerNoZForPlayer(Player(playerId - 1), held, 0, 0, false)
endfunction
function AddVisualEffects takes unit flugzeug returns effect
local effect spezEfHero
call AddSpecialEffectTargetUnitBJ("origin", flugzeug, BlzGetUnitWeaponStringField(GetManipulatingUnit(), UNIT_WEAPON_SF_ATTACK_PROJECTILE_ART, 0))
set spezEfHero = GetLastCreatedEffectBJ()
call BlzSetSpecialEffectScale(spezEfHero, 0.50)
call UnitAddAbilityBJ( 'A02M', flugzeug )
return spezEfHero
endfunction
function RemoveVisualEffects takes effect spezEfHero returns nothing
call DestroyEffectBJ(spezEfHero)
endfunction
function StartFlight takes unit flugzeug, location targetPoint, real speed returns nothing
call UnitAddAbilityBJ('Amrf', flugzeug)
call SetUnitFlyHeightBJ(flugzeug, 1000, 200.00)
call SetUnitMoveSpeed(flugzeug, speed)
call IssuePointOrderLocBJ(flugzeug, "move", targetPoint)
endfunction
function EndFlight takes unit flugzeug, unit held, location targetPoint, integer playerIndex, effect spezEfHero returns nothing
call SetUnitFlyHeightBJ(flugzeug, 15, 200.00)
call UnitRemoveAbilityBJ('Amrf', flugzeug)
call SetUnitPositionLoc(held, targetPoint)
call RemoveLocation(targetPoint)
call ShowUnit(held, true)
set udg_ZRotaHohZHero[playerIndex] = true
call SetUnitInvulnerable(held, false)
call RemoveVisualEffects(spezEfHero)
call KameraUebergabeAnHelden(playerIndex, held)
endfunction
function HandleFlight takes unit flugzeug, unit held, location targetPoint, integer playerIndex returns nothing
local real FLIGHT_SPEED_NORMAL = 400.00
local effect spezEfHero
call KameraUebergabeAnFlugzeug(playerIndex, flugzeug)
call SetUnitInvulnerable(held, true)
call ShowUnit(held, false)
set udg_ZRotaHohZHero[playerIndex] = false
set spezEfHero = AddVisualEffects(flugzeug)
call StartFlight(flugzeug, targetPoint, FLIGHT_SPEED_NORMAL)
call SetCameraFieldForPlayer(Player(playerIndex - 1), CAMERA_FIELD_ZOFFSET, 1150, 0)
call TriggerSleepAction(22)
call EndFlight(flugzeug, held, targetPoint, playerIndex, spezEfHero)
endfunction
function DisplayDialog takes integer playerIndex, integer dialogKey returns nothing
local string dialog1 = LoadStr(udg_DialogHashtable, dialogKey, 1)
local string dialog2 = LoadStr(udg_DialogHashtable, dialogKey, 2)
local string dialog3 = LoadStr(udg_DialogHashtable, dialogKey, 3)
local string dialog4 = LoadStr(udg_DialogHashtable, dialogKey, 4)
set udg_StringHeld[playerIndex] = ( GetHeroProperName(GetTriggerUnit()) + ": |N" )
set udg_StringZiel[playerIndex] = ( "Baradun" + ": |N" )
set udg_StringDialog1[playerIndex] = ( udg_StringZiel[playerIndex] + dialog1 )
set udg_StringDialog2[playerIndex] = ( udg_StringZiel[playerIndex] + dialog2 )
set udg_StringDialog3[playerIndex] = ( udg_StringZiel[playerIndex] + dialog3 )
set udg_StringDialog4[playerIndex] = ( udg_StringZiel[playerIndex] + dialog4 )
if GetLocalPlayer() == Player(playerIndex - 1) then
call BlzFrameSetVisible(FrameDialog, true)
call BlzFrameSetText(FrameDialogText, udg_StringDialog1[playerIndex])
endif
endfunction
function Trig_Item_Inselflug_Conditions takes nothing returns boolean
if ( not ( IsQuestCompleted(udg_Quest[39]) == true ) ) then
return false
endif
return IsItemTypeMatch(GetManipulatedItem(), 'I00Y') or IsItemTypeMatch(GetManipulatedItem(), 'I00X')
endfunction
//===========================================================================
// Hauptaktionen für den Transport
function Trig_Item_Inselflug_Actions takes nothing returns nothing
local real CAMERA_DISTANCE = 1300.00
local real FLIGHT_SPEED_FAST = 522.00
local integer playerIndex = GetConvertedPlayerId(GetTriggerPlayer())
local unit flugzeug = gg_unit_hgyr_0482
local unit held = GetManipulatingUnit()
local location targetPoint
local location currentPoint = GetUnitLoc(flugzeug)
call RemoveLocation(currentPoint)
set currentPoint = null
call UnitShareVisionBJ(true, flugzeug, GetTriggerPlayer())
if (IsItemTypeMatch(GetManipulatedItem(), 'I00Y')) then
if (IsAtFlugzone(flugzeug, gg_rct_Flugzone_Steinbruch)) then
// Held und Flieger -> Start (I00Y = Ziel: Zwillingsturm)
set targetPoint = Location(-5868.00, -1306.00)
call DisplayDialog(playerIndex, 3)
call ShowUnit(gg_unit_hrif_0492, false)
call HandleFlight(flugzeug, held, targetPoint, playerIndex)
call TriggerSleepAction(10)
call ShowUnit(gg_unit_hrif_0495, true)
else
// Held alleine -> Warten
set targetPoint = Location(815.00, -6120.00)
call DisplayDialog(playerIndex, 5)
call ShowUnit(gg_unit_hrif_0495, false)
call StartFlight(flugzeug, targetPoint, FLIGHT_SPEED_FAST)
call RemoveLocation(targetPoint)
call TriggerSleepAction(15)
call SetUnitFlyHeightBJ(flugzeug, 15, 200.00)
call UnitRemoveAbilityBJ('Amrf', flugzeug)
call TriggerSleepAction(5)
call ShowUnit(gg_unit_hrif_0492, true)
endif
elseif (IsItemTypeMatch(GetManipulatedItem(), 'I00X')) then
if (IsAtFlugzone(flugzeug, gg_rct_Flugzone_Zwillingsturm)) then
// Held und Flieger -> Start (I00X = Ziel: Steinbruch)
call ShowUnit(gg_unit_hrif_0495, false)
set targetPoint = Location(815.00, -6120.00)
call DisplayDialog(playerIndex, 3)
call HandleFlight(flugzeug, held, targetPoint, playerIndex)
call TriggerSleepAction(10)
call ShowUnit(gg_unit_hrif_0492, true)
else
// Held alleine -> Warten
call ShowUnit(gg_unit_hrif_0492, false)
set targetPoint = Location(-5868.00, -1306.00)
call DisplayDialog(playerIndex, 6)
call StartFlight(flugzeug, targetPoint, FLIGHT_SPEED_FAST)
call RemoveLocation(targetPoint)
call TriggerSleepAction(15)
call SetUnitFlyHeightBJ(flugzeug, 15, 200.00)
call UnitRemoveAbilityBJ('Amrf', flugzeug)
call TriggerSleepAction(5)
call ShowUnit(gg_unit_hrif_0495, true)
endif
else
set targetPoint = Location(-5868.00, -1306.00)
call StartFlight(flugzeug, targetPoint, FLIGHT_SPEED_FAST)
call RemoveLocation(targetPoint)
call SetUnitFlyHeightBJ(flugzeug, 15, 200.00)
call UnitRemoveAbilityBJ('Amrf', flugzeug)
endif
call UnitRemoveAbilityBJ( 'A02M', flugzeug )
call UnitShareVisionBJ(false, flugzeug, GetTriggerPlayer())
endfunction
function InitTrig_Item_Inselflug takes nothing returns nothing
set gg_trg_Item_Inselflug = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Item_Inselflug, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(gg_trg_Item_Inselflug, Condition(function Trig_Item_Inselflug_Conditions))
call TriggerAddAction(gg_trg_Item_Inselflug, function Trig_Item_Inselflug_Actions)
call SaveStr(udg_DialogHashtable, 3, 1, "Unfortunately my flying machine can't take more than one passenger. Anyway, can you please keep an eye out for dragons?")
call SaveStr(udg_DialogHashtable, 4, 1, "I'll go straight to you ... brrrrrr .... I hope you have already put the Coins in the money compartment of the communication crystal.")
call SaveStr(udg_DialogHashtable, 5, 1, "..... brrrrr .... Fuel is getting more and more expensive, unfortunately you have to pay a return flight if you want to go to the Twintowers.")
call SaveStr(udg_DialogHashtable, 6, 1, "..... brrrrr .... Fuel is becoming more and more expensive, and anyone who wants to go to the mining town of Stonebreak unfortunately has to pay for a return flight.")
endfunction
globals
constant real TRIG_ITEM_FLUSSFHART_MOVE_DISTANCE = 1500.00
constant real TRIG_ITEM_FLUSSFHART_SPEED_FAST = 522.00
constant real TRIG_ITEM_FLUSSFHART_SPEED_SLOW = 250.00
constant real TRIG_ITEM_FLUSSFHART_WAIT_TIME = 31.00
constant real TRIG_ITEM_FLUSSFHART_HIDE_DISTANCE = 1000.00
hashtable udg_DialogHashtable = InitHashtable()
endglobals
function InitDialogs takes nothing returns nothing
// Dialoge für die verschiedenen Szenarien initialisieren
call SaveStr(udg_DialogHashtable, 1, 1, "Thanks for your gems, now sit back and enjoy the ride.")
call SaveStr(udg_DialogHashtable, 1, 2, "You should be aware of how cheap the trip was for you. My predecessor wanted a rare amulet from everyone for the crossing. I think the greed for wealth brought him to his grave.")
call SaveStr(udg_DialogHashtable, 1, 3, "Do you actually know that you will avoid a long hike through Embersdesert as a result? My prices are non-negotiable and absolutely fair, at the latest when you want to cover this distance on foot, you will notice that too.")
call SaveStr(udg_DialogHashtable, 1, 4, "The desert is dangerous, beetles, scorpions, even skeletons attack you there. There is no safer way than with my boat")
// Alternativer Dialog für Key 2
call SaveStr(udg_DialogHashtable, 2, 1, "Now where is the boat? I paid for it with gems!")
call SaveStr(udg_DialogHashtable, 2, 2, "Wait here with me until my helmsman is there with my boat. You should be happy that I am giving you your gems back, but once the boat arrives, the crossing will cost you gems!")
endfunction
function Trig_Item_Flussfahrt_CheckItemType takes integer itemId returns boolean
return itemId == 'I00U' or itemId == 'I00T'
endfunction
function Trig_Item_Flussfahrt_Conditions takes nothing returns boolean
return Trig_Item_Flussfahrt_CheckItemType(GetItemTypeId(GetManipulatedItem()))
endfunction
function Trig_Item_Flussfahrt_DistanceCheck takes location pointA, location pointB, real distance returns boolean
return DistanceBetweenPoints(pointA, pointB) < distance
endfunction
function Trig_Item_Flussfahrt_IsUnitHidden takes unit u returns boolean
return IsUnitHiddenBJ(u)
endfunction
function Trig_Item_Flussfahrt_HideHero takes integer playerIndex returns nothing
call SetUnitInvulnerable(udg_ZRPGHero[playerIndex], true)
call ShowUnitHide(udg_ZRPGHero[playerIndex])
set udg_ZRotaFocusHero[playerIndex] = false
set udg_ZRotaAutoAn[playerIndex] = false
call ResetToGameCameraForPlayer(Player(playerIndex - 1), 0)
call SetCameraTargetControllerNoZForPlayer(Player(playerIndex - 1), gg_unit_hbot_0226, 0, 0, false)
endfunction
function Trig_Item_Flussfahrt_ShowHero takes integer playerIndex, location position returns nothing
call ShowUnitShow(udg_ZRPGHero[playerIndex])
call SetUnitInvulnerable(udg_ZRPGHero[playerIndex], false)
call SetUnitPositionLoc(udg_ZRPGHero[playerIndex], position)
set udg_ZRotaFocusHero[playerIndex] = true
set udg_ZRotaAutoAn[playerIndex] = true
call ResetToGameCameraForPlayer(Player(playerIndex - 1), 0)
call SetCameraTargetControllerNoZForPlayer(Player(playerIndex - 1), udg_ZRPGHero[playerIndex], 0, 0, false)
endfunction
function Trig_Item_Flussfahrt_HideAllHeroes takes location referencePoint returns nothing
local integer i = 3
loop
exitwhen i > 5
if Trig_Item_Flussfahrt_DistanceCheck(referencePoint, GetUnitLoc(udg_ZRPGHero[i]), TRIG_ITEM_FLUSSFHART_HIDE_DISTANCE) then
call Trig_Item_Flussfahrt_HideHero(i)
endif
set i = i + 1
endloop
endfunction
function Trig_Item_Flussfahrt_ShowAllHeroes takes location targetPoint returns nothing
local integer i = 3
loop
exitwhen i > 5
if Trig_Item_Flussfahrt_IsUnitHidden(udg_ZRPGHero[i]) then
call Trig_Item_Flussfahrt_ShowHero(i, targetPoint)
endif
set i = i + 1
endloop
endfunction
function Flussfahrt_Rede takes integer playerIndex, integer dialogIndex, integer key returns nothing
local string dialog1 = LoadStr(udg_DialogHashtable, key, 1)
local string dialog2 = LoadStr(udg_DialogHashtable, key, 2)
local string dialog3 = LoadStr(udg_DialogHashtable, key, 3)
local string dialog4 = LoadStr(udg_DialogHashtable, key, 4)
set udg_StringHeld[playerIndex] = ( GetHeroProperName(GetTriggerUnit()) + ": |N" )
set udg_StringZiel[playerIndex] = ( "Smole" + ": |N" )
set udg_StringDialog1[playerIndex] = ( udg_StringZiel[playerIndex] + dialog1 )
set udg_StringDialog2[playerIndex] = ( udg_StringZiel[playerIndex] + dialog2 )
set udg_StringDialog3[playerIndex] = ( udg_StringZiel[playerIndex] + dialog3 )
set udg_StringDialog4[playerIndex] = ( udg_StringZiel[playerIndex] + dialog4 )
set udg_StringDialog5[playerIndex] = udg_StringDialog4[playerIndex]
set udg_StringDialog6[playerIndex] = udg_StringDialog4[playerIndex]
set udg_Player = GetTriggerPlayer()
if GetLocalPlayer() == udg_Player then
call BlzFrameSetVisible(FrameDialog, true)
call BlzFrameSetText(FrameDialogText, udg_StringDialog1[playerIndex])
endif
endfunction
function Trig_Item_Flussfahrt_Actions takes nothing returns nothing
local location array TempPointFluss
local integer i = 0 // Deklaration von i
local integer itemId = GetItemTypeId(GetManipulatedItem())
local integer playerIndex = GetConvertedPlayerId(GetTriggerPlayer())
local integer dialogKey = 1 // Standard-Dialog-Key
set TempPointFluss[0] = GetRectCenter(gg_rct_Bootsfahrt_Steinbruch)
set TempPointFluss[1] = GetRectCenter(gg_rct_Bootscam_Steinbruch)
set TempPointFluss[2] = GetRectCenter(gg_rct_Bootsfahrt_Piratenlager)
set TempPointFluss[3] = GetRectCenter(gg_rct_Bootscam_Piratenlager)
set TempPointFluss[4] = GetUnitLoc(gg_unit_hbot_0226)
set TempPointFluss[5] = GetUnitLoc(gg_unit_hkni_0227)
set TempPointFluss[6] = GetUnitLoc(gg_unit_hkni_0640)
call UnitShareVisionBJ(true, gg_unit_hbot_0226, Player(2))
call UnitShareVisionBJ(true, gg_unit_hbot_0226, Player(3))
call UnitShareVisionBJ(true, gg_unit_hbot_0226, Player(4))
call SetUnitMoveSpeed(gg_unit_hbot_0226, TRIG_ITEM_FLUSSFHART_SPEED_SLOW)
if itemId == 'I00U' then
call RemoveItemFromStockBJ('I00T', gg_unit_hkni_0640)
if Trig_Item_Flussfahrt_DistanceCheck(TempPointFluss[5], TempPointFluss[4], TRIG_ITEM_FLUSSFHART_MOVE_DISTANCE) then
// Boot bei Steinbruch -> Piratenlager
call UnitAddAbilityBJ('Agho', gg_unit_hkni_0227)
call IssuePointOrderLocBJ(gg_unit_hbot_0226, "move", TempPointFluss[2])
call Trig_Item_Flussfahrt_HideAllHeroes(TempPointFluss[5])
call Flussfahrt_Rede(playerIndex, 1, dialogKey)
call TriggerSleepAction(TRIG_ITEM_FLUSSFHART_WAIT_TIME)
call Trig_Item_Flussfahrt_ShowAllHeroes(GetRectCenter(gg_rct_Bootsfahrt_Piratenlager))
else
// Boot soll nach Steinbruch
set dialogKey = 2 // Alternativer Dialog-Key verwenden
call AdjustPlayerStateBJ(5, GetTriggerPlayer(), PLAYER_STATE_RESOURCE_LUMBER)
call IssuePointOrderLocBJ(gg_unit_hbot_0226, "move", TempPointFluss[0])
call SetUnitMoveSpeed(gg_unit_hbot_0226, TRIG_ITEM_FLUSSFHART_SPEED_FAST)
call Flussfahrt_Rede(playerIndex, 1, 2) // Auf den alternativen Dialog zugreifen
endif
elseif itemId == 'I00T' then
call RemoveItemFromStockBJ('I00U', gg_unit_hkni_0227)
if Trig_Item_Flussfahrt_DistanceCheck(TempPointFluss[6], TempPointFluss[4], TRIG_ITEM_FLUSSFHART_MOVE_DISTANCE) then
// Boot bei Piratenlager -> Steinbruch
call UnitAddAbilityBJ('Agho', gg_unit_hkni_0640)
call IssuePointOrderLocBJ(gg_unit_hbot_0226, "move", TempPointFluss[0])
call Trig_Item_Flussfahrt_HideAllHeroes(TempPointFluss[6])
call Flussfahrt_Rede(playerIndex, 1, dialogKey)
call TriggerSleepAction(TRIG_ITEM_FLUSSFHART_WAIT_TIME)
call Trig_Item_Flussfahrt_ShowAllHeroes(GetRectCenter(gg_rct_Bootsfahrt_Steinbruch))
else
// Boot soll nach Piratenlager
set dialogKey = 2 // Alternativer Dialog-Key verwenden
call AdjustPlayerStateBJ(5, GetTriggerPlayer(), PLAYER_STATE_RESOURCE_LUMBER)
call IssuePointOrderLocBJ(gg_unit_hbot_0226, "move", TempPointFluss[2])
call SetUnitMoveSpeed(gg_unit_hbot_0226, TRIG_ITEM_FLUSSFHART_SPEED_FAST)
call Flussfahrt_Rede(playerIndex, 1, 2) // Auf den alternativen Dialog zugreifen
endif
endif
call UnitRemoveAbilityBJ('Agho', gg_unit_hkni_0227)
call UnitRemoveAbilityBJ('Agho', gg_unit_hkni_0640)
call UnitShareVisionBJ(false, gg_unit_hbot_0226, Player(2))
call UnitShareVisionBJ(false, gg_unit_hbot_0226, Player(3))
call UnitShareVisionBJ(false, gg_unit_hbot_0226, Player(4))
call UnitShareVisionBJ(false, gg_unit_hkni_0227, GetTriggerPlayer())
call UnitShareVisionBJ(false, gg_unit_hkni_0640, GetTriggerPlayer())
call AddItemToStockBJ('I00T', gg_unit_hkni_0640, 1, 1)
call AddItemToStockBJ('I00U', gg_unit_hkni_0227, 1, 1)
// Entferne TempPoints, um Speicher freizugeben
loop
exitwhen i > 6
call RemoveLocation(TempPointFluss[i])
set i = i + 1
endloop
endfunction
//===========================================================================
function InitTrig_Item_Flussfahrt takes nothing returns nothing
set gg_trg_Item_Flussfahrt = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Item_Flussfahrt, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(gg_trg_Item_Flussfahrt, Condition(function Trig_Item_Flussfahrt_Conditions))
call TriggerAddAction(gg_trg_Item_Flussfahrt, function Trig_Item_Flussfahrt_Actions)
call InitDialogs() // Initialisiert die Dialoge
endfunction
function InteragierenSound takes nothing returns nothing
local unit u = GetSpellTargetUnit()
local integer typeID = GetUnitTypeId(u)
local integer skinID = BlzGetUnitSkin(u)
local integer minIndex = LoadInteger(InteractHash, typeID, StringHash("soundMin"))
local integer maxIndex = LoadInteger(InteractHash, typeID, StringHash("soundMax"))
// Falls nichts gefunden, checke Skin
if (minIndex == 0) and (maxIndex == 0) then
set minIndex = LoadInteger(InteractHash, skinID, StringHash("soundMin"))
set maxIndex = LoadInteger(InteractHash, skinID, StringHash("soundMax"))
endif
if minIndex > 0 then
call PlaySoundOnUnitBJ(LoadSoundHandleBJ(GetRandomInt(minIndex, maxIndex), maxIndex, udg_HT_Sound), 100, u)
endif
endfunction
// Hauptbedingung für den Trigger
function Trig_InteragierenReden_Conditions takes nothing returns boolean
local unit npc = GetSpellTargetUnit()
local integer npcKey
local integer npcType
local integer npcSkin
// 1) Prüfen, ob es sich um die Interaktionsfähigkeit handelt
if GetSpellAbilityId() != 'AX06' then
return false
endif
// 2) Prüfen, ob npc existiert
if npc == null then
return false
endif
// 3) IDs ermitteln
set npcKey = GetHandleId(npc)
set npcType = GetUnitTypeId(npc)
set npcSkin = BlzGetUnitSkin(npc)
// 4) Sound nur abspielen, wenn wir in InitInteractHash MIN-Werte gespeichert haben
// (und zwar für den unitType ODER den Skin)
if HaveSavedInteger(InteractHash, npcType, StringHash("soundMin")) or HaveSavedInteger(InteractHash, npcSkin, StringHash("soundMin")) then
call InteragierenSound()
endif
// 5) Rückgabe = ob ein Dialog-String gespeichert ist
// => wenn true, wird "Trig_InteragierenReden_Actions" ausgeführt und zeigt den Dialog an.
return HaveSavedString(InteractHash, npcKey, 1)
endfunction
function HasRuneQuarz_nhym_1066 takes nothing returns boolean
return (GetSpellTargetUnit() == gg_unit_nhym_1066) and (GetPlayerState(GetOwningPlayer(GetSpellAbilityUnit()), PLAYER_STATE_RESOURCE_FOOD_USED) > 4) and (GetItemCharges(GetItemOfTypeFromUnitBJ(GetSpellAbilityUnit(), 'ledg')) == 1)
endfunction
function HasQuestOrcVsHuman_Nbbc_1672 takes nothing returns boolean
return (GetSpellTargetUnit() == gg_unit_Nbbc_1672) and (GetSpellAbilityUnit() == udg_ZRPGHero[3]) and (IsQuestDiscovered(udg_Quest[50]) == true)
endfunction
function HasDiscovSchatz_h007_0419 takes nothing returns boolean
return (GetSpellTargetUnit() == gg_unit_h007_0419) and (IsQuestDiscovered(udg_Quest[12]) == true) and (GetOwningPlayer(GetSpellAbilityUnit()) == Player(2))
endfunction
function NotDiscovSchatz_h007_0419 takes nothing returns boolean
return (GetSpellTargetUnit() == gg_unit_h007_0419) and (IsQuestDiscovered(udg_Quest[12]) == false)
endfunction
function Trig_InteragierenReden_Actions takes nothing returns nothing
local integer playerId = GetConvertedPlayerId(GetTriggerPlayer())
local unit npc = GetSpellTargetUnit()
local string npcName = GetUnitName(npc)
local string dialogText = ""
local integer npcKey = GetHandleId(npc)
local integer dialogIndex = 1 // Standardwert für den Dialog
local integer currentPage = LoadInteger(InteractHash, npcKey, StringHash("Page"))
set currentPage = LoadInteger(InteractHash, npcKey, StringHash("Page"))
if currentPage == 0 then
set currentPage = 1
endif
if npcKey == GetHandleId(gg_unit_nhym_1066) then
if HasRuneQuarz_nhym_1066() then
set currentPage = 2
call RemoveItem(GetItemOfTypeFromUnitBJ(GetSpellAbilityUnit(), 'ledg'))
call RemoveUnit(gg_unit_nhym_1066)
call AdjustPlayerStateBJ(-5, GetOwningPlayer(GetSpellAbilityUnit()), PLAYER_STATE_RESOURCE_FOOD_USED)
call ModifyGateBJ(bj_GATEOPERATION_OPEN, gg_dest_DTg1_6625)
call ShowUnitShow(gg_unit_h00F_0924)
else
set currentPage = 1
endif
endif
if HasQuestOrcVsHuman_Nbbc_1672() then
set currentPage = 2
call SetPlayerAllianceStateBJ(Player(2), Player(6), bj_ALLIANCE_UNALLIED)
call SetPlayerAllianceStateBJ(Player(6), Player(2), bj_ALLIANCE_UNALLIED)
endif
if HasDiscovSchatz_h007_0419() then
set currentPage = 1
call PauseUnitBJ(false, gg_unit_h007_0419)
call RemoveItemFromStockBJ('I01L', gg_unit_h007_0419)
call AddItemToStockBJ('I01K', gg_unit_h007_0419, 1, 1)
call SelectUnitForPlayerSingle(GetSpellTargetUnit(), GetTriggerPlayer())
elseif NotDiscovSchatz_h007_0419() then
set currentPage = 2
call PauseUnitBJ(false, gg_unit_h007_0419)
call AddItemToStockBJ('I01L', gg_unit_h007_0419, 1, 1)
call SelectUnitForPlayerSingle(GetSpellTargetUnit(), GetTriggerPlayer())
endif
if npcKey == GetHandleId(gg_unit_edot_0664) and currentPage == 3 then
call UnitRemoveAbilityBJ('Aneu', npc)
call UnitAddAbilityBJ('Aneu', npc)
endif
if npcKey == GetHandleId(gg_unit_hmtm_1586) then
call UnitAddAbilityBJ('Aneu', npc)
endif
if npcKey == GetHandleId(gg_unit_Nbbc_1672) then
if HasQuestOrcVsHuman_Nbbc_1672() then
set currentPage = 2 // Immer auf Seite 2 bleiben, wenn die Quest abgeschlossen wurde
else
set currentPage = 1 // Immer auf Seite 1 bleiben, solange die Quest NICHT abgeschlossen wurde
endif
endif
if HaveSavedString(InteractHash, npcKey, currentPage) then
set dialogText = npcName + ":|n" + LoadStr(InteractHash, npcKey, currentPage)
else
set dialogText = npcName + ":|n" + "..."
endif
// **Prüfen, ob eine weitere Seite existiert**
if HaveSavedString(InteractHash, npcKey, currentPage + 1) then
call SaveInteger(InteractHash, npcKey, StringHash("Page"), currentPage + 1) // Blättert zur nächsten Seite
else
// **Falls bereits Seite 3 erreicht wurde, bleibt sie bestehen**
if currentPage == 3 then
call SaveInteger(InteractHash, npcKey, StringHash("Page"), 3)
else
call SaveInteger(InteractHash, npcKey, StringHash("Page"), 1) // Standardverhalten: Zurück auf Seite 1
endif
endif
set udg_StringDialog1[playerId] = dialogText
set udg_StringDialog2[playerId] = dialogText
set udg_StringDialog3[playerId] = dialogText
set udg_StringDialog4[playerId] = dialogText
set udg_StringDialog5[playerId] = dialogText
set udg_StringDialog6[playerId] = dialogText
set udg_Player = GetTriggerPlayer()
if GetLocalPlayer() == udg_Player then
call BlzFrameSetVisible(FrameDialog, true)
call BlzFrameSetText(FrameDialogText, dialogText)
endif
endfunction
function InitTrig_InteragierenReden takes nothing returns nothing
set gg_trg_InteragierenReden = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_InteragierenReden, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(gg_trg_InteragierenReden, Condition(function Trig_InteragierenReden_Conditions))
call TriggerAddAction(gg_trg_InteragierenReden, function Trig_InteragierenReden_Actions)
endfunction
function Trig_Landkarte_Actions takes player trigPlayer returns nothing
local integer playerId = GetConvertedPlayerId(trigPlayer)
local boolean isInRegion
// Prüfe, ob der Held in der Region ist, indem du die Bibliotheksfunktion verwendest
set isInRegion = RPG_IsHeroInRegion(playerId)
if isInRegion then
// Aktionen ausführen, wenn der Held sich im Dungeon Bereich befindet
set udg_Player = trigPlayer
if GetLocalPlayer() == udg_Player then
call BlzFrameSetVisible(BlzGetOriginFrame(ORIGIN_FRAME_MINIMAP, 0), false)
call BlzChangeMinimapTerrainTex("war3mapImported\\Landkarte.tga")
endif
else
// Aktionen ausführen, wenn der Held sich nicht im Dungeon Bereich befindet
if RPG_HasMapItem(playerId, 'kymn') then
set udg_Player = trigPlayer
if GetLocalPlayer() == udg_Player then
call BlzFrameSetVisible(BlzGetOriginFrame(ORIGIN_FRAME_MINIMAP, 0), true)
call BlzChangeMinimapTerrainTex("war3mapImported\\Landkarte.tga")
endif
endif
endif
endfunction
function Trig_Landkarte_Helper takes nothing returns nothing
call Trig_Landkarte_Actions(GetTriggerPlayer())
endfunction
//===========================================================================
function InitTrig_Landkarte takes nothing returns nothing
set gg_trg_Landkarte = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Landkarte, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddAction(gg_trg_Landkarte, function Trig_Landkarte_Helper)
endfunction
function Trig_TeleHash_Actions takes nothing returns nothing
local integer id
call InitHashtableBJ()
set udg_TELE_HT = GetLastCreatedHashtableBJ()
// ID1
set id = 1
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00G_0908) // Raus: Bergschiff
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00G_0027) // Rein: Bergschiff
call SaveReal(udg_TELE_HT, id, 0, 0.40) // density
call SaveReal(udg_TELE_HT, id, 1, 3800.00) // startZ
call SaveReal(udg_TELE_HT, id, 2, 4500.00) // endZ
call SaveReal(udg_TELE_HT, id, 3, 40.0) // fog red
call SaveReal(udg_TELE_HT, id, 4, 40.0) // fog green
call SaveReal(udg_TELE_HT, id, 5, 40.0) // fog blue
call SaveReal(udg_TELE_HT, id, 6, 100.0) // water red
call SaveReal(udg_TELE_HT, id, 7, 100.0) // water green
call SaveReal(udg_TELE_HT, id, 8, 100.0) // water blue
call SaveReal(udg_TELE_HT, id, 9, 0.00) // water alpha
// ID2
set id = 2
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_0907) // Raus: Steinbruch Gasthaus
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00G_0888) // Rein: Steinbruch Gasthaus
call SaveReal(udg_TELE_HT, id, 10, -5800.00)
call SaveReal(udg_TELE_HT, id, 11, 6600.00)
// ID3
set id = 3
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_0905) // Raus: Steinbruch Alchie
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00G_0910) // Rein: Steinbruch Alchie
// ID4
set id = 4
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_1285) // Raus: Steinbruch Turm
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00G_0919) // Rein: Steinbruch Turm
// ID5
set id = 5
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_1258) // Raus: Koboldhöhle
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00F_0914) // Rein: Koboldhöhle
call SaveReal(udg_TELE_HT, id, 0, 0.40) // density
call SaveReal(udg_TELE_HT, id, 1, 1800.00) // startZ
call SaveReal(udg_TELE_HT, id, 2, 2500.00) // endZ
call SaveReal(udg_TELE_HT, id, 3, 60.0) // fog red
call SaveReal(udg_TELE_HT, id, 4, 40.0) // fog green
call SaveReal(udg_TELE_HT, id, 5, 40.0) // fog blue
// ID6
set id = 6
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_0373) // Raus: Stranddorf Haus
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00G_0193) // Rein: Stranddorf Haus
// ID7
set id = 7
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_0940) // Raus: Stranddorf Schule
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00G_0941) // Rein: Stranddorf Schule
// ID8
set id = 8
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_0913) // Raus: Stranddorf Schatz
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00F_0916) // Rein: Stranddorf Schatz
// ID9
set id = 9
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_0989) // Raus: Piratenlager
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00G_0955) // Rein: Piratenlager
// ID10
set id = 10
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_0911) // Raus: Markantea Gasthaus
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00G_0773) // Rein: Markantea Gasthaus
call SaveReal(udg_TELE_HT, id, 10, -8200.00)
call SaveReal(udg_TELE_HT, id, 11, 6800.00)
// ID11
set id = 11
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_0928) // Raus: Markantea Bäckerei
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00G_0499) // Rein: Markantea Bäckerei
// ID12
set id = 12
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_1248) // Raus: Ashvalan Halle
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00F_1249) // Rein: Ashvalan Halle
// ID13
set id = 13
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_0930) // Raus: Ashvalan Pyramide
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00F_0135) // Rein: Ashvalan Pyramide
call SaveReal(udg_TELE_HT, id, 0, 0.50) // density
call SaveReal(udg_TELE_HT, id, 1, 200.00) // startZ
call SaveReal(udg_TELE_HT, id, 2, 2000.00) // endZ
call SaveReal(udg_TELE_HT, id, 3, 10.0) // fog red
call SaveReal(udg_TELE_HT, id, 4, 10.0) // fog green
call SaveReal(udg_TELE_HT, id, 5, 10.0) // fog blue
// ID14
set id = 14
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_0918) // Raus: Orc Kaserne
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00G_0929) // Rein: Orc Kaserne
// ID15
set id = 15
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_1288) // Raus: Feuerhöhle Haupt
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00F_0920) // Rein: Feuerhöhle Haupt
call SaveReal(udg_TELE_HT, id, 0, 0.60) // density
call SaveReal(udg_TELE_HT, id, 1, 50.00) // startZ
call SaveReal(udg_TELE_HT, id, 2, 2500.00) // endZ
call SaveReal(udg_TELE_HT, id, 3, 86.30) // fog red
call SaveReal(udg_TELE_HT, id, 4, 19.60) // fog green
call SaveReal(udg_TELE_HT, id, 5, 5.90) // fog blue
call SaveReal(udg_TELE_HT, id, 6, 100.0) // water red
call SaveReal(udg_TELE_HT, id, 7, 0.00) // water green
call SaveReal(udg_TELE_HT, id, 8, 0.00) // water blue
call SaveReal(udg_TELE_HT, id, 9, 0.00) // water alpha
// ID16
set id = 16
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_0912) // Raus: Feuerhöhle Neben
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00F_0921) // Rein: Feuerhöhle Neben
// ID17
set id = 17
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_0915) // Raus: Bärenhöhle
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00F_0917) // Rein: Bärenhöhle
call SaveReal(udg_TELE_HT, id, 0, 0.45) // density
call SaveReal(udg_TELE_HT, id, 1, 200.00) // startZ
call SaveReal(udg_TELE_HT, id, 2, 2000.00) // endZ
call SaveReal(udg_TELE_HT, id, 3, 80.0) // fog red
call SaveReal(udg_TELE_HT, id, 4, 85.0) // fog green
call SaveReal(udg_TELE_HT, id, 5, 10.0) // fog blue
// ID18
set id = 18
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_0308) // Raus: Wolfhöhle
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00F_0458) // Rein: Wolfhöhle
// ID19
set id = 19
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_1048) // Raus: Todesrittertempel
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00F_0204) // Rein: Todesrittertempel
call SaveReal(udg_TELE_HT, id, 0, 0.40) // density
call SaveReal(udg_TELE_HT, id, 1, 1000.00) // startZ
call SaveReal(udg_TELE_HT, id, 2, 2500.00) // endZ
call SaveReal(udg_TELE_HT, id, 3, 11.7) // fog red
call SaveReal(udg_TELE_HT, id, 4, 31.0) // fog green
call SaveReal(udg_TELE_HT, id, 5, 0.0) // fog blue
// ID20
set id = 20
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_0972) // Raus: Ungeheuerhöhle
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00F_0926) // Rein: Ungeheuerhöhle
// ID21
set id = 21
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_0906) // Raus: Burg Tiedenpracht
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00G_0909) // Rein: Burg Tiedenpracht
// ID22
set id = 22
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_1496) // Raus: Gasthaus Tiedenpracht
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00G_1492) // Rein: Gasthaus Tiedenpracht
call SaveReal(udg_TELE_HT, id, 10, -16233.00)
call SaveReal(udg_TELE_HT, id, 11, 11000.00)
// ID23
set id = 23
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_h00F_0924) // Raus: Bergtempel
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00F_0123) // Rein: Bergtempel
call SaveReal(udg_TELE_HT, id, 0, 0.40) // density
call SaveReal(udg_TELE_HT, id, 1, 1600.00) // startZ
call SaveReal(udg_TELE_HT, id, 2, 2800.00) // endZ
call SaveReal(udg_TELE_HT, id, 3, 31.0) // fog red
call SaveReal(udg_TELE_HT, id, 4, 11.7) // fog green
call SaveReal(udg_TELE_HT, id, 5, 0.0) // fog blue
// ID24
set id = 24
call SaveUnitHandle(udg_TELE_HT, id, 1, gg_unit_nhym_0887) // Raus: Bergtempel Nebenausgang
call SaveUnitHandle(udg_TELE_HT, id, 2, gg_unit_h00F_0808) // Rein: Bergtempel Nebenausgang
endfunction
function InitTrig_TeleHash takes nothing returns nothing
set gg_trg_TeleHash = CreateTrigger()
call TriggerRegisterTimerEventSingle(gg_trg_TeleHash, 5)
call TriggerAddAction(gg_trg_TeleHash, function Trig_TeleHash_Actions)
endfunction
// ------------------------------------
// Prüft, ob die Einheit die richtigen Typen hat ('h00F' oder 'h00G')
// Löst den Trigger nur aus, wenn GetTriggerUnit() == 'h00F' oder 'h00G'
// ------------------------------------
function Trig_Teleport_Conditions takes nothing returns boolean
local integer unitId = GetUnitTypeId(GetTriggerUnit())
return unitId == 'h00F' or unitId == 'h00G'
endfunction
// ------------------------------------
// Ursprüngliche Funktion (kann ungenutzt bleiben):
// Gibt jeweils den ERSTEN gefundenen Helden zurück.
// ------------------------------------
function GetTargetUnitInRange takes unit triggerUnit, real range returns unit
if IsUnitInRange(triggerUnit, gg_unit_HC71_0017, range) then
return gg_unit_HC71_0017
elseif IsUnitInRange(triggerUnit, gg_unit_OC63_0012, range) then
return gg_unit_OC63_0012
elseif IsUnitInRange(triggerUnit, gg_unit_H005_0061, range) then
return gg_unit_H005_0061
endif
return null
endfunction
// ------------------------------------
// Lädt Fog- und Water-Settings für einen gegebenen ID-Eintrag aus udg_TELE_HT
// und wendet sie nur auf den lokalen Spieler (ownerPlayer) an
// ------------------------------------
function LoadFogAndWaterSettings takes integer id, player ownerPlayer returns nothing
local real density = LoadReal(udg_TELE_HT, id, 0)
local real startZ = LoadReal(udg_TELE_HT, id, 1)
local real endZ = LoadReal(udg_TELE_HT, id, 2)
local real red = LoadReal(udg_TELE_HT, id, 3)
local real green = LoadReal(udg_TELE_HT, id, 4)
local real blue = LoadReal(udg_TELE_HT, id, 5)
local real waterRed = LoadReal(udg_TELE_HT, id, 6)
local real waterGreen = LoadReal(udg_TELE_HT, id, 7)
local real waterBlue = LoadReal(udg_TELE_HT, id, 8)
local real waterAlpha = LoadReal(udg_TELE_HT, id, 9)
if GetLocalPlayer() == ownerPlayer then
call SetTerrainFogExBJ(0, startZ, endZ, density, red, green, blue)
call SetWaterBaseColorBJ(waterRed, waterGreen, waterBlue, waterAlpha)
endif
endfunction
// ------------------------------------
// Lädt eine Location aus Hashtabelle-Index (id, 10) + (id, 11)
// ------------------------------------
function LoadXY takes integer id returns location
local real x = LoadReal(udg_TELE_HT, id, 10)
local real y = LoadReal(udg_TELE_HT, id, 11)
return Location(x, y)
endfunction
// ------------------------------------
// Prüft, ob eine Einheit ein Held ist.
// Wird z. B. in HandleGasthaus verwendet.
// ------------------------------------
function IsHeroUnitInRange takes nothing returns boolean
return IsUnitType(GetFilterUnit(), UNIT_TYPE_HERO)
endfunction
// ------------------------------------
// Gasthaus-Logik: Türen schließen, wenn kein Held in Reichweite ist
// ------------------------------------
function HandleGasthaus takes unit unitRef, integer id returns nothing
local location targetLoc = LoadXY(id)
if (CountUnitsInGroup(GetUnitsInRangeOfLocMatching(1300.00, targetLoc, Condition(function IsHeroUnitInRange))) == 0) then
call SetUnitAnimation(unitRef, "stand")
call UnitAddTypeBJ(UNIT_TYPE_PEON, unitRef)
call UnitAddTypeBJ(UNIT_TYPE_MECHANICAL, unitRef)
call UnitRemoveAbilityBJ('Aeth', unitRef)
endif
call RemoveLocation(targetLoc)
endfunction
// ------------------------------------
// GRUPPENBASIERTE Fassung von Trig_Teleport_Actions:
// - GetTriggerUnit() ist hier 'h00F' oder 'h00G' (der Teleporter).
// - Wir holen ALLE Helden im Radius von 300.0 um den Teleporter.
// - Für JEDEN Helden führen wir die Aktionen aus (FogSettings, Gasthaus, etc.)
// ------------------------------------
function Trig_Teleport_Actions takes nothing returns nothing
local unit teleporter = GetTriggerUnit() // 'h00F' oder 'h00G'
local group nearbyHeroes = CreateGroup()
local unit hero = null
local player ownerPlayer = null
local integer id = 0
local integer maxId = 24
local real range = 300.0
// Gruppe aller Einheiten (potenziell Helden) im Umkreis
call GroupEnumUnitsInRange(nearbyHeroes, GetUnitX(teleporter), GetUnitY(teleporter), range, null)
// Durchgehen der Gruppe
loop
set hero = FirstOfGroup(nearbyHeroes)
exitwhen hero == null
call GroupRemoveUnit(nearbyHeroes, hero)
// Prüfen, ob es wirklich ein Held (Spieler-Held) ist
if IsUnitType(hero, UNIT_TYPE_HERO) then
set ownerPlayer = GetOwningPlayer(hero)
// --- Beispiel: Landkarten-Aktionen für diesen Held-Besitzer
call Trig_Landkarte_Actions(ownerPlayer)
// Nun die alte Hashtabelle-Logik
set id = 1
loop
// Prüfen, ob der Teleporter in der Hashtabelle mit (id,1) oder (id,2) gespeichert wurde
if (LoadUnitHandle(udg_TELE_HT, id, 1) == teleporter) then
// Entspricht dem alten Block:
if id == 5 or id == 8 or id == 13 or id == 15 or id == 16 or id == 17 or id == 18 or id == 19 or id == 23 or id == 24 then
call LoadFogAndWaterSettings(1, ownerPlayer)
elseif id == 2 then
call HandleGasthaus(gg_unit_nfrt_1361, id)
elseif id == 4 then
call ModifyGateBJ(bj_GATEOPERATION_CLOSE, gg_dest_DTg7_2428)
elseif id == 10 then
call HandleGasthaus(gg_unit_nfrt_1362, id)
elseif id == 22 then
call HandleGasthaus(gg_unit_nfrt_1491, id)
endif
exitwhen true
endif
if (LoadUnitHandle(udg_TELE_HT, id, 2) == teleporter) then
// Entspricht dem alten Block:
if id == 5 then
call LoadFogAndWaterSettings(5, ownerPlayer)
elseif id == 13 then
call LoadFogAndWaterSettings(13, ownerPlayer)
elseif id == 15 or id == 16 then
call LoadFogAndWaterSettings(15, ownerPlayer)
elseif id == 8 or id == 17 or id == 18 then
call LoadFogAndWaterSettings(17, ownerPlayer)
elseif id == 19 then
call LoadFogAndWaterSettings(19, ownerPlayer)
elseif id == 23 then
call LoadFogAndWaterSettings(23, ownerPlayer)
endif
exitwhen true
endif
set id = id + 1
exitwhen id > maxId
endloop
endif
endloop
call DestroyGroup(nearbyHeroes)
endfunction
// ------------------------------------
// Einfacher Init-Trigger:
// Registriert, wenn 'h00F'/'h00G' sich einem der 3 Helden (gg_unit_HC71_0017,
// gg_unit_OC63_0012, gg_unit_H005_0061) auf 200 Range nähert.
// ------------------------------------
function InitTrig_Teleport takes nothing returns nothing
set gg_trg_Teleport = CreateTrigger()
call TriggerRegisterUnitInRangeSimple(gg_trg_Teleport, 200.00, gg_unit_HC71_0017)
call TriggerRegisterUnitInRangeSimple(gg_trg_Teleport, 200.00, gg_unit_OC63_0012)
call TriggerRegisterUnitInRangeSimple(gg_trg_Teleport, 200.00, gg_unit_H005_0061)
call TriggerAddCondition(gg_trg_Teleport, Condition(function Trig_Teleport_Conditions))
call TriggerAddAction(gg_trg_Teleport, function Trig_Teleport_Actions)
endfunction
function IsGateDestroyed takes nothing returns boolean
return not IsDestructableAliveBJ(gg_dest_LTg1_2583)
endfunction
function Trig_StadtTor_InRange_Conditions takes nothing returns boolean
return IsUnitAlly(GetTriggerUnit(), Player(1)) // Nur Verbündete von Player(1) auslösen lassen
endfunction
function Trig_StadtTor_Item_Conditions takes nothing returns boolean
return GetItemTypeId(GetManipulatedItem()) == 'I01I'
endfunction
function Trig_StadtTor_Actions takes nothing returns nothing
call ModifyGateBJ(bj_GATEOPERATION_OPEN, gg_dest_LTg1_2583)
call TriggerSleepAction(8.00)
if IsGateDestroyed() then
call ModifyGateBJ(bj_GATEOPERATION_CLOSE, gg_dest_LTg1_2583)
endif
endfunction
//===========================================================================
function InitTrig_StadtTor takes nothing returns nothing
local trigger trigInRange = CreateTrigger()
local trigger trigPickup = CreateTrigger()
// Trigger für Einheiten in Reichweite (nur Verbündete von Player(1))
call TriggerRegisterUnitInRangeSimple(trigInRange, 600.00, gg_unit_nef0_0196)
call TriggerAddCondition(trigInRange, Condition(function Trig_StadtTor_InRange_Conditions))
call TriggerAddAction(trigInRange, function Trig_StadtTor_Actions)
// Trigger für das Aufheben eines bestimmten Items
call TriggerRegisterAnyUnitEventBJ(trigPickup, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddCondition(trigPickup, Condition(function Trig_StadtTor_Item_Conditions))
call TriggerAddAction(trigPickup, function Trig_StadtTor_Actions)
endfunction
function Trig_BigDeedsBoss_Conditions takes nothing returns boolean
if ( not ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true ) ) then
return false
endif
if ( not ( GetPlayerController(GetOwningPlayer(GetTriggerUnit())) == MAP_CONTROL_USER ) ) then
return false
endif
return true
endfunction
function Trig_BigDeedsBoss_Func008A takes nothing returns nothing
call UnitRemoveAbility( GetEnumUnit(), 'Agho' )
call SetUnitPathing( GetEnumUnit(), true )
endfunction
function Trig_BigDeedsBoss_Actions takes nothing returns nothing
local location localTempPoint
local texttag localDialogZiel = null
call DisableTrigger( GetTriggeringTrigger() )
call DisableTrigger( gg_trg_RedenPiratenboss )
set udg_QuestHeld = GetTriggerUnit()
call UnitRemoveAbility( gg_unit_Hdgo_0323, 'AX42' )
call AddSpecialEffectTargetUnitBJ( "hand", gg_unit_Hmkg_0361, BlzGetItemStringField(UnitItemInSlotBJ(gg_unit_Hmkg_0361, 1), ITEM_SF_MODEL_USED) )
set udg_TempUnitType = 'n01C'
set udg_TempGroup = GetUnitsOfType(udg_TempUnitType)
call ForGroup( udg_TempGroup, function Trig_BigDeedsBoss_Func008A )
call DestroyGroup(udg_TempGroup)
call RemoveUnit( gg_unit_Hmkg_0239 )
set udg_MusicBoss = true
call SetUnitInvulnerable( gg_unit_Hdgo_0323, false )
call IssueTargetOrderBJ( gg_unit_Hmkg_0361, "acidbomb", gg_unit_Hdgo_0323 )
call SetUnitTurnSpeedBJ( udg_QuestHeld, 0.01 )
call SetUnitMoveSpeed( udg_QuestHeld, 20.00 )
call TriggerSleepAction( 1.50 )
call UnitRemoveAbility( gg_unit_Hdgo_0323, 'AX43' )
set udg_SpezEffekt = AddSpecialEffectTarget( "Abilities\\Spells\\Undead\\Sleep\\SleepTarget.mdl", gg_unit_Hdgo_0323, "overhead" )
call SetUnitAnimation( gg_unit_Hdgo_0323, "death" )
call TriggerSleepAction( 1.50 )
call SetUnitInvulnerable( gg_unit_Hdgo_0323, true )
call SetUnitManaPercentBJ( gg_unit_Hdgo_0323, 0.00 )
call SetUnitTimeScalePercent( gg_unit_Hdgo_0323, 0.00 )
if gg_unit_Hmkg_0361 != null then
set localTempPoint = PolarProjectionBJ(GetUnitLoc(gg_unit_Hmkg_0361), 200.00, ( GetUnitFacing(gg_unit_Hmkg_0361) + 60.00 ))
else
set localTempPoint = Location(0, 0) // Fallback für Sicherheit
endif
if localDialogZiel != null then
call DestroyTextTag(localDialogZiel)
endif
call IssueImmediateOrderBJ( GetTriggerUnit(), "stop" )
call CreateTextTagLocBJ( "TRIGSTR_030", localTempPoint, 50.00, 10, 100.00, 100, 50.00, 0 )
set localDialogZiel = GetLastCreatedTextTag()
call SetTextTagPermanentBJ( localDialogZiel, false )
call SetTextTagLifespanBJ( localDialogZiel, 8.00 )
call RemoveLocation(localTempPoint)
call TriggerSleepAction( 7.00 )
call SetUnitTurnSpeedBJ( udg_QuestHeld, 1.00 )
call SetUnitMoveSpeed( udg_QuestHeld, GetUnitDefaultMoveSpeed(udg_QuestHeld) )
call UnitRemoveAbility( gg_unit_Hmkg_0361, 'Abun' )
call SetUnitInvulnerable( gg_unit_Hmkg_0361, false )
call EnableTrigger( gg_trg_BigDeedsStart )
call EnableTrigger( gg_trg_BigDeedsAttack )
call EnableTrigger( gg_trg_BigDeedsWin )
set localTempPoint = null
set localDialogZiel = null
endfunction
//===========================================================================
function InitTrig_BigDeedsBoss takes nothing returns nothing
set gg_trg_BigDeedsBoss = CreateTrigger( )
call DisableTrigger( gg_trg_BigDeedsBoss )
call TriggerRegisterUnitInRangeSimple( gg_trg_BigDeedsBoss, 400.00, gg_unit_Hmkg_0361 )
call TriggerAddCondition( gg_trg_BigDeedsBoss, Condition( function Trig_BigDeedsBoss_Conditions ) )
call TriggerAddAction( gg_trg_BigDeedsBoss, function Trig_BigDeedsBoss_Actions )
endfunction
function Trig__The_Shadow_Forest_Conditions takes nothing returns boolean
if ( not ( IsUnitDeadBJ(gg_unit_ogrk_1058) == true ) ) then
return false
endif
if ( not ( IsUnitDeadBJ(gg_unit_ohun_0934) == true ) ) then
return false
endif
if ( not ( IsUnitDeadBJ(gg_unit_ohun_0933) == true ) ) then
return false
endif
if ( not ( IsUnitDeadBJ(gg_unit_ohun_0840) == true ) ) then
return false
endif
if ( not ( IsUnitDeadBJ(gg_unit_ohun_1059) == true ) ) then
return false
endif
if ( not ( IsUnitDeadBJ(gg_unit_nchg_1060) == true ) ) then
return false
endif
if ( not ( IsUnitDeadBJ(gg_unit_ogrk_1061) == true ) ) then
return false
endif
if ( not ( IsUnitDeadBJ(gg_unit_nchg_1062) == true ) ) then
return false
endif
if ( not ( IsUnitDeadBJ(gg_unit_ogrk_1063) == true ) ) then
return false
endif
return true
endfunction
function Trig__The_Shadow_Forest_Q takes nothing returns boolean
if ( not ( IsQuestDiscovered(udg_Quest[20]) == false ) ) then
return false
endif
return true
endfunction
function Trig__The_Shadow_Forest_Actions takes nothing returns nothing
local unit u = gg_unit_Hjnd_1104
call DisableTrigger( GetTriggeringTrigger() )
if ( Trig__The_Shadow_Forest_Q() ) then
call CreateMinimapIconOnUnitBJ( u, 255, 193, 0, "UI\\Minimap\\MiniMap-Goldmine.mdl", FOG_OF_WAR_MASKED )
set udg_MiniMap[20] = GetLastCreatedMinimapIcon()
call UnitRemoveAbilityBJ( 'AX42', u )
call CreateQuestBJ( bj_QUESTTYPE_REQ_DISCOVERED, "TRIGSTR_1137", "TRIGSTR_1138", "ReplaceableTextures\\CommandButtons\\BTNSentinel.blp" )
set udg_Quest[20] = GetLastCreatedQuestBJ()
call QuestSetTitleBJ( udg_Quest[20], "TRIGSTR_1139" )
endif
call QuestMessageBJ( GetPlayersAll(), bj_QUESTMESSAGE_UPDATED, ( GetAbilityName('Apts') + ( " The Shadow Forest" + GetAbilityName('Aap1') ) ) )
call CreateQuestItemBJ( udg_Quest[20], "TRIGSTR_1140" )
call UnitRemoveAbilityBJ( 'AX43', u )
call UnitAddAbilityBJ( 'AX44', u )
set u = null
endfunction
//===========================================================================
function InitTrig__The_Shadow_Forest takes nothing returns nothing
set gg_trg__The_Shadow_Forest = CreateTrigger( )
call DisableTrigger( gg_trg__The_Shadow_Forest )
call TriggerRegisterPlayerUnitEventSimple( gg_trg__The_Shadow_Forest, Player(0), EVENT_PLAYER_UNIT_DEATH )
call TriggerAddCondition( gg_trg__The_Shadow_Forest, Condition( function Trig__The_Shadow_Forest_Conditions ) )
call TriggerAddAction( gg_trg__The_Shadow_Forest, function Trig__The_Shadow_Forest_Actions )
endfunction
function Trig_TheTeleporter3_Conditions takes nothing returns boolean
return GetUnitTypeId(GetDyingUnit()) == 'nico'
endfunction
function Trig_TheTeleporter3_Actions takes nothing returns nothing
local location tempPoint = GetUnitLoc(GetDyingUnit())
local effect spezEffekt = AddSpecialEffectLoc("Objects\\Spawnmodels\\Other\\NeutralBuildingExplosion\\NeutralBuildingExplosion.mdl", tempPoint)
call DestroyEffect(spezEffekt)
call RemoveLocation(tempPoint)
endfunction
//===========================================================================
function InitTrig_TheTeleporter3 takes nothing returns nothing
set gg_trg_TheTeleporter3 = CreateTrigger( )
call DisableTrigger( gg_trg_TheTeleporter3 )
call TriggerRegisterPlayerUnitEvent(gg_trg_TheTeleporter3, Player(8), EVENT_PLAYER_UNIT_DEATH, null)
call TriggerAddCondition( gg_trg_TheTeleporter3, Condition( function Trig_TheTeleporter3_Conditions ) )
call TriggerAddAction( gg_trg_TheTeleporter3, function Trig_TheTeleporter3_Actions )
endfunction
//===========================================================================
// Trigger: Key Events Combined
//===========================================================================
function Trig_Key_Events_Conditions takes nothing returns boolean
// Alle Tastendrücke zulassen
return true
endfunction
function Trig_Key_Events_Actions takes nothing returns nothing
local player trigPlayer = GetTriggerPlayer()
local integer playerId = GetConvertedPlayerId(trigPlayer)
local oskeytype keyCode = BlzGetTriggerPlayerKey() // oskeytype statt integer
local boolean isKeyDown = BlzGetTriggerPlayerIsKeyDown() // true für Pressed, false für Released
// W-Taste
if (keyCode == OSKEY_W) then
if (isKeyDown) then
set udg_TasteDruckW[playerId] = true
call ConditionalTriggerExecute(gg_trg_Move)
else
set udg_TasteDruckW[playerId] = false
call IssueImmediateOrderBJ(udg_ZRPGHero[playerId], "stop")
endif
endif
// A-Taste
if (keyCode == OSKEY_A) then
if (isKeyDown) then
set udg_TasteDruckA[playerId] = true
call ConditionalTriggerExecute(gg_trg_Move)
else
set udg_TasteDruckA[playerId] = false
endif
endif
// S-Taste
if (keyCode == OSKEY_S) then
if (isKeyDown) then
set udg_TasteDruckS[playerId] = true
set udg_TasteDruckW[playerId] = false
set udg_TasteDruckA[playerId] = false
set udg_TasteDruckD[playerId] = false
call ConditionalTriggerExecute(gg_trg_Move)
else
set udg_TasteDruckS[playerId] = false
set udg_TasteDruckW[playerId] = false
set udg_TasteDruckA[playerId] = false
set udg_TasteDruckD[playerId] = false
endif
endif
// D-Taste
if (keyCode == OSKEY_D) then
if (isKeyDown) then
set udg_TasteDruckD[playerId] = true
call ConditionalTriggerExecute(gg_trg_Move)
else
set udg_TasteDruckD[playerId] = false
endif
endif
set trigPlayer = null
endfunction
//===========================================================================
function InitTrig_Key_Events takes nothing returns nothing
local integer Index = 0
set gg_trg_Key_Events = CreateTrigger()
call TriggerAddAction(gg_trg_Key_Events, function Trig_Key_Events_Actions)
loop
exitwhen Index > 4
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_Key_Events, Player(Index), OSKEY_W, 0, true)
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_Key_Events, Player(Index), OSKEY_W, 0, false)
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_Key_Events, Player(Index), OSKEY_A, 0, true)
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_Key_Events, Player(Index), OSKEY_A, 0, false)
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_Key_Events, Player(Index), OSKEY_S, 0, true)
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_Key_Events, Player(Index), OSKEY_S, 0, false)
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_Key_Events, Player(Index), OSKEY_D, 0, true)
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_Key_Events, Player(Index), OSKEY_D, 0, false)
set Index = Index + 1
endloop
endfunction
globals
constant real MOVE_DISTANCE = 100.00
constant real MOVE_SPEED_ADJUST = 40.00
constant real TURN_SPEED_ADJUST = 20.00
constant real TURN_ANGLE = 29.00
endglobals
// -------------------------------------------------------------
// Original-Funktion zum Überprüfen von Tasten (unverändert)
function CheckKeyPress takes boolean w, boolean d, boolean a, boolean s, boolean expectedW, boolean expectedD, boolean expectedA, boolean expectedS returns boolean
return (w == expectedW and d == expectedD and a == expectedA and s == expectedS)
endfunction
// -------------------------------------------------------------
// "Bed"-Funktionen für jeden Spieler-Index i (statt nur für [3])
function Trig_Move_BedAlleIndex takes integer i returns boolean
return udg_TasteDruckW[i] or udg_TasteDruckD[i] or udg_TasteDruckA[i] or udg_TasteDruckS[i]
endfunction
function Trig_Move_BedLinksIndex takes integer i returns boolean
return CheckKeyPress(udg_TasteDruckW[i], udg_TasteDruckD[i], udg_TasteDruckA[i], udg_TasteDruckS[i], false, false, true, false)
endfunction
function Trig_Move_BedRechtsIndex takes integer i returns boolean
return CheckKeyPress(udg_TasteDruckW[i], udg_TasteDruckD[i], udg_TasteDruckA[i], udg_TasteDruckS[i], false, true, false, false)
endfunction
function Trig_Move_BedLinksVorwIndex takes integer i returns boolean
return CheckKeyPress(udg_TasteDruckW[i], udg_TasteDruckD[i], udg_TasteDruckA[i], udg_TasteDruckS[i], true, false, true, false)
endfunction
function Trig_Move_BedRechtsVorwIndex takes integer i returns boolean
return CheckKeyPress(udg_TasteDruckW[i], udg_TasteDruckD[i], udg_TasteDruckA[i], udg_TasteDruckS[i], true, true, false, false)
endfunction
function Trig_Move_BedStopIndex takes integer i returns boolean
return udg_TasteDruckS[i]
endfunction
function Trig_Move_BedTerrCheckIndex takes integer i returns boolean
return not IsTerrainPathableBJ(udg_TerrainCheckLoc[i], PATHING_TYPE_WALKABILITY)
endfunction
function Trig_Move_BedVorwIndex takes integer i returns boolean
return CheckKeyPress(udg_TasteDruckW[i], udg_TasteDruckD[i], udg_TasteDruckA[i], udg_TasteDruckS[i], true, false, false, false)
endfunction
// -------------------------------------------------------------
// Bewegungsfunktionen (unverändert, nur "index" statt fixem [3])
function Trig_Move_BedDrehen takes boolean rechts, integer index returns nothing
local real angle = TURN_ANGLE
if not rechts then
set angle = -TURN_ANGLE
endif
call SetUnitFacingTimed(udg_ZRPGHero[index], GetUnitFacing(udg_ZRPGHero[index]) + angle, 0.20)
endfunction
function SetUnitMovement takes integer index, real distance, real angleAdjustment returns nothing
local real facing = GetUnitFacing(udg_ZRPGHero[index])
local location newLoc = PolarProjectionBJ(GetUnitLoc(udg_ZRPGHero[index]), distance, facing + angleAdjustment)
call IssuePointOrderLocBJ(udg_ZRPGHero[index], "move", newLoc)
call RemoveLocation(newLoc)
endfunction
function AdjustTerrainReal takes real terrainReal returns real
// Reset von terrainReal, wenn außerhalb der Grenzen
if terrainReal > 21.00 then
return 20.00
elseif terrainReal < 4.20 then
return 4.50
endif
return terrainReal
endfunction
// -------------------------------------------------------------
// Haupttrigger: Für Spieler-Index 3, 4 und 5 (in einer Schleife)
function Trig_Move_Actions takes nothing returns nothing
local integer i = 3
local location currentHeroLoc
local location terrainCheckLoc
local real facing
local real moveSpeed
local real terrainReal
// Boolean-Variablen
local boolean bedAlle
local boolean bedVorw
local boolean bedStop
local boolean bedRechtsVorw
local boolean bedLinksVorw
local boolean bedRechts
local boolean bedLinks
// Schleife von i=3 bis i=5
loop
exitwhen i > 5
// Lokale Werte für diesen Spieler i
set currentHeroLoc = GetUnitLoc(udg_ZRPGHero[i])
set facing = GetUnitFacing(udg_ZRPGHero[i])
set moveSpeed = GetUnitMoveSpeed(udg_ZRPGHero[i])
set terrainReal = AdjustTerrainReal(udg_TerrainReal[i])
//call DisplayTextToPlayer(Player(i - 1), 0, 0, "terrainReal für Spieler " + I2S(i) + ": " + R2S(terrainReal))
// Boolean-Checks für Spieler i
set bedAlle = Trig_Move_BedAlleIndex(i)
set bedVorw = Trig_Move_BedVorwIndex(i)
set bedStop = Trig_Move_BedStopIndex(i)
set bedRechtsVorw = Trig_Move_BedRechtsVorwIndex(i)
set bedLinksVorw = Trig_Move_BedLinksVorwIndex(i)
set bedRechts = Trig_Move_BedRechtsIndex(i)
set bedLinks = Trig_Move_BedLinksIndex(i)
// Wenn keine Taste gedrückt, dann nichts tun
if bedAlle then
// Wenn Vorwärts
if bedVorw then
// Gelände-Check
set terrainCheckLoc = PolarProjectionBJ(currentHeroLoc, MOVE_DISTANCE, facing)
set udg_TerrainCheckLoc[i] = terrainCheckLoc
if Trig_Move_BedTerrCheckIndex(i) then
call SetUnitPropWindow(udg_ZRPGHero[i], 1)
call SetUnitMovement(i, moveSpeed + MOVE_SPEED_ADJUST, 0)
set terrainReal = terrainReal / 1.3
else
call SetUnitMovement(i, 10.00, 0)
endif
call RemoveLocation(terrainCheckLoc)
else
// 180-Grad-Drehung (Stop)
if bedStop then
call SetUnitFacingTimed(udg_ZRPGHero[i], facing + 180.00, 0.40)
else
// Rechts + Vorwärts
if bedRechtsVorw then
set terrainReal = terrainReal + 0.3
call SetUnitMovement(i, moveSpeed + TURN_SPEED_ADJUST, -terrainReal)
// Links + Vorwärts
elseif bedLinksVorw then
set terrainReal = terrainReal + 0.3
call SetUnitMovement(i, moveSpeed + TURN_SPEED_ADJUST, terrainReal)
// Nur drehen (Rechts / Links)
else
if bedRechts then
call Trig_Move_BedDrehen(false, i)
elseif bedLinks then
call Trig_Move_BedDrehen(true, i)
endif
endif
endif
endif
endif
// Aufräumen & Terrain-Wert zurückschreiben
call RemoveLocation(currentHeroLoc)
set udg_TerrainReal[i] = terrainReal
// Nächster Spieler
set i = i + 1
endloop
endfunction
// -------------------------------------------------------------
// Trigger-Initialisierung
function InitTrig_Move takes nothing returns nothing
set gg_trg_Move = CreateTrigger()
call TriggerRegisterTimerEventPeriodic(gg_trg_Move, 0.25)
call TriggerAddAction(gg_trg_Move, function Trig_Move_Actions)
endfunction
function Trig_LaufFaehigkeiten_Conditions takes nothing returns boolean
local unit orderedUnit = GetOrderedUnit()
return (GetPlayerController(GetOwningPlayer(orderedUnit)) == MAP_CONTROL_USER) and IsUnitType(orderedUnit, UNIT_TYPE_HERO)
endfunction
function Trig_LaufFaehigkeiten_DistanceCondition takes real x0, real y0, real x1, real y1 returns boolean
return (SquareRoot((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)) <= 1000.00)
endfunction
function Trig_LaufFaehigkeiten_Actions takes nothing returns nothing
local unit orderedUnit = GetOrderedUnit()
local integer playerId = GetConvertedPlayerId(GetOwningPlayer(orderedUnit))
local unit targetUnit = GetOrderTargetUnit()
local real tempX0 = GetUnitX(orderedUnit)
local real tempY0 = GetUnitY(orderedUnit)
local real tempX1 = 0.0
local real tempY1 = 0.0
if targetUnit != null then
set tempX1 = GetUnitX(targetUnit)
set tempY1 = GetUnitY(targetUnit)
else
return
endif
set udg_TasteDruckW[playerId] = false
set udg_TasteDruckA[playerId] = false
set udg_TasteDruckD[playerId] = false
if Trig_LaufFaehigkeiten_DistanceCondition(tempX0, tempY0, tempX1, tempY1) then
call SetUnitPropWindow(udg_ZRPGHero[playerId], 1)
else
call SetUnitPropWindow(udg_ZRPGHero[playerId], 0)
endif
endfunction
//===========================================================================
function InitTrig_LaufFaehigkeiten takes nothing returns nothing
local integer playerId = 0
set gg_trg_LaufFaehigkeiten = CreateTrigger()
// Registriere nur Einheiten der Spieler 3 bis 5
loop
exitwhen playerId > 2
call TriggerRegisterPlayerUnitEvent(gg_trg_LaufFaehigkeiten, Player(playerId + 2), EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER, null)
set playerId = playerId + 1
endloop
call BJDebugMsg("Spieler " + I2S(playerId) + ": Laufklick")
call TriggerAddCondition(gg_trg_LaufFaehigkeiten, Condition(function Trig_LaufFaehigkeiten_Conditions))
call TriggerAddAction(gg_trg_LaufFaehigkeiten, function Trig_LaufFaehigkeiten_Actions)
endfunction
function Trig_HeldBeleb_Actions takes nothing returns nothing
local unit target = GetSpellTargetUnit()
local player targetPlayer = GetOwningPlayer(target)
local integer playerIndex = GetConvertedPlayerId(targetPlayer)
local location revivePoint = Location(9344.00, -3744.00)
call ReviveHeroLoc(udg_ZRPGHero[playerIndex], revivePoint, true)
call UnitAddItemByIdSwapped('I00S', udg_ZRPGHero[playerIndex])
call SetUnitOwner(udg_ZRPGHeroStirbt[playerIndex], Player(PLAYER_NEUTRAL_PASSIVE), false)
set udg_ZRotaAutoAn[playerIndex] = true
set udg_ZRotaHohZHero[playerIndex] = true
set udg_Player = targetPlayer
if GetLocalPlayer() == udg_Player then
call SetDoodadAnimationRectBJ( "death", 'YSw1', udg_REGI_EntRect[1] )
call SetDoodadAnimationRectBJ( "death", 'YSw1', udg_REGI_EntRect[4] )
call SetWaterBaseColorBJ( 100, 100.00, 100.00, 0.00 )
call SetTerrainFogExBJ( 0, 3800.00, 4500.00, 0.40, 40.00, 40.00, 40.00 )
endif
// Speicherbereinigung
call CinematicFadeBJ(bj_CINEFADETYPE_FADEIN, 0.00, "ReplaceableTextures\\CameraMasks\\Black_mask.blp", 0, 0, 0, 0)
call RemoveLocation(revivePoint)
set revivePoint = null
set target = null
set targetPlayer = null
endfunction
function InitTrig_HeldBeleb takes nothing returns nothing
set gg_trg_HeldBeleb = CreateTrigger()
call TriggerRegisterUnitEvent(gg_trg_HeldBeleb, gg_unit_n012_0884, EVENT_UNIT_SPELL_CAST)
call TriggerAddAction(gg_trg_HeldBeleb, function Trig_HeldBeleb_Actions)
endfunction
function Trig_HeldStirbt_Conditions takes nothing returns boolean
if ( not IsUnitType(GetDyingUnit(), UNIT_TYPE_HERO) ) then
return false
endif
if ( GetItemOfTypeFromUnitBJ(GetDyingUnit(), 'ankh') != null ) then
return false
endif
return true
endfunction
function CheckKillerPlayer takes nothing returns boolean
if ( GetOwningPlayer(GetKillingUnitBJ()) == Player(13) ) then
return true
endif
if ( GetOwningPlayer(GetKillingUnitBJ()) == Player(7) ) then
return true
endif
return false
endfunction
function CheckQuestAndKiller takes nothing returns boolean
if ( not IsQuestCompleted(udg_Quest[1]) ) then
return false
endif
if ( not CheckKillerPlayer() ) then
return false
endif
return true
endfunction
function Trig_HeldStirbt_Actions takes nothing returns nothing
local integer playerIndex = GetConvertedPlayerId(GetTriggerPlayer())
local unit dyingHero = GetDyingUnit()
local real x = GetUnitX(dyingHero)
local real y = GetUnitY(dyingHero)
set udg_StringZiel[playerIndex] = " "
call UnitRemoveAbilityBJ( 'AX56', dyingHero )
call UnitRemoveBuffBJ( 'B012', dyingHero )
call IssueImmediateOrderBJ( udg_UnitExtraDmg[playerIndex], "stop" )
call SetPlayerAllianceStateBJ( GetOwningPlayer(dyingHero), Player(6), bj_ALLIANCE_ALLIED )
call SetPlayerAllianceStateBJ( GetOwningPlayer(dyingHero), Player(11), bj_ALLIANCE_ALLIED )
call SetPlayerAllianceStateBJ( GetOwningPlayer(dyingHero), Player(13), bj_ALLIANCE_ALLIED )
if ( CheckQuestAndKiller() ) then
call ModifyGateBJ( bj_GATEOPERATION_CLOSE, gg_dest_DTg7_2428 )
call SetPlayerAllianceStateBJ( Player(9), GetOwningPlayer(dyingHero), bj_ALLIANCE_ALLIED )
call SetPlayerAllianceStateBJ( Player(13), GetOwningPlayer(dyingHero), bj_ALLIANCE_ALLIED )
set udg_BoolGefaengnis = true
set udg_StringDialog1[playerIndex] = udg_StringZiel[playerIndex] + "|cffff0000You have been arrested for your crimes|r"
set udg_Player = GetTriggerPlayer()
if GetLocalPlayer() == udg_Player then
call BlzFrameSetVisible(BlzGetOriginFrame(ORIGIN_FRAME_MINIMAP,0), false)
call SetDoodadAnimationRectBJ( "death", 'YSw1', udg_REGI_EntRect[1] )
call SetDoodadAnimationRectBJ( "death", 'YSw1', udg_REGI_EntRect[4] )
call SetWaterBaseColorBJ( 100, 100.00, 100.00, 0.00 )
call SetTerrainFogExBJ( 0, 3800.00, 4500.00, 0.40, 40.00, 40.00, 40.00 )
call BlzFrameSetVisible(FrameDialog, true)
call BlzFrameSetText(FrameDialogText, udg_StringDialog1[playerIndex])
endif
set udg_TempPoint = Location(-11380.00, 8000.00)
call ReviveHeroLoc( dyingHero, udg_TempPoint, false )
call RemoveLocation(udg_TempPoint)
else
call SetUnitPosition(udg_ZRPGHeroStirbt[playerIndex], x, y)
call SetUnitOwner(udg_ZRPGHeroStirbt[playerIndex], Player(playerIndex - 1), false)
set udg_ZRotaFocusHero[playerIndex] = false
set udg_ZRotaHohZHero[playerIndex] = false
set udg_StringDialog1[playerIndex] = udg_StringZiel[playerIndex] + "|cffff0000You have been fatally wounded|r"
set udg_Player = GetTriggerPlayer()
if GetLocalPlayer() == udg_Player then
call SetCameraTargetController(udg_ZRPGHeroStirbt[playerIndex], 0.00, 0.00, true)
call BlzFrameSetVisible(CastbarExtra, false)
call BlzFrameSetVisible(FrameDialog, true)
call BlzFrameSetText(FrameDialogText, udg_StringDialog1[playerIndex])
call CinematicFadeBJ( bj_CINEFADETYPE_FADEOUT, 2.00, "ReplaceableTextures\\CameraMasks\\IceFilter_Mask.blp", 30.00, 0.00, 0.00, 0 )
endif
endif
set udg_StringDialog2[playerIndex] = udg_StringDialog1[playerIndex]
set udg_StringDialog3[playerIndex] = udg_StringDialog1[playerIndex]
set udg_StringDialog4[playerIndex] = udg_StringDialog1[playerIndex]
set udg_StringDialog5[playerIndex] = udg_StringDialog1[playerIndex]
set udg_StringDialog6[playerIndex] = udg_StringDialog1[playerIndex]
endfunction
//===========================================================================
function InitTrig_HeldStirbt takes nothing returns nothing
set gg_trg_HeldStirbt = CreateTrigger()
call TriggerRegisterPlayerUnitEventSimple( gg_trg_HeldStirbt, Player(2), EVENT_PLAYER_UNIT_DEATH )
call TriggerRegisterPlayerUnitEventSimple( gg_trg_HeldStirbt, Player(3), EVENT_PLAYER_UNIT_DEATH )
call TriggerRegisterPlayerUnitEventSimple( gg_trg_HeldStirbt, Player(4), EVENT_PLAYER_UNIT_DEATH )
call TriggerAddCondition( gg_trg_HeldStirbt, Condition( function Trig_HeldStirbt_Conditions ) )
call TriggerAddAction( gg_trg_HeldStirbt, function Trig_HeldStirbt_Actions )
endfunction
//----------------------------------------------------------
// Prüft, ob ein neuer Dialog-Quest verfügbar ist
//----------------------------------------------------------
function Trig_DialogKnopfEndeQu takes nothing returns boolean
return udg_DialogNeueQuest
endfunction
//----------------------------------------------------------
// Prüft, ob Held tot ist, ob Quest[2] abgeschlossen ist
// und ob Max-HP >= 100 (=> Wiederbelebungs-Bedingung)
//----------------------------------------------------------
function Trig_DialogKnopfEndeRe takes nothing returns boolean
// 1) Held muss tot sein
if not IsUnitDeadBJ(udg_ZRPGHero[udg_Pint]) then
return false
endif
// 2) Quest[2] muss abgeschlossen sein
if not IsQuestCompleted(udg_Quest[2]) then
return false
endif
// 3) Held muss mind. 100 Max-HP haben
// => also: wenn < 100, dann return false
if BlzGetUnitMaxHP(udg_ZRPGHero[udg_Pint]) < 100 then
return false
endif
return true
endfunction
//----------------------------------------------------------
// Prüft nur, ob der Held tot ist (für Niederlage)
//----------------------------------------------------------
function Trig_DialogKnopfEndeDe takes nothing returns boolean
if not IsUnitDeadBJ(udg_ZRPGHero[udg_Pint]) then
return false
endif
return true
endfunction
//----------------------------------------------------------
// Haupt-Aktion des Triggers (1:1 die alte Reihenfolge)
//----------------------------------------------------------
function Trig_DialogKnopfEnde_Actions takes nothing returns nothing
// ----------------------------------------------------
// 1) Player-Index bestimmen und globale Variablen & 2) Nur für den lokalen Spieler Frame ausblenden
// ----------------------------------------------------
set udg_Pint = R2I(udg_RealKnopfEnde)
set udg_DialogKnopfEnde[udg_Pint] = true
set udg_DialogTabelle[udg_Pint] = 1
set udg_Player = GetTriggerPlayer()
if GetLocalPlayer() == udg_Player then
call BlzFrameSetVisible(FrameDialog, false)
endif
// ----------------------------------------------------
// 3) Bewegungseinstellungen (Ursprung wiederherstellen)
// ----------------------------------------------------
call SetUnitTurnSpeedBJ(udg_ZRPGHero[udg_Pint], 1.00)
call SetUnitMoveSpeed(udg_ZRPGHero[udg_Pint], GetUnitDefaultMoveSpeed(udg_ZRPGHero[udg_Pint]))
// ----------------------------------------------------
// 4) Hier jetzt genau die Reihenfolge
// A) Neuer Quest?
// B) Wiederbelebung?
// C) Niederlage (Held tot)?
// D) Fallback
// ----------------------------------------------------
if Trig_DialogKnopfEndeQu() then
// A) Neuer Quest
set udg_DialogNeueQuest = false
call QuestMessageBJ(GetPlayersAll(), bj_QUESTMESSAGE_DISCOVERED, "|cffffff96Ω|r |cffffcc00received new Quest:|r " + udg_StringQuest[udg_Pint])
else
if Trig_DialogKnopfEndeRe() then
// B) Wiederbelebung
call SetCameraFieldForPlayer(udg_Player, CAMERA_FIELD_TARGET_DISTANCE, 2500.00, 0.00)
call SetCameraFieldForPlayer(udg_Player, CAMERA_FIELD_ZOFFSET, 300.00, 0.00)
call SetCameraFieldForPlayer(udg_Player, CAMERA_FIELD_ROTATION, 180.00, 0.00)
call ResetToGameCameraForPlayer(udg_Player, 4.00)
call IssueTargetOrder(gg_unit_n012_0884, "channel", udg_ZRPGHeroAusr[udg_Pint])
// Beispiel: Held an bestimmten Punkt setzen
call SetUnitPosition(udg_ZRPGHero[udg_Pint], 9344.00, -3744.00)
call SetCameraTargetControllerNoZForPlayer(udg_Player, udg_ZRPGHero[udg_Pint], 0, 0, false)
else
if Trig_DialogKnopfEndeDe() then
// C) Niederlage (Held ist tot, aber keine Wiederbelebung)
call ConditionalTriggerExecute(gg_trg_PlayerLeave1)
call CustomDefeatBJ(udg_PlayerNr[udg_Pint], "TRIGSTR_067")
else
// D) Fallback
// => Nur "Klick" ohne weitere Aktion, außer Variablen leeren
// (genau wie im alten Code)
endif
endif
endif
// ----------------------------------------------------
// 5) Aufräumen
// ----------------------------------------------------
set udg_RealKnopfEnde = 0.00
set udg_Pint = 0
endfunction
//----------------------------------------------------------
// Initialisierung des Triggers
//----------------------------------------------------------
function InitTrig_DialogKnopfEnde takes nothing returns nothing
set gg_trg_DialogKnopfEnde = CreateTrigger()
// Trigger feuert, sobald udg_RealKnopfEnde != 0.00
call TriggerRegisterVariableEvent(gg_trg_DialogKnopfEnde, "udg_RealKnopfEnde", NOT_EQUAL, 0.00)
// Action-Funktion zuweisen
call TriggerAddAction(gg_trg_DialogKnopfEnde, function Trig_DialogKnopfEnde_Actions)
endfunction
// ===========================================================================
// ================ KONDITIONEN (rechts / links) =============================
// ===========================================================================
function ConditionRightClick takes nothing returns boolean
return BlzGetTriggerPlayerMouseButton() == MOUSE_BUTTON_TYPE_RIGHT
endfunction
function ConditionLeftClick takes nothing returns boolean
return BlzGetTriggerPlayerMouseButton() == MOUSE_BUTTON_TYPE_LEFT
endfunction
// ===========================================================================
// ================ RECHTSKLICK-LOGIK ========================================
// ===========================================================================
function OnRightClickOverride takes nothing returns nothing
local player p = GetTriggerPlayer()
local integer pid = GetPlayerId(p) + 1 // Player(2)->3, Player(3)->4, Player(4)->5
local unit hero = udg_ZRPGHero[pid]
local unit focus
local real mx
local real my
// Nur wenn Held nicht ausgewählt ist, leiten wir den Klick an den Helden weiter
if not IsUnitSelected(hero, p) and IsUnitAliveBJ(hero) then
call SelectUnitForPlayerSingle(hero, p)
endif
endfunction
function ActionRightClick takes nothing returns nothing
// Führt beim Rechtsklick die OnRightClickOverride-Logik aus
call OnRightClickOverride()
endfunction
// ===========================================================================
// ================ LINKSKLICK-LOGIK =========================================
// ===========================================================================
function ActionLeftClick takes nothing returns nothing
local player p = GetTriggerPlayer()
local integer pid = GetConvertedPlayerId(p)
// Setzt deine Tastenvariablen auf false
set udg_TasteDruckW[pid] = false
set udg_TasteDruckA[pid] = false
set udg_TasteDruckD[pid] = false
endfunction
// ===========================================================================
// ================ HAUPTFUNKTION MIT 2 LOKALEN TRIGGERN =====================
// ===========================================================================
function InitTrig_MausDruck takes nothing returns nothing
local trigger tRight = CreateTrigger()
local trigger tLeft = CreateTrigger()
local integer i = 2 // Player(2)=Spieler3 bis Player(4)=Spieler5
// Damit der World Editor diesen "Haupttrigger" kennt.
set gg_trg_MausDruck = CreateTrigger()
// Registriere Rechts- und Linksklick für Spieler 3..5
loop
exitwhen i > 4
// RECHTS-KLICK
call TriggerRegisterPlayerEvent(tRight, Player(i), EVENT_PLAYER_MOUSE_DOWN)
call TriggerAddCondition(tRight, Condition(function ConditionRightClick))
call TriggerAddAction(tRight, function ActionRightClick)
// LINKS-KLICK
call TriggerRegisterPlayerEvent(tLeft, Player(i), EVENT_PLAYER_MOUSE_DOWN)
call TriggerAddCondition(tLeft, Condition(function ConditionLeftClick))
call TriggerAddAction(tLeft, function ActionLeftClick)
set i = i + 1
endloop
// Aufräumen lokaler Variablen
set tRight = null
set tLeft = null
endfunction
function Trig_B_Actions takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer())
set udg_InvKnopfRucks = pid
endfunction
//===========================================================================
function InitTrig_B takes nothing returns nothing
local integer i = 2 // Start bei Spieler 3
set gg_trg_B = CreateTrigger()
call TriggerAddAction(gg_trg_B, function Trig_B_Actions)
loop
exitwhen i > 4 // Ende bei Spieler 5
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_B, Player(i), OSKEY_B, 0, false)
set i = i + 1
endloop
endfunction
function Trig_C_Actions takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer()) + 1
local unit caster = udg_ZRPGHero[pid]
call IssueImmediateOrder(caster, "battleroar")
endfunction
//===========================================================================
function InitTrig_C takes nothing returns nothing
local integer i = 2 // Start bei Spieler 3
set gg_trg_C = CreateTrigger()
call TriggerAddAction(gg_trg_C, function Trig_C_Actions)
loop
exitwhen i > 4 // Nur für Spieler 3, 4, 5 aktivieren
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_C, Player(i), OSKEY_C, 0, false)
set i = i + 1
endloop
endfunction
function Trig_F_Actions takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer()) + 1
local unit caster = udg_ZRPGHero[pid]
local unit target = udg_SelectUnit[pid]
local real targetX
local real targetY
if target != null then
set targetX = GetUnitX(target)
set targetY = GetUnitY(target)
call IssuePointOrder(caster, "clusterrockets", targetX, targetY)
endif
endfunction
//===========================================================================
function InitTrig_F takes nothing returns nothing
local integer i = 2
set gg_trg_F = CreateTrigger()
call TriggerAddAction(gg_trg_F, function Trig_F_Actions)
loop
exitwhen i > 4
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_F, Player(i), OSKEY_F, 0, false)
set i = i + 1
endloop
endfunction
function Trig_G_IsRanger takes nothing returns boolean
local integer pid = GetPlayerId(GetTriggerPlayer()) + 1
local string unitName = GetUnitName(udg_ZRPGHero[pid])
return unitName == "Waldläuferin" or unitName == "Ranger"
endfunction
function Trig_G_Actions takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer()) + 1
local unit caster = udg_ZRPGHero[pid]
local unit target = udg_SelectUnit[pid]
// Prüfen, ob das Ziel existiert
if target != null then
call IssueTargetOrder(caster, "soulburn", target)
call IssueTargetOrder(caster, "shadowstrike", target)
call IssueTargetOrder(caster, "thunderbolt", target)
// Zusätzlicher Befehl nur für Waldläuferin oder Ranger
if Trig_G_IsRanger() then
call IssueTargetOrder(caster, "firebolt", target)
endif
endif
endfunction
//===========================================================================
function InitTrig_G takes nothing returns nothing
local integer i = 2
set gg_trg_G = CreateTrigger()
call TriggerAddAction(gg_trg_G, function Trig_G_Actions)
loop
exitwhen i > 4
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_G, Player(i), OSKEY_G, 0, false)
set i = i + 1
endloop
endfunction
function Trig_H_IsRanger takes integer pid returns boolean
local string unitName = GetUnitName(udg_ZRPGHero[pid])
return unitName == "Waldläuferin" or unitName == "Ranger"
endfunction
function Trig_H_Actions takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer()) + 1
local unit caster = udg_ZRPGHero[pid]
local unit target = udg_SelectUnit[pid]
// Prüfen, ob das Ziel existiert
if target != null then
call IssueTargetOrder(caster, "fingerofdeath", target)
call IssueImmediateOrder(caster, "taunt")
call IssueImmediateOrder(caster, "stomp")
call IssueTargetOrder(caster, "holybolt", target)
call IssueTargetOrder(caster, "frostnova", target)
// Zusätzlicher Befehl nur für Waldläuferin oder Ranger
if Trig_H_IsRanger(pid) then
call IssueTargetOrder(caster, "thunderbolt", target)
endif
endif
endfunction
//===========================================================================
function InitTrig_H takes nothing returns nothing
local integer i = 2
set gg_trg_H = CreateTrigger()
call TriggerAddAction(gg_trg_H, function Trig_H_Actions)
loop
exitwhen i > 4
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_H, Player(i), OSKEY_H, 0, false)
set i = i + 1
endloop
endfunction
function Trig_J_Actions takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer()) + 1
local unit caster = udg_ZRPGHero[pid]
local unit target = udg_SelectUnit[pid]
call IssueImmediateOrder(caster, "undivineshield")
call IssueImmediateOrder(caster, "divineshield")
call IssueImmediateOrder(caster, "manashieldoff")
call IssueImmediateOrder(caster, "manashieldon")
call IssueImmediateOrder(caster, "starfall")
// Zielbasierter Befehl nur ausführen, wenn ein Ziel existiert
if target != null then
call IssueTargetOrder(caster, "magicleash", target)
endif
endfunction
//===========================================================================
function InitTrig_J takes nothing returns nothing
local integer i = 2
set gg_trg_J = CreateTrigger()
call TriggerAddAction(gg_trg_J, function Trig_J_Actions)
loop
exitwhen i > 4 // Nur für Spieler 3, 4, 5 aktivieren
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_J, Player(i), OSKEY_J, 0, false)
set i = i + 1
endloop
endfunction
function Trig_R_Actions takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer()) + 1
local unit caster = udg_ZRPGHero[pid]
call IssueImmediateOrder(caster, "thunderclap")
endfunction
//===========================================================================
function InitTrig_R takes nothing returns nothing
local integer i = 2
set gg_trg_R = CreateTrigger()
call TriggerAddAction(gg_trg_R, function Trig_R_Actions)
loop
exitwhen i > 4 // Nur für Spieler 3, 4, 5 aktivieren
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_R, Player(i), OSKEY_R, 0, false)
set i = i + 1
endloop
endfunction
function Trig_U_Actions takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer()) + 1
local unit caster = udg_ZRPGHero[pid]
local unit target = udg_SelectUnit[pid]
local real targetX
local real targetY
if target != null then
set targetX = GetUnitX(target)
set targetY = GetUnitY(target)
// Reihenfolge der Befehle für maximale Effizienz
call IssueImmediateOrder(caster, "whirlwind")
call IssueTargetOrder(caster, "chainlightning", target)
call IssuePointOrder(caster, "darkportal", targetX, targetY)
call IssueImmediateOrder(caster, "windwalk")
call IssueTargetOrder(caster, "cripple", target)
endif
endfunction
//===========================================================================
function InitTrig_U takes nothing returns nothing
local integer i = 2
set gg_trg_U = CreateTrigger()
call TriggerAddAction(gg_trg_U, function Trig_U_Actions)
loop
exitwhen i > 4
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_U, Player(i), OSKEY_U, 0, false)
set i = i + 1
endloop
endfunction
function Trig_T_Actions takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer()) + 1
local unit caster = udg_ZRPGHero[pid]
local unit target = udg_SelectUnit[pid]
// Prüfen, ob das Ziel existiert
if target != null then
call IssueTargetOrder(caster, "polymorph", target)
endif
endfunction
//===========================================================================
function InitTrig_T takes nothing returns nothing
local integer i = 2
set gg_trg_T = CreateTrigger()
call TriggerAddAction(gg_trg_T, function Trig_T_Actions)
loop
exitwhen i > 4
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_T, Player(i), OSKEY_T, 0, false)
set i = i + 1
endloop
endfunction
function Trig_Y_Actions takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer()) + 1
local unit caster = udg_ZRPGHero[pid]
local unit target = udg_SelectUnit[pid]
if target != null then
call IssueTargetOrder(caster, "firebolt", target)
call IssueTargetOrder(caster, "drain", target)
call IssueImmediateOrderById(caster, 852285) // Order-ID bleibt erhalten
endif
endfunction
//===========================================================================
function InitTrig_Y takes nothing returns nothing
local integer i = 2
set gg_trg_Y = CreateTrigger()
call TriggerAddAction(gg_trg_Y, function Trig_Y_Actions)
loop
exitwhen i > 4
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_Y, Player(i), OSKEY_Y, 0, false)
set i = i + 1
endloop
endfunction
function Trig_X_Actions takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer()) + 1
local unit caster = udg_ZRPGHero[pid]
call IssueImmediateOrderById(caster, 852273)
endfunction
//===========================================================================
function InitTrig_X takes nothing returns nothing
local integer i = 2
set gg_trg_X = CreateTrigger()
call TriggerAddAction(gg_trg_X, function Trig_X_Actions)
loop
exitwhen i > 4
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_X, Player(i), OSKEY_X, 0, false)
set i = i + 1
endloop
endfunction
function Trig_V_Actions takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer()) + 1
local unit caster = udg_ZRPGHero[pid]
call IssueImmediateOrder(caster, "avatar")
endfunction
//===========================================================================
function InitTrig_V takes nothing returns nothing
local integer i = 2
set gg_trg_V = CreateTrigger()
call TriggerAddAction(gg_trg_V, function Trig_V_Actions)
loop
exitwhen i > 4
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_V, Player(i), OSKEY_V, 0, false)
set i = i + 1
endloop
endfunction
function Trig_Z_Actions takes nothing returns nothing
local integer pid = GetPlayerId(GetTriggerPlayer()) + 1
local unit caster = udg_ZRPGHero[pid]
local unit target = udg_SelectUnit[pid]
if target != null then
call IssueTargetOrder(caster, "drunkenhaze", target)
endif
endfunction
//===========================================================================
function InitTrig_Z takes nothing returns nothing
local integer i = 2
set gg_trg_Z = CreateTrigger()
call TriggerAddAction(gg_trg_Z, function Trig_Z_Actions)
loop
exitwhen i > 4
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_Z, Player(i), OSKEY_Z, 0, false)
set i = i + 1
endloop
endfunction
function Trig_Backspace_Allowed takes nothing returns boolean
return GetPlayerId(GetTriggerPlayer()) != 1
endfunction
function Trig_BACK_Actions takes nothing returns nothing
local integer playerId = GetPlayerId(GetTriggerPlayer()) + 1
set udg_ZRotaFocusHero[playerId] = true
endfunction
function InitTrig_BACK takes nothing returns nothing
local integer i = 2
set gg_trg_BACK = CreateTrigger()
call TriggerAddCondition(gg_trg_BACK, Condition(function Trig_Backspace_Allowed))
call TriggerAddAction(gg_trg_BACK, function Trig_BACK_Actions)
loop
exitwhen i > 4
call BlzTriggerRegisterPlayerKeyEvent(gg_trg_BACK, Player(i), OSKEY_BACKSPACE, 0, false)
set i = i + 1
endloop
endfunction
globals
player array activePlayers // Spieler, die die rechte Maustaste halten
constant real ROTATION_STEP = 0.1 // Schrittweise Rotation der Kamera in Grad
constant real MAX_ROTATION = 390.0 // Maximale Rotationsbegrenzung, um chaotische Effekte zu vermeiden
constant real MAX_DISTANCE = 450.0 // Maximalwert für die Kameradistanz
real MIN_DISTANCE = 130.0 // Minimalwert für die Kameradistanz
constant real DISTANCE_INCREMENT = 50.0 // Schrittweite für die Distanzanpassung
trigger mouseDownTrigger
trigger mouseUpTrigger
trigger mouseMoveTrigger
trigger zoomTrigger // Trigger für die Q-Taste
real array currentRotation // Speichert die aktuelle Blickrichtung
real array referenceMouseX // Speichert die Fixpunkt-X-Position der Maus beim Drücken der rechten Maustaste
real array referenceMouseY // Speichert die Fixpunkt-Y-Position der Maus beim Drücken der rechten Maustaste
real array v // Speichert die Kameradistanz für jeden Spieler
real array initialCameraAngle // Speichert die ursprüngliche Kameraposition beim Drücken der rechten Maustaste
boolean array isZoomingOut // Gibt an, ob die Kamera gerade verkleinert wird
// Variablen für "1 Sekunde gedrückt halten"
boolean array isMouseDown // True, solange die rechte Maustaste (RMB) gedrückt ist
real array pressStartTime // Zeitpunkt, an dem die RMB gedrückt wurde
// Eigene "Spielzeit", die wir im Periodic-Trigger inkrementieren,
// weil TimerGetGameTime() nicht in allen JASS-Versionen zur Verfügung steht.
real gGameTime = 0.0
endglobals
function GetPlayerMouseX takes player p returns real
return BlzGetTriggerPlayerMouseX()
endfunction
function GetPlayerMouseY takes player p returns real
return BlzGetTriggerPlayerMouseY()
endfunction
function AdjustCameraZ takes real z, player p returns nothing
if GetLocalPlayer() == p then
set z = GetCameraField(CAMERA_FIELD_ZOFFSET) + z - GetCameraTargetPositionZ()
call SetCameraField(CAMERA_FIELD_ZOFFSET, z, 0.25)
endif
endfunction
function RAbs takes real value returns real
if value < 0 then
return -value
endif
return value
endfunction
function OnZoomKeyPress takes nothing returns nothing
local integer playerId = GetPlayerId(GetTriggerPlayer()) + 1
if GetLocalPlayer() == Player(playerId - 1) then
// Wenn die Kamera gerade rauszoomt (verkleinert) und MAX_DISTANCE nicht erreicht ist, vergrößere die Entfernung
if isZoomingOut[playerId] then
set v[playerId] = v[playerId] + DISTANCE_INCREMENT
// Wenn MAX_DISTANCE erreicht ist, wechsle zu reinzoomen
if v[playerId] >= MAX_DISTANCE then
set v[playerId] = MAX_DISTANCE
set isZoomingOut[playerId] = false // Wechsel zu reinzoomen
endif
else
// Ansonsten verringere die Entfernung
set v[playerId] = v[playerId] - DISTANCE_INCREMENT
// Wenn MIN_DISTANCE erreicht ist, wechsle zu rauszoomen
if v[playerId] <= MIN_DISTANCE then
set v[playerId] = MIN_DISTANCE
set isZoomingOut[playerId] = true
endif
endif
// Kameraentfernung aktualisieren
call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, v[playerId], 0.5)
// Set MIN_DISTANCE zurück auf den Ausgangswert, wenn MAX_DISTANCE erreicht wird
if v[playerId] >= MAX_DISTANCE then
set MIN_DISTANCE = 130.0
elseif isZoomingOut[playerId] and v[playerId] < MAX_DISTANCE then
set MIN_DISTANCE = v[playerId]
endif
endif
endfunction
function Trig_RPG_Camera_Actions takes nothing returns nothing
local integer i = 1
local real x
local real y
local real z
local real facingRad
local location l
local boolean b
local boolean udg_lastPathingResult = false
local real x1
local real y1
local real z1
local real angleOfAttack
local integer iterationCount
// NEU: Die globale Zeit wird alle 0.25 Sekunden (TimerEventPeriodic) erhöht
set gGameTime = gGameTime + 0.25
loop
exitwhen i > bj_MAX_PLAYERS
// NEU: Prüfen, ob der Spieler die rechte Maustaste hält
// und ob bereits 1 Sekunde um ist -> erst dann activePlayers[i] setzen
if isMouseDown[i] then
if pressStartTime[i] > 0 and (gGameTime - pressStartTime[i]) >= 0.7 then
// Nur setzen, falls noch nicht geschehen
if activePlayers[i] == null then
set activePlayers[i] = Player(i - 1)
endif
endif
else
// Wenn Maustaste nicht gedrückt, sicherstellen, dass kein aktiver Spieler mehr gesetzt ist
set activePlayers[i] = null
endif
// Beispiel: Unabhängige Höhenanpassung
if not (udg_ZRotaHohZHero[i] == false) then
set x = GetUnitX(udg_ZRPGHero[i])
set y = GetUnitY(udg_ZRPGHero[i])
set l = Location(x, y)
set z = GetLocationZ(l)
call RemoveLocation(l)
call AdjustCameraZ(z + 100, Player(i - 1)) // Höhenanpassung
endif
// Nur fortfahren, wenn die rechte Maustaste nicht (bzw. noch nicht) "aktiv" ist
// und ein Held vorhanden ist
if activePlayers[i] == null and udg_ZRPGHero[i] != null then
if v[i] == 0 then
set v[i] = MIN_DISTANCE
endif
set x = GetUnitX(udg_ZRPGHero[i])
set y = GetUnitY(udg_ZRPGHero[i])
set l = Location(x, y)
set z = GetLocationZ(l)
call RemoveLocation(l)
set facingRad = GetUnitFacing(udg_ZRPGHero[i]) * bj_DEGTORAD
set x1 = x + 64 * Cos(facingRad)
set y1 = y + 64 * Sin(facingRad)
set l = Location(x1, y1)
set z1 = GetLocationZ(l)
call RemoveLocation(l)
// Überprüfung der Pathing-Barriere zur Anpassung der Kameradistanz
set iterationCount = 0
loop
exitwhen iterationCount > 10 // Maximal 10 Iterationen
set b = IsTerrainPathable(x1, y1, PATHING_TYPE_WALKABILITY)
if b != udg_lastPathingResult and v[i] < 400 then
if not b then
set v[i] = RMaxBJ(v[i] - DISTANCE_INCREMENT, MIN_DISTANCE) // Verhindert, dass v[i] unter MIN_DISTANCE fällt
else
set v[i] = v[i] + DISTANCE_INCREMENT
endif
set udg_lastPathingResult = b
endif
if not b and v[i] > MIN_DISTANCE then
set v[i] = RMaxBJ(v[i] - 25, MIN_DISTANCE) // Verhindert, dass v[i] unter MIN_DISTANCE fällt
else
exitwhen true
endif
// Verhindere, dass die Kameradistanz MAX_DISTANCE überschreitet
if v[i] > MAX_DISTANCE then
set v[i] = MAX_DISTANCE
exitwhen true
elseif v[i] < MIN_DISTANCE then
set v[i] = MIN_DISTANCE
exitwhen true
endif
set iterationCount = iterationCount + 1
endloop
if GetLocalPlayer() == Player(i - 1) then
// Anpassung der AOA auf und ab von Bergen und Entfernungskorrektur Gebäuden
set angleOfAttack = 335 + ((z1 - z) * 0.5)
if angleOfAttack < 300 then
set angleOfAttack = 300
elseif angleOfAttack > 350 then
set angleOfAttack = 350
endif
call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, v[i], 1.0)
call SetCameraField(CAMERA_FIELD_FIELD_OF_VIEW, 120, 0)
call SetCameraField(CAMERA_FIELD_FARZ, 5000, 5)
if not (udg_ZRotaFocusHero[i] == false) then
call SetCameraTargetController(udg_ZRPGHero[i], 0, 0, true)
endif
if not (udg_ZRotaAOAHero[i] == false) then
call SetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK, angleOfAttack, 0.5)
endif
if not (udg_ZRotaAutoAn[i] == false) then
call SetCameraField(CAMERA_FIELD_ROTATION, GetUnitFacing(udg_ZRPGHero[i]), udg_ZRotaSpeed[i])
else
call SetCameraField(CAMERA_FIELD_ROTATION, currentRotation[i], 10.0 + i)
endif
endif
endif
set i = i + 1
endloop
endfunction
function UpdateCameraRotation takes integer playerId returns nothing
local real mouseX
local real mouseY
local real angleToMouse
local real relativeAngle
local real cameraAngle
local real camX = GetCameraTargetPositionX()
local real camY = GetCameraTargetPositionY()
if activePlayers[playerId] != null then
set mouseX = GetPlayerMouseX(Player(playerId - 1))
set mouseY = GetPlayerMouseY(Player(playerId - 1))
set cameraAngle = initialCameraAngle[playerId]
set angleToMouse = Atan2(mouseY - camY, mouseX - camX) * bj_RADTODEG
set relativeAngle = angleToMouse - cameraAngle
// Normalisiere den relativen Winkel
loop
exitwhen relativeAngle >= -180 and relativeAngle <= 180
if relativeAngle > 180 then
set relativeAngle = relativeAngle - 360
elseif relativeAngle < -180 then
set relativeAngle = relativeAngle + 360
endif
endloop
if GetLocalPlayer() == Player(playerId - 1) then
// Überprüfe, ob sich die Kamera überhaupt ändern muss
if RAbs(relativeAngle) > 0.01 then
call SetCameraField(CAMERA_FIELD_ROTATION, angleToMouse, 0.5)
set currentRotation[playerId] = angleToMouse
endif
endif
endif
endfunction
// -------------------
// Maus-Events
// -------------------
function OnMouseDown takes nothing returns nothing
local integer playerId = GetPlayerId(GetTriggerPlayer()) + 1
if BlzGetTriggerPlayerMouseButton() == MOUSE_BUTTON_TYPE_RIGHT then
// NEU: Statt activePlayers direkt zu setzen, merken wir nur, dass die Maustaste gedrückt wurde
set isMouseDown[playerId] = true
// Statt TimerGetGameTime -> gGameTime
set pressStartTime[playerId] = gGameTime
// Diese Werte speichern wir trotzdem jetzt schon,
// falls nach >= 1 Sekunde tatsächlich rotiert werden soll.
set referenceMouseX[playerId] = GetPlayerMouseX(GetTriggerPlayer())
set referenceMouseY[playerId] = GetPlayerMouseY(GetTriggerPlayer())
set initialCameraAngle[playerId] = GetCameraField(CAMERA_FIELD_ROTATION)
endif
endfunction
function OnMouseUp takes nothing returns nothing
local integer playerId = GetPlayerId(GetTriggerPlayer()) + 1
if BlzGetTriggerPlayerMouseButton() == MOUSE_BUTTON_TYPE_RIGHT then
// NEU: Beim Loslassen wird der Status zurückgesetzt
set isMouseDown[playerId] = false
set pressStartTime[playerId] = 0
set activePlayers[playerId] = null
endif
endfunction
function OnMouseMove takes nothing returns nothing
local integer playerId = GetPlayerId(GetTriggerPlayer()) + 1
call UpdateCameraRotation(playerId)
endfunction
function SubTrCameraRotation takes nothing returns nothing
local integer i = 0
set mouseDownTrigger = CreateTrigger()
set mouseUpTrigger = CreateTrigger()
set mouseMoveTrigger = CreateTrigger()
set zoomTrigger = CreateTrigger() // Initialisierung des Zoom-Triggers
loop
exitwhen i >= bj_MAX_PLAYERS
if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING then
call TriggerRegisterPlayerEvent(mouseDownTrigger, Player(i), EVENT_PLAYER_MOUSE_DOWN)
call TriggerRegisterPlayerEvent(mouseUpTrigger, Player(i), EVENT_PLAYER_MOUSE_UP)
call TriggerRegisterPlayerEvent(mouseMoveTrigger, Player(i), EVENT_PLAYER_MOUSE_MOVE)
// Q-Taste
call BlzTriggerRegisterPlayerKeyEvent(zoomTrigger, Player(i), OSKEY_Q, 0, true)
endif
set i = i + 1
endloop
call TriggerAddAction(mouseDownTrigger, function OnMouseDown)
call TriggerAddAction(mouseUpTrigger, function OnMouseUp)
call TriggerAddAction(mouseMoveTrigger, function OnMouseMove)
call TriggerAddAction(zoomTrigger, function OnZoomKeyPress)
call EnableTrigger(mouseDownTrigger)
call EnableTrigger(mouseUpTrigger)
call EnableTrigger(mouseMoveTrigger)
call EnableTrigger(zoomTrigger)
endfunction
function InitTrig_RPG_Camera takes nothing returns nothing
set gg_trg_RPG_Camera = CreateTrigger()
call TriggerRegisterTimerEventPeriodic(gg_trg_RPG_Camera, 0.25)
call TriggerAddAction(gg_trg_RPG_Camera, function Trig_RPG_Camera_Actions)
call SubTrCameraRotation()
endfunction
globals
trigger zoomCheckTrigger = null
endglobals
// Funktion: Kamera bleibt auf Turmwärter, zoomt jetzt aber näher heran
function KameraUebergabeTurm takes integer playerId returns nothing
set udg_ZRotaFocusHero[playerId] = false
set udg_ZRotaAutoAn[playerId] = false
set udg_ZRotaHohZHero[playerId] = false
set udg_ZRotaAOAHero[playerId] = false
call ResetToGameCameraForPlayer(Player(playerId - 1), 0)
if GetLocalPlayer() == Player(playerId - 1) then
// Kamera auf den Turmwärter fokussieren
call SetCameraTargetControllerNoZForPlayer(Player(playerId - 1), gg_unit_edot_0664, 0, 0, false)
call SetCameraField(CAMERA_FIELD_ZOFFSET, 1200, 1.0)
call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, 90, 1.0)
call SetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK, 300.0, 1.0)
endif
endfunction
// Funktion: Kamera zurück auf Helden setzen
function KameraUebergabeZurueckAnHelden takes integer playerId returns nothing
set udg_ZRotaFocusHero[playerId] = true
set udg_ZRotaAutoAn[playerId] = true
set udg_ZRotaHohZHero[playerId] = true
set udg_ZRotaAOAHero[playerId] = true
call ResetToGameCameraForPlayer(Player(playerId - 1), 0)
if GetLocalPlayer() == Player(playerId - 1) then
call SetCameraTargetControllerNoZForPlayer(Player(playerId - 1), udg_ZRPGHero[playerId], 0, 0, false)
// Standardwerte zurücksetzen
call SetCameraField(CAMERA_FIELD_ZOFFSET, 0, 1.0) // Standardhöhe
call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, 450, 1.0) // Standard-Zoom
endif
endfunction
function CheckHeroDistance takes nothing returns nothing
local integer i = 3
local real heroX
local real heroY
local real unitX = GetUnitX(gg_unit_edot_0664)
local real unitY = GetUnitY(gg_unit_edot_0664)
local real distance
local boolean found = false
loop
exitwhen i > 5
if udg_ZRPGHero[i] != null then
set heroX = GetUnitX(udg_ZRPGHero[i])
set heroY = GetUnitY(udg_ZRPGHero[i])
set distance= SquareRoot((heroX - unitX)*(heroX - unitX) + (heroY - unitY)*(heroY - unitY))
if distance <= 800.0 then
if udg_ZRotaFocusHero[i] then // Nur wenn Held aktuell verfolgt wird!
call KameraUebergabeTurm(i)
endif
set found = true
else
if not udg_ZRotaFocusHero[i] then // Nur wenn er aktuell NICHT verfolgt wird!
call KameraUebergabeZurueckAnHelden(i)
endif
endif
endif
set i = i + 1
endloop
// Falls kein Held mehr in der Nähe ist, deaktiviere den Trigger
if not found then
call DisableTrigger(zoomCheckTrigger)
endif
endfunction
function StartZoomCheck takes nothing returns nothing
if not IsTriggerEnabled(zoomCheckTrigger) then
call EnableTrigger(zoomCheckTrigger)
endif
endfunction
function InitTrig_ExtraCameraZoom takes nothing returns nothing
local trigger proximityTrigger = CreateTrigger()
set zoomCheckTrigger = CreateTrigger()
call TriggerRegisterTimerEventPeriodic(zoomCheckTrigger, 1.0)
call TriggerAddAction(zoomCheckTrigger, function CheckHeroDistance)
call DisableTrigger(zoomCheckTrigger)
call TriggerRegisterUnitInRange(proximityTrigger, gg_unit_edot_0664, 800.0, null)
call TriggerAddAction(proximityTrigger, function StartZoomCheck)
endfunction
function Trig_Sound_alle50s_Actions takes nothing returns nothing
if ( GetRandomInt(1, 2) == 2 ) then
call SetDoodadAnimationRectBJ("Stand", 'D01Q', GetPlayableMapRect())
call SetDoodadAnimationRectBJ("Stand", 'D01R', GetPlayableMapRect())
else
call SetDoodadAnimationRectBJ("Stand", 'D01S', GetPlayableMapRect())
endif
call SetDoodadAnimationRectBJ("Stand", 'D01P', GetPlayableMapRect())
call TriggerSleepAction(3.00)
call SetDoodadAnimationRectBJ("Death", 'D01P', GetPlayableMapRect())
call TriggerSleepAction(1.60)
call SetDoodadAnimationRectBJ("Death", 'D01Q', GetPlayableMapRect())
call SetDoodadAnimationRectBJ("Death", 'D01R', GetPlayableMapRect())
call TriggerSleepAction(20.00)
call SetDoodadAnimationRectBJ("Death", 'D01S', GetPlayableMapRect())
endfunction
//===========================================================================
function InitTrig_Sound_alle50s takes nothing returns nothing
set gg_trg_Sound_alle50s = CreateTrigger()
call TriggerRegisterTimerEventPeriodic(gg_trg_Sound_alle50s, 50.00)
call TriggerAddAction(gg_trg_Sound_alle50s, function Trig_Sound_alle50s_Actions)
endfunction
globals
integer array plantTypes
rect array plantRects
integer totalPlants = 9
integer array doodadDeathIds
integer array doodadStandIds
integer totalDoodadsDeath = 10
integer totalDoodadsStand = 8
integer udg_CurrentPlantType // Deklariert die Variable als globalen integer
endglobals
function Trig_Morgens_SetupGlobals takes nothing returns nothing
// Definiere die Pflanzentypen und ihre zugehörigen Regionen
set plantTypes[0] = 'hslv'
set plantRects[0] = gg_rct_PflanzeKraut1
set plantTypes[1] = 'dkfw'
set plantRects[1] = gg_rct_PflanzeRot1
set plantTypes[2] = 'gmfr'
set plantRects[2] = gg_rct_PflanzeDunkel1
set plantTypes[3] = 'dthb'
set plantRects[3] = gg_rct_PflanzeGruen1
set plantTypes[4] = 'hslv'
set plantRects[4] = gg_rct_PflanzeKraut2
set plantTypes[5] = 'dkfw'
set plantRects[5] = gg_rct_PflanzeRot2
set plantTypes[6] = 'gmfr'
set plantRects[6] = gg_rct_PflanzeDunkel2
set plantTypes[7] = 'dthb'
set plantRects[7] = gg_rct_PflanzeGruen2
set plantTypes[8] = 'rhe3'
set plantRects[8] = gg_rct_Oase
// Definiere die Doodad-Typen für Death- und Stand-Animationen
set doodadDeathIds[0] = 'LOlp'
set doodadDeathIds[1] = 'YOlp'
set doodadDeathIds[2] = 'D023'
set doodadDeathIds[3] = 'D022'
set doodadDeathIds[4] = 'D004'
set doodadDeathIds[5] = 'D01I'
set doodadDeathIds[6] = 'D00I'
set doodadDeathIds[7] = 'D01F'
set doodadDeathIds[8] = 'D01L'
set doodadDeathIds[9] = 'D01N'
set doodadStandIds[0] = 'D007'
set doodadStandIds[1] = 'D01H'
set doodadStandIds[2] = 'D008'
set doodadStandIds[3] = 'D01E'
set doodadStandIds[4] = 'D01K'
set doodadStandIds[5] = 'D01M'
set doodadStandIds[6] = 'D01J'
set doodadStandIds[7] = 'D01O'
endfunction
function Trig_Morgens_ItemFilter takes nothing returns boolean
return GetItemTypeId(GetFilterItem()) == udg_CurrentPlantType
endfunction
function Wecken takes nothing returns nothing
call ShowUnitShow(GetEnumUnit())
call BlzUnitDisableAbility(GetEnumUnit(), 'Aneu', false, false)
endfunction
function Reden takes nothing returns nothing
call UnitRemoveAbilityBJ('Awan', GetEnumUnit())
endfunction
function Trig_Morgens_CheckAndCreateItemInRect takes rect r, integer itemType returns nothing
local location tempPoint = GetRectCenter(r)
// Prüft, ob das Item im Bereich vorhanden ist und erstellt es gegebenenfalls
set udg_CurrentPlantType = itemType
if (RectContainsItem(RandomItemInRectBJ(r, Condition(function Trig_Morgens_ItemFilter)), r) == false) then
call CreateItemLoc(itemType, tempPoint)
call RemoveLocation(tempPoint)
endif
endfunction
function Trig_Morgens_SetDoodadAnimations takes nothing returns nothing
local integer i = 0
// Setze Death-Animationen für Doodads
loop
exitwhen i >= totalDoodadsDeath
call SetDoodadAnimationRectBJ("Death", doodadDeathIds[i], GetPlayableMapRect())
set i = i + 1
endloop
// Setze Stand-Animationen für Doodads
set i = 0
loop
exitwhen i >= totalDoodadsStand
call SetDoodadAnimationRectBJ("Stand", doodadStandIds[i], GetPlayableMapRect())
set i = i + 1
endloop
endfunction
function Trig_Morgens_Actions takes nothing returns nothing
local integer i = 0
loop
exitwhen i >= totalPlants
call Trig_Morgens_CheckAndCreateItemInRect(plantRects[i], plantTypes[i])
set i = i + 1
endloop
// Erstelle Items in den Pflanzenregionen (prüfe, ob vorhanden, wenn nicht, erstelle es) es folgt Haustüren öffnen:
call WaygateActivateBJ(true, gg_unit_h00F_0373)
call WaygateActivateBJ(true, gg_unit_h00F_0940)
call WaygateActivateBJ(true, gg_unit_h00F_0928)
call WaygateActivateBJ(true, gg_unit_h00F_0905)
// Gefängnisbedingung
if (udg_BoolGefaengnis) then
call ModifyGateBJ(bj_GATEOPERATION_OPEN, gg_dest_DTg7_2428)
endif
// Aktion für Dorfbewohner
call ForGroupBJ(udg_DorfbewohnerLand, function Wecken)
call TriggerSleepAction(10.00)
call IssueTargetOrderBJ(gg_unit_n01N_1139, "dispel", gg_unit_n01N_1139)
call ForGroupBJ(udg_DorfbewohnerLand, function Reden)
// Setze Doodad-Animationen
call Trig_Morgens_SetDoodadAnimations()
endfunction
//===========================================================================
function InitTrig_Morgens takes nothing returns nothing
set gg_trg_Morgens = CreateTrigger()
call TriggerRegisterGameStateEventTimeOfDay(gg_trg_Morgens, EQUAL, 6.00)
call TriggerAddAction(gg_trg_Morgens, function Trig_Morgens_Actions)
// Setup für globale Werte
call Trig_Morgens_SetupGlobals()
endfunction
function Trig_Haus_Conditions takes nothing returns boolean
local unit orderedUnit = GetOrderedUnit()
local player owningPlayer = GetOwningPlayer(orderedUnit)
local unit targetUnit = GetOrderTargetUnit()
return GetPlayerController(owningPlayer) == MAP_CONTROL_USER and GetIssuedOrderIdBJ() == OrderId("move") and IsUnitType(orderedUnit, UNIT_TYPE_HERO) and GetUnitTypeId(targetUnit) == 'h00F' and GetOwningPlayer(targetUnit) != Player(0)
endfunction
function RevealVillager takes nothing returns nothing
set udg_BergbauInteger = GetRandomInt(0, 7)
call BlzSetUnitSkin(GetEnumUnit(), udg_DorfbewohnerInteger[udg_BergbauInteger])
call ShowUnitShow(GetEnumUnit())
endfunction
function HideVillager takes nothing returns nothing
call ShowUnitHide(GetEnumUnit())
endfunction
function Trig_Haus_CheckWaygate takes nothing returns boolean
return not WaygateIsActiveBJ(GetOrderTargetUnit())
endfunction
function Trig_Haus_Actions takes nothing returns nothing
local player triggeringPlayer = GetOwningPlayer(GetOrderedUnit())
local unit targetUnit = GetOrderTargetUnit()
if (Trig_Haus_CheckWaygate()) then
call DisplayTextToForce(GetForceOfPlayer(triggeringPlayer), "|cffff0000The door is locked!|r")
call PlaySoundForSpecificPlayer(triggeringPlayer, gg_snd_3D_Abgeschlossen)
else
call ForGroup(udg_DorfbewohnerHaus, function RevealVillager)
set udg_TempGroup = GetRandomSubGroup(GetRandomInt(3, 6), udg_DorfbewohnerHaus)
call ForGroup(udg_TempGroup, function HideVillager)
call DestroyGroup(udg_TempGroup)
// Überprüfen, ob die Zieleinheit den Buff B020 hat, bevor der Sound abgespielt wird
if UnitHasBuffBJ(targetUnit, 'B020') and GetOwningPlayer(targetUnit) != Player(PLAYER_NEUTRAL_PASSIVE) then
call PlaySoundForSpecificPlayer(triggeringPlayer, gg_snd_Lever)
endif
endif
endfunction
//===========================================================================
function InitTrig_Haus takes nothing returns nothing
set gg_trg_Haus = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Haus, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER)
call TriggerAddCondition(gg_trg_Haus, Condition(function Trig_Haus_Conditions))
call TriggerAddAction(gg_trg_Haus, function Trig_Haus_Actions)
endfunction