black.sheep
Active Member
- Reaction score
- 24
I got this door system in my map. It works perfectly except for a weird issue with its setup. It doesnt seem to create to create the rects for opening/closing doors in the right places. Could someone please figure out why it is doing this?
JASS:
library DoorSys initializer int
globals
private integer array HorizontalDoorID
private integer array VerticalDoorID
private group g = CreateGroup()
private hashtable hash
private constant integer DoorMax = 2
private constant integer HorizontalDoorBlocker =039;B00A039;
private constant integer VerticalDoorBlocker =039;B009039;
private constant boolean SetupDoorsOnInt=true
private constant real SetupDoorsWait=2
private constant real SetupDoorsRectSize=230
private constant string LockMessage="|cFF804000Door is now locked|r"
private constant string UnlockMessage="|cFF804000Door is now unlocked|r"
private constant string HitMessage="|cFF804000Door is locked|r"
private constant string LockSound="Doodads\\Cinematic\\DungeonLever\\Lever.wav"
private constant string HitSound="Sound\\Ambient\\DoodadEffects\\Switch.wav"
endglobals
private function setvars takes nothing returns nothing
//Set teh door id's
set HorizontalDoorID[0] = 039;DTg5039;
set VerticalDoorID[0] = 039;DTg7039;
set HorizontalDoorID[1] = 039;LTe1039;
set HorizontalDoorID[1] = 039;LTe3039;
endfunction
private function UnitFilter takes nothing returns boolean
if UnitAlive(GetFilterUnit()) == true and IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) == false and IsUnitType(GetFilterUnit(),UNIT_TYPE_SUMMONED) == false and IsUnitType(GetFilterUnit(),UNIT_TYPE_TAUREN) == false then
return true
endif
return true
endfunction
private function DoorOpen takes nothing returns nothing
local trigger t=GetTriggeringTrigger()
local destructable door = LoadDestructableHandle(hash, GetHandleId(t), StringHash("door"))
local destructable doorpath
local trigger destroytrigger
local sound hit
local boolean locked = LoadBoolean(hash, GetHandleId(door), StringHash("locked"))
debug call BJDebugMsg("opening door")
if GetDestructableLife(door) <= 0 then
debug call BJDebugMsg("Door r dead lol")
return
endif
if locked == true then
call DisplayTextToPlayer(GetOwningPlayer(GetTriggerUnit()),0,0,HitMessage)
set hit = CreateSoundFromLabel(HitSound,false,false,false,10,10)
if GetLocalPlayer() == GetOwningPlayer(GetTriggerUnit()) then
call StartSound(hit)
endif
call KillSoundWhenDone(hit)
else
debug call BJDebugMsg("Door opened")
set doorpath=LoadDestructableHandle(hash, GetHandleId(t), StringHash("doorpath"))
set destroytrigger = LoadTriggerHandle(hash, GetHandleId(t), StringHash("destroytrigger"))
call SaveReal(hash, GetHandleId(door), StringHash("life"), GetDestructableLife(door))
call SaveBoolean(hash, GetHandleId(door), StringHash("isopen"), true)
call DisableTrigger(destroytrigger)
call KillDestructable(door)
call KillDestructable(doorpath)
call SetDestructableAnimation(door, "death alternate")
call EnableTrigger(destroytrigger)
endif
set hit = null
set t = null
set door = null
set doorpath = null
set destroytrigger = null
endfunction
private function DoorClose takes nothing returns nothing
local trigger t=GetTriggeringTrigger()
local rect r=LoadRectHandle(hash, GetHandleId(t), StringHash("rect"))
local destructable door = LoadDestructableHandle(hash, GetHandleId(t), StringHash("door"))
local destructable doorpath = LoadDestructableHandle(hash, GetHandleId(t), StringHash("doorpath"))
local trigger destroytrigger=LoadTriggerHandle(hash, GetHandleId(t), StringHash("destroytrigger"))
local boolean isopen=LoadBoolean(hash, GetHandleId(door), StringHash("isopen"))
local boolean locked=LoadBoolean(hash,GetHandleId(door),StringHash("locked"))
debug call BJDebugMsg("door closed")
call GroupEnumUnitsInRect(g,r,Condition(function UnitFilter))
if CountUnitsInGroup(g) == 0 and isopen then
call SaveBoolean(hash, GetHandleId(door), StringHash("isopen"), false)
call DestructableRestoreLife(door, GetDestructableMaxLife(door), true)
call DestructableRestoreLife(doorpath, GetDestructableMaxLife(doorpath), true)
call SetDestructableLife(door,LoadReal(hash, GetHandleId(door),StringHash("life")))
call SetDestructableAnimation(door, "stand")
endif
call GroupClear(g)
set t = null
set door = null
set doorpath = null
set destroytrigger = null
set r = null
endfunction
private function DoorBustDown takes nothing returns nothing
local trigger t=GetTriggeringTrigger()
local destructable door = LoadDestructableHandle(hash, GetHandleId(t), StringHash("door"))
local destructable doorpath = LoadDestructableHandle(hash, GetHandleId(t), StringHash("doorpath"))
local trigger dooropen=LoadTriggerHandle(hash, GetHandleId(t), StringHash("t1"))
local trigger doorclose=LoadTriggerHandle(hash, GetHandleId(t), StringHash("t2"))
call DestroyTrigger(GetTriggeringTrigger())
call KillDestructable(doorpath)
call DestroyTrigger(dooropen)
call DestroyTrigger(doorclose)
debug call BJDebugMsg("Door killed")
set t = null
set door = null
set doorpath = null
set dooropen = null
set doorclose = null
endfunction
function LockDoor takes destructable door, boolean lock, player locker returns nothing
local destructable doorpath = LoadDestructableHandle(hash,GetHandleId(door), StringHash("doorpath"))
local trigger destroytrigger
local rect r
local sound s
debug call BJDebugMsg("door locked")
if lock == true then
if locker != null then
call DisplayTextToPlayer(locker,0,0,LockMessage)
set s = CreateSoundFromLabel(LockSound,false,false,false,10,10)
if GetLocalPlayer() == locker then
call StartSound(s)
endif
call KillSoundWhenDone(s)
endif
call SaveBoolean(hash, GetHandleId(door), StringHash("locked"), true)
else
if locker != null then
call DisplayTextToPlayer(locker,0,0,UnlockMessage)
set s = CreateSoundFromLabel(LockSound,false,false,false,10,10)
if GetLocalPlayer() == locker then
call StartSound(s)
endif
call KillSoundWhenDone(s)
endif
call GroupEnumUnitsInRect(g,r,Condition(function UnitFilter))
set destroytrigger = LoadTriggerHandle(hash, GetHandleId(door), StringHash("destroytrigger"))
if CountUnitsInGroup(g) != 0 then
call SaveReal(hash, GetHandleId(door), StringHash("life"), GetDestructableLife(door))
call SaveBoolean(hash, GetHandleId(door), StringHash("isopen"), true)
call DisableTrigger(destroytrigger)
call KillDestructable(door)
call EnableTrigger(destroytrigger)
call KillDestructable(doorpath)
call SetDestructableAnimation(door, "death alternate")
endif
call SaveBoolean(hash, GetHandleId(door), StringHash("locked"), false)
endif
set s = null
set destroytrigger = null
set doorpath = null
set r = null
endfunction
function ToggleLockDoor takes destructable door, player locker returns nothing
if LoadBoolean(hash,GetHandleId(door),StringHash("locked")) == true then
call LockDoor(door,false,locker)
else
call LockDoor(door,true,locker)
endif
endfunction
function RegisterDoor takes destructable door, rect where returns nothing
local integer i = 0
local trigger t=CreateTrigger()
local trigger k=CreateTrigger()
local trigger m=CreateTrigger()
local destructable doorpath
loop
exitwhen i == DoorMax
if GetDestructableTypeId(door) == HorizontalDoorID<i> then
set doorpath = CreateDestructable(HorizontalDoorBlocker, GetDestructableX(door), GetDestructableY(door), 0, 1.0, 1)
endif
if GetDestructableTypeId(door) == VerticalDoorID<i> then
set doorpath = CreateDestructable(VerticalDoorBlocker, GetDestructableX(door), GetDestructableY(door), 0, 1.0, 1)
endif
set i = i + 1
endloop
call TriggerRegisterEnterRectSimple( t, where)
call TriggerAddAction( t, function DoorOpen )
call TriggerRegisterLeaveRectSimple(k, where)
call TriggerAddAction(k, function DoorClose)
call TriggerAddCondition(t,Condition(function UnitFilter))
call TriggerAddCondition(k,Condition(function UnitFilter))
call TriggerRegisterDeathEvent(m,door)
call TriggerAddAction(m,function DoorBustDown)
call SaveDestructableHandle(hash, GetHandleId(t), StringHash("door"), door)
call SaveDestructableHandle(hash, GetHandleId(t), StringHash("doorpath"), doorpath)
call SaveRectHandle(hash, GetHandleId(t), StringHash("rect"), where)
call SaveDestructableHandle(hash, GetHandleId(k), StringHash("door"), door)
call SaveDestructableHandle(hash, GetHandleId(k), StringHash("doorpath"), doorpath)
call SaveRectHandle(hash, GetHandleId(k), StringHash("rect"), where)
call SaveDestructableHandle(hash, GetHandleId(m), StringHash("door"), door)
call SaveDestructableHandle(hash, GetHandleId(m), StringHash("doorpath"), doorpath)
call SaveRectHandle(hash, GetHandleId(m), StringHash("rect"), where)
call SaveTriggerHandle(hash, GetHandleId(m), StringHash("t1"), t)
call SaveTriggerHandle(hash, GetHandleId(m), StringHash("t2"), k)
debug call BJDebugMsg("Setting doors")
call SaveTriggerHandle(hash, GetHandleId(door), StringHash("t1"), t)
call SaveTriggerHandle(hash, GetHandleId(door), StringHash("t2"), k)
call SaveBoolean(hash, GetHandleId(door), StringHash("locked"), false)
call SaveTriggerHandle(hash, GetHandleId(t), StringHash("destroytrigger"), m)
call SaveTriggerHandle(hash, GetHandleId(k), StringHash("destroytrigger"), m)
debug call BJDebugMsg("door added")
set doorpath = null
endfunction
private function doorfilter takes nothing returns boolean
local integer i = 0
loop
exitwhen i == DoorMax
if GetDestructableTypeId(GetFilterDestructable()) == HorizontalDoorID<i> or GetDestructableTypeId(GetFilterDestructable()) == VerticalDoorID<i> then
return true
endif
set i = i + 1
endloop
return false
endfunction
private function intregister takes nothing returns nothing
local real x = GetDestructableX(GetEnumDestructable())
local real y = GetDestructableX(GetEnumDestructable())
local rect r = Rect(x - SetupDoorsRectSize, y - SetupDoorsRectSize, x + SetupDoorsRectSize, y + SetupDoorsRectSize)
call RegisterDoor(GetEnumDestructable(),r)
endfunction
private function int takes nothing returns nothing
call setvars()
call TriggerSleepAction(0)
set hash=InitHashtable()
if SetupDoorsOnInt == true then
call TriggerSleepAction(SetupDoorsWait)
debug call BJDebugMsg("Setting up doors")
call EnumDestructablesInRect(GetPlayableMapRect(),Condition( function doorfilter),function intregister)
endif
endfunction
endlibrary</i></i></i></i>