• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

[JASS] Type Casting Not Working

Status
Not open for further replies.
Level 24
Joined
Aug 1, 2013
Messages
4,657
Hi all.

I wanted to convert a unit (or any other handle) to a handle.
So I searched the web and found this and this but it doesnt seem to work for me.

I created an empty map.
I removed everything from it.
I put this code in the header file:
JASS:
function Handle2Unit takes handle h returns unit
    return h
endfunction

And then I saved the map and tested it...
I went directly to the main menu so I assume that there is an error.

Can anyone test if it also happens for him?
I am afraid that there is something on my pc that is breaking it down.
(Map in attachment.)
 

Attachments

  • Typecasting.w3x
    15.2 KB · Views: 120
Level 24
Joined
Aug 1, 2013
Messages
4,657
Nvm...

I now use this:
JASS:
globals
    hashtable udg_TypeCastHashtable = InitHashtable()
endglobals

library typecasting
    
    //BooleanExpr
    function Integer2BooleanExpr takes integer i returns boolexpr
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadBooleanExprHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2BooleanExpr takes handle h returns boolexpr
        return Integer2BooleanExpr(GetHandleId(h))
    endfunction
    function BooleanExpr2Handle takes boolexpr b returns handle
        return b
    endfunction
    
    //Button
    function Integer2Button takes integer i returns button
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadButtonHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Button takes handle h returns button
        return Integer2Button(GetHandleId(h))
    endfunction
    function Button2Handle takes button b returns handle
        return b
    endfunction
    
    //DefeatCondition
    function Integer2DefeatCondition takes integer i returns defeatcondition
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadDefeatConditionHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2DefeatCondition takes handle h returns defeatcondition
        return Integer2DefeatCondition(GetHandleId(h))
    endfunction
    function DefeatCondition2Handle takes defeatcondition d returns handle
        return d
    endfunction
    
    //Destructable
    function Integer2Destructable takes integer i returns destructable
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadDestructableHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Destructable takes handle h returns destructable
        return Integer2Destructable(GetHandleId(h))
    endfunction
    function Destructable2Handle takes destructable d returns handle
        return d
    endfunction
    
    //Dialog
    function Integer2Dialog takes integer i returns dialog
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadDialogHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Dialog takes handle h returns dialog
        return Integer2Dialog(GetHandleId(h))
    endfunction
    function Dialog2Handle takes dialog d returns handle
        return d
    endfunction
    
    //Effect
    function Integer2Effect takes integer i returns effect
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadEffectHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Effect takes handle h returns effect
        return Integer2Effect(GetHandleId(h))
    endfunction
    function Effect2Handle takes effect e returns handle
        return e
    endfunction
    
    //FogModifier
    function Integer2FogModifier takes integer i returns fogmodifier
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadFogModifierHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2FogModifier takes handle h returns fogmodifier
        return Integer2FogModifier(GetHandleId(h))
    endfunction
    function FogModifier2Handle takes fogmodifier f returns handle
        return f
    endfunction
    
    //FogState
    function Integer2FogState takes integer i returns fogstate
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadFogStateHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2FogState takes handle h returns fogstate
        return Integer2FogState(GetHandleId(h))
    endfunction
    function FogState2Handle takes fogstate f returns handle
        return f
    endfunction
    
    //Force
    function Integer2Force takes integer i returns force
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadForceHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Force takes handle h returns force
        return Integer2Force(GetHandleId(h))
    endfunction
    function Force2Handle takes force f returns handle
        return f
    endfunction
    
    //Group
    function Integer2Group takes integer i returns group
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadGroupHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Group takes handle h returns group
        return Integer2Group(GetHandleId(h))
    endfunction
    function Group2Handle takes group g returns handle
        return g
    endfunction
    
    //Hashtable
    function Integer2Hashtable takes integer i returns hashtable
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadHashtableHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Hashtable takes handle h returns hashtable
        return Integer2Hashtable(GetHandleId(h))
    endfunction
    function Hashtable2Handle takes hashtable h returns handle
        return h
    endfunction
    
    //Image
    function Integer2Image takes integer i returns image
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadImageHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Image takes handle h returns image
        return Integer2Image(GetHandleId(h))
    endfunction
    function Image2Handle takes image i returns handle
        return i
    endfunction
    
    //Item
    function Integer2Item takes integer i returns item
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadItemHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Item takes handle h returns item
        return Integer2Item(GetHandleId(h))
    endfunction
    function Item2Handle takes item i returns handle
        return i
    endfunction
    
    //ItemPool
    function Integer2ItemPool takes integer i returns itempool
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadItemPoolHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2ItemPool takes handle h returns itempool
        return Integer2ItemPool(GetHandleId(h))
    endfunction
    function ItemPool2Handle takes itempool i returns handle
        return i
    endfunction
    
    //Leaderboard
    function Integer2Leaderboard takes integer i returns leaderboard
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadLeaderboardHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Leaderboard takes handle h returns leaderboard
        return Integer2Leaderboard(GetHandleId(h))
    endfunction
    function Leaderboard2Handle takes leaderboard l returns handle
        return l
    endfunction
    
    //Lightning
    function Integer2Lightning takes integer i returns lightning
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadLightningHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Lightning takes handle h returns lightning
        return Integer2Lightning(GetHandleId(h))
    endfunction
    function Lightning2Handle takes lightning l returns handle
        return l
    endfunction
    
    //Location
    function Integer2Location takes integer i returns location
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadLocationHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Location takes handle h returns location
        return Integer2Location(GetHandleId(h))
    endfunction
    function Location2Handle takes location l returns handle
        return l
    endfunction
    
    //Multiboard
    function Integer2Multiboard takes integer i returns multiboard
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadMultiboardHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Multiboard takes handle h returns multiboard
        return Integer2Multiboard(GetHandleId(h))
    endfunction
    function Multiboard2Handle takes multiboard m returns handle
        return m
    endfunction
    
    //MultiboardItem
    function Integer2MultiboardItem takes integer i returns multiboarditem
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadMultiboardItemHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2MultiboardItem takes handle h returns multiboarditem
        return Integer2MultiboardItem(GetHandleId(h))
    endfunction
    function MultiboardItem2Handle takes multiboarditem m returns handle
        return m
    endfunction
    
    //Player
    function Integer2Player takes integer i returns player
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadPlayerHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Player takes handle h returns player
        return Integer2Player(GetHandleId(h))
    endfunction
    function Player2Handle takes player p returns handle
        return p
    endfunction
    
    //Quest
    function Integer2Quest takes integer i returns quest
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadQuestHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Quest takes handle h returns quest
        return Integer2Quest(GetHandleId(h))
    endfunction
    function Quest2Handle takes quest q returns handle
        return q
    endfunction
    
    //QuestItem
    function Integer2QuestItem takes integer i returns questitem
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadQuestItemHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2QuestItem takes handle h returns questitem
        return Integer2QuestItem(GetHandleId(h))
    endfunction
    function QuestItem2Handle takes questitem q returns handle
        return q
    endfunction
    
    //Rect
    function Integer2Rect takes integer i returns rect
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadRectHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Rect takes handle h returns rect
        return Integer2Rect(GetHandleId(h))
    endfunction
    function Rect2Handle takes rect r returns handle
        return r
    endfunction
    
    //Region
    function Integer2Region takes integer i returns region
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadRegionHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Region takes handle h returns region
        return Integer2Region(GetHandleId(h))
    endfunction
    function Region2Handle takes region r returns handle
        return r
    endfunction
    
    //Sound
    function Integer2Sound takes integer i returns sound
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadSoundHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Sound takes handle h returns sound
        return Integer2Sound(GetHandleId(h))
    endfunction
    function Sound2Handle takes sound s returns handle
        return s
    endfunction
    
    //TextTag
    function Integer2TextTag takes integer i returns texttag
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadTextTagHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2TextTag takes handle h returns texttag
        return Integer2TextTag(GetHandleId(h))
    endfunction
    function TextTag2Handle takes texttag t returns handle
        return t
    endfunction
    
    //Timer
    function Integer2Timer takes integer i returns timer
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadTimerHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Timer takes handle h returns timer
        return Integer2Timer(GetHandleId(h))
    endfunction
    function Timer2Handle takes timer t returns handle
        return t
    endfunction
    
    //TimerDialog
    function Integer2TimerDialog takes integer i returns timerdialog
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadTimerDialogHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2TimerDialog takes handle h returns timerdialog
        return Integer2TimerDialog(GetHandleId(h))
    endfunction
    function TimerDialog2Handle takes timerdialog t returns handle
        return t
    endfunction
    
    //Trackable
    function Integer2Trackable takes integer i returns trackable
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadTrackableHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Trackable takes handle h returns trackable
        return Integer2Trackable(GetHandleId(h))
    endfunction
    function Trackable2Handle takes trackable t returns handle
        return t
    endfunction
    
    //Trigger
    function Integer2Trigger takes integer i returns trigger
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadTriggerHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2WTrigger takes handle h returns trigger
        return Integer2Trigger(GetHandleId(h))
    endfunction
    function Trigger2Handle takes trigger t returns handle
        return t
    endfunction
    
    //TriggerAction
    function Integer2TriggerAction takes integer i returns triggeraction
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadTriggerActionHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2TriggerAction takes handle h returns triggeraction
        return Integer2TriggerAction(GetHandleId(h))
    endfunction
    function TriggerAction2Handle takes triggeraction t returns handle
        return t
    endfunction
    
    //TriggerCondition
    function Integer2TriggerCondition takes integer i returns triggercondition
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadTriggerConditionHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2TriggerCondition takes handle h returns triggercondition
        return Integer2TriggerCondition(GetHandleId(h))
    endfunction
    function TriggerCondition2Handle takes triggercondition t returns handle
        return t
    endfunction
    
    //TriggerEvent
    function Integer2TriggerEvent takes integer i returns event
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadTriggerEventHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2TriggerEvent takes handle h returns event
        return Integer2TriggerEvent(GetHandleId(h))
    endfunction
    function TriggerEvent2Handle takes event e returns handle
        return e
    endfunction
    
    //Ubersplat
    function Integer2Ubersplat takes integer i returns ubersplat
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadUbersplatHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Ubersplat takes handle h returns ubersplat
        return Integer2Ubersplat(GetHandleId(h))
    endfunction
    function Ubersplat2Handle takes ubersplat u returns handle
        return u
    endfunction
    
    //Unit
    function Integer2Unit takes integer i returns unit
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadUnitHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Unit takes handle h returns unit
        return Integer2Unit(GetHandleId(h))
    endfunction
    function Unit2Handle takes unit u returns handle
        return u
    endfunction
    
    //UnitPool
    function Integer2UnitPool takes integer i returns unitpool
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadUnitPoolHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2UnitPool takes handle h returns unitpool
        return Integer2UnitPool(GetHandleId(h))
    endfunction
    function UnitPool2Handle takes unitpool u returns handle
        return u
    endfunction
    
    //Widget
    function Integer2Widget takes integer i returns widget
        call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
        return LoadWidgetHandle(udg_TypeCastHashtable, 0, 0)
    endfunction
    function Handle2Widget takes handle h returns widget
        return Integer2Widget(GetHandleId(h))
    endfunction
    function Widget2Handle takes widget w returns handle
        return w
    endfunction
    
endlibrary
 
Level 23
Joined
Apr 16, 2012
Messages
4,041
as in C++, in Jass you can also only typecast when climbing the hierarchy to parent, not from parent to child, since there is no guarantee that the handle you send in will be unit, and it is a lot easier to just check that once while compiling, as opposed to checking it every time you try to cast it(which may not always be obvious to the programmer), which could be taxing on this already so slow interpreter
 
Level 24
Joined
Aug 1, 2013
Messages
4,657
There is a guarantee if the programming is proper.
However, the editor and JASSHelper both said it was fine.
Only WC3 itself didn't agree with it.

Right now, I use the hashtable with ConvertFogState() which allows me to convert a handle id to the handle and return that handle in unit/player/dialog/multioard/etc format.

Took me a while to write everything down though.
 
Level 23
Joined
Apr 16, 2012
Messages
4,041
you can never trust the programmer.

JassHelper will agree that function a takes nothing returns nothing array is also syntactically correct :D

The hashtable approach is correct tho, since while you typecast, you will actually obtain null if it has been insert as different type.

Im actually surprised that the compiler eats the typecast tho
 

LeP

LeP

Level 13
Joined
Feb 13, 2008
Messages
537
I've changed pjass to handle this behaviour. See here.
As far as i can tell the error was rather silly. It checked for equality against the base type instead of the actual types.
 
Status
Not open for further replies.
Top