Discussion Vertical Pathing System

TheLegend

New Member
Reaction score
10
I've come across an idea to make a vertical pathing system but i lack the proper ideas for it

WHAT I'M AIMING FOR

a system short but effective that will create a vertical pathing network that will enable units to walk under bridges as well as over them, walk on other objects and units. It may sound complicated but it would make wc3 maps a lot more realistic. Making player units being able to jump on crates and from crates onto houses, walking under a bridge, trough a cave in the mountain, moving around houses and climbing onto the next floor of the house and so on
DOWNLOAD LINK AT THE BOTTOM OF THE POST

HOW I THINK THIS CAN BE DONE

by storing units height, object height and terrain height and adjust the flight z of an unit to make it look like its on or under another object. I know this will be hard to make so please feel free to use this post to exchange ideas and progress and when we finish the project we could get enormous credit and rep for it. Ill update how far i get with this project and please feel free to experiment on your own.

UNIT HEIGHTS​

Footman - height 92
Peasant - height 91
Knight - height 130
Bridge - height 256, fly height 50 (for cliff lvl 2)

NOTE: If you can calculate the height yourself and post in this Discussion for various units and if I have made a mistake correct me, i calculated by
making a lvl 1 cliff (i know the height is 128) using CTRL + right click hold + drag to adjust the camera so that the angle is 0 and change the scaling
of the unit so that the height is the same as the cliffs

WHAT COULD BE USEFUL​
- a system to get a object's height (complete)
- a system that would index possible z's of locations (not needed, the OZSYS works better than expected)
- Bridge height adjust system (complete)
- a new jump system with the new object height (im making it right now)
- someone to calculate existing units heights (new request)
- better models of bridges, houses and stuff

SYSTEMS SO FAR

The Object Z System or OZSYS, used for detecting the occupied height of units (designed for a jump system), will be needed later. This requires
the users "help" to operate, the user has to create units for every object he wants to index and set the Point Value of that unit (Object Editor)
to the units height
JASS:
//////////////////////////////////////////////////////////////////////////////////////////
//TheLegend's Object height system                                                      //
//////////////////////////////////////////////////////////////////////////////////////////
//IMPORTANT INFO
//--------------------------------------------------------------------------------------//
//Before importing the system you have to replace every object with units that have that//
//objects model and add them into the init function at the bottom. This system is used  //
//to get the minimum z on which a unit can stand at the location. This will enable the  //
//user to create more advanced jump systems where the units will be able to jump onto   //
//other units, walk under as well as over bridges, jump onto and over crates, houses,   //
//rocks and so on. This library will provide the user with these functions:             //
/*      function GetMinimumZ(location,boolean,real,boolean)                             */
//      -gets the minimum height if a new unit enters that location, the boolean will   //
//       determine will the terrain be included. Range is how far from the unit to scan //
//       and the last bool is if the systen will include the fly height                 //
/*      function GetUnitsZ(unit)                                                        */
//      -gets the units vertical Z value (on which height it is)                        //
//--------------------------------------------------------------------------------------//
//IMPLEMENTATION
//--------------------------------------------------------------------------------------//
//You will need vJass or NewGen World editor to implement this. If you have it then just//
//create a trigger, convert it to custom text and replece everything there with this.   //
//Before you run the system make sure all dodads, objects are replaced with units, you  //
//will have to create units with their models since units are the only tracable things  //
//in the world editor.And the system uses Units Point values to operate. You have to    //
//define the unit heights ( Point value) but here is a hint how to orientate, the cliff //
//lvl 1 is 128 high                                                                     //
//////////////////////////////////////////////////////////////////////////////////////////
library OZSYS
    globals
        private constant boolean enablesystem = true
        private group tempunitgroup = CreateGroup()
        private real tempreal
    endglobals
    public function GetUnitsZ takes unit u returns real
        local location l
        set tempreal = 0
        set l = GetUnitLoc(u)
        set tempreal = GetUnitFlyHeight(u) + GetLocationZ(l)
        set l = null
        return tempreal
    endfunction
    public function GetMinimumZ takes location l, boolean terrain,real range,boolean fly returns real
        local integer flyon = 0
        set tempreal = 0
        set tempunitgroup = GetUnitsInRangeOfLocMatching(range, l,null)
        if fly then
            set flyon = 1
        endif
        loop
            exitwhen FirstOfGroup(tempunitgroup) == null
            if tempreal < GetUnitPointValue(FirstOfGroup(tempunitgroup)) + flyon*GetUnitFlyHeight(FirstOfGroup(tempunitgroup)) then
                set tempreal = GetUnitPointValue(FirstOfGroup(tempunitgroup)) + flyon*GetUnitFlyHeight(FirstOfGroup(tempunitgroup))
            endif
            call GroupRemoveUnit(tempunitgroup,FirstOfGroup(tempunitgroup))
        endloop
        if terrain then
            set tempreal = tempreal + GetLocationZ(l)
        endif
        return tempreal
    endfunction
endlibrary


The Bridge system or simply BRSYS will (if you did everything the OZSYS required of you, that is create a unit for the bridge) make the units walk on or under the bridges. IT WORKS STUNNING MATES, JUST STUNNING
JASS:
//////////////////////////////////////////////////////////////////////////////////
//Bridge by TheLegend                                                           //
//////////////////////////////////////////////////////////////////////////////////
//INFO
//------------------------------------------------------------------------------//
//This system needs OZSYS to operate, if it is not included within the map you  //
//found this then the map is a rip. The system will attempt to give units the   //
//ability to walk under as well as over bridges, restrict fighting of units on  //
//different "levels" of the bridge. NOTE that this is not a cinematic effect but//
//an addon to warcraft to make it better and more realistic, open new ways of   //
//map games and so on                                                           //
//////////////////////////////////////////////////////////////////////////////////
library BRSYS initializer init uses OZSYS
    globals
        public group bridges = CreateGroup()
        private integer indextotal = 1
    endglobals
    private struct unitindexer
        integer id
        unit u
        location savedloc
    endstruct
    globals
        private unitindexer array D
    endglobals
    private function destroyD takes unitindexer data returns nothing
        local integer dataid = data.id
        call data.destroy()
        set indextotal = indextotal - 1
        loop
            set dataid = dataid + 1
            set D[dataid - 1] = D[dataid]
            exitwhen D[dataid].u == null
        endloop
    endfunction
    private function boolexpr1 takes nothing returns boolean
        return IsUnitInGroup(GetFilterUnit(),bridges) == false
    endfunction
    private function modandsort takes nothing returns nothing
        local unitindexer temp = unitindexer.create()
        local unit u
        if GetTriggerUnit() == null then
            set u = GetEnumUnit()
        else
            set u = GetTriggerUnit()
        endif
        call UnitAddAbility(u, 'Amrf')
        call UnitRemoveAbility(u, 'Amrf')
        if GetUnitTypeId(u) == 'h001' then
            call GroupAddUnit(bridges,u)
        else
            set temp.id = indextotal
            set temp.u = u
            set D[indextotal] = temp
            set indextotal = indextotal + 1
        endif
    endfunction
    private function identify takes unit u returns integer
        local integer unitid = 1
            loop
                exitwhen D[unitid].u == u
                set unitid = unitid + 1
            endloop
        return unitid
    endfunction
    private function setunits takes nothing returns nothing
        local location l = GetUnitLoc(GetEnumUnit())
        local location l1
        local group g = GetUnitsInRangeOfLocMatching(350, l,Not(Filter(function boolexpr1)))
        local integer id = identify(GetEnumUnit())
        local real height
        local real x = GetUnitX(GetEnumUnit()) - 64 * Cos(GetUnitFacing(GetEnumUnit())*bj_DEGTORAD)
        local real y = GetUnitY(GetEnumUnit()) - 64 * Sin(GetUnitFacing(GetEnumUnit())*bj_DEGTORAD)
        set l = Location(x,y)
        if FirstOfGroup(g) != null then
            if D[id].savedloc == null then
                set D[id].savedloc = l
            endif
            set l = GetUnitLoc(GetEnumUnit())
            set l1 = GetUnitLoc(FirstOfGroup(g))
            call SetUnitPathing( GetEnumUnit(), false )
            set height = GetLocationZ(D[id].savedloc) - OZSYS_GetMinimumZ(l1,true,256,false)
            if height <= 64 and height >= - 64 and GetLocationZ(l) != GetLocationZ(D[id].savedloc)then
                set height = OZSYS_GetMinimumZ(l1,true,16,false) - GetLocationZ(l)
                call SetUnitFlyHeight(GetEnumUnit(),height,0)
            else
                call SetUnitFlyHeight(GetEnumUnit(),0,0)
            endif
        else
            call SetUnitFlyHeight(GetEnumUnit(),0,0)
            call SetUnitPathing( GetEnumUnit(), true )
            set D[id].savedloc = null
        endif
        call RemoveLocation(l)
        call RemoveLocation(l1)
        set height = 0
        set id = 0
        set x = 0
        set y = 0
    endfunction
    private function bridgecheck takes nothing returns nothing
        local group g = GetUnitsInRectMatching(GetWorldBounds(),Filter(function boolexpr1))
        call ForGroup(g, function setunits)
        call GroupClear(g)
    endfunction
    private function leftmap takes nothing returns nothing
        call destroyD(D[identify(GetTriggerUnit())])
        call GroupRemoveUnit(bridges,GetTriggerUnit())
    endfunction
    private function init takes nothing returns nothing
        local group allunits = GetUnitsInRectMatching(GetWorldBounds(),null)
        local trigger t = CreateTrigger()
        call ForGroup(allunits, function modandsort)
        call TriggerRegisterTimerEvent(t, 0.1, true)
        call TriggerAddAction(t,function bridgecheck)
        set t = CreateTrigger()
        call TriggerRegisterEnterRectSimple(t, GetWorldBounds())
        call TriggerAddAction(t,function bridgecheck)    
        call GroupClear(allunits)
        set t = CreateTrigger()
        call TriggerRegisterLeaveRectSimple(t, GetWorldBounds())
        call TriggerAddAction(t,function leftmap)
        set t = null
    endfunction
endlibrary


AND NOW THE TEST MAP​

made a test map with some units necessary for the system (a knight, bridge, crate (for later)), youll need NewGen to open
http://www.epicwar.com/maps/199037/
 

lep

Active Member
Reaction score
8
It's not really hard. And i must know, since i already did it ;) But go ahead and build it since it's a nice project. Just look at the bridges as rects or regions an check on entering if the unit is high enough. Also, try to allow bridges above other bridges.

But i guess that leaving bridge on the "side" must be handled different from map to map. The easiest way is probably to just prohibit it. Just keep in mind, that this may not be an option.
 

TheLegend

New Member
Reaction score
10
this isnt just about bridges you know :) it should be a system that will make a 3d pathing map for every thing in the game so when you use a jump system you could land on a crate, unit, rock, tree, house etc
 

lep

Active Member
Reaction score
8
Oh welp, that makes it way, way more complex.
And normal wc3 pathfinding wouldn't work, but i think that's also an issue for bridges.
 

Bribe

vJass errors are legion
Reaction score
67
I'm pretty sure it is impossible to walk under a bridge, as the bridge is considered ground and wc3 rejects any fly height below 0.
 

TheLegend

New Member
Reaction score
10
but if you remove its pathing or just take its model and replace a units with it then it will be possible... trust me ;)

EDIT

how about a object height detection system or way to detect that ??? i could make all dodads the same height and use that constant but i think itll be better to preserve the random scaling

EDIT

I HAVE IT :D i only have to replace all dodads , objects with units and add them to unit groups (example: units with height 100 go to group 1) and when another unit comes to a specific point it checks if there is another unit there and in which group it is to set the height (im a genius), now the only problem is that im too lazy to do this... :D, when im in the mood ill make a test map
 

TheLegend

New Member
Reaction score
10
so far so good, im able to index units and set their heights fast, but i need models of crates that are "normal" not the open ones or the angled ones
 

Chewbalka

New Member
Reaction score
14
Would this be a cinematic effect?
Sounds like where the unit appears to be the location in which it could be attacked is probably diffearent. Such as if your going under a bridge you could get attacked by a unit on the top of the bridge.
 

TheLegend

New Member
Reaction score
10
after the system is finished it aint hard to make a unit stop attacking if the total height (terrain + flight) of the two units is different (about 50 offset would be allowed). It isnt planed as a mere cinematic eff but an addon to warcraft to make it more interesting, enabling more features
 

TheLegend

New Member
Reaction score
10
EDIT
i had some problems with posting there so ill post here, the comments are info and how to implement
JASS:
library OZSYS
    globals
        private constant boolean enablesystem = true
        private group tempunitgroup = CreateGroup()
        private real tempreal = 0
    endglobals
    private function groupheightcalc takes nothing returns nothing
        if tempreal < GetUnitPointValue(GetEnumUnit()) + GetUnitFlyHeight(GetEnumUnit()) then
            set tempreal = GetUnitPointValue(GetEnumUnit()) + GetUnitFlyHeight(GetEnumUnit())
        endif
    endfunction
    public function GetUnitsZ takes unit u returns real
        local location l
        set tempreal = 0
        set l = GetUnitLoc(u)
        set tempreal = GetUnitFlyHeight(u) + GetLocationZ(l)
        set l = null
        return tempreal
    endfunction
    public function GetMinimumZ takes location l, boolean terrain returns real
        local real height
        set tempreal = 0
        set tempunitgroup = GetUnitsInRangeOfLocAll(16, l)
        call ForGroup(tempunitgroup, function groupheightcalc)
        call GroupClear(tempunitgroup)
        if terrain then
            set tempreal = tempreal + GetLocationZ(l)
        endif
        return tempreal
    endfunction
endlibrary

please comment and tell me how to improve this one, ill be working on a bridge snippet and a new jump system
 

TheLegend

New Member
Reaction score
10
EDIT:
I solved that little problem, now there is another problem, well its not that bad at all...
I've created units with models of bridges, with their pathing map and things like that and the system sets the FlyHeight right, but when you approach from the side of the bridge (trying to go under it) the unit is blocked by the pathing map but if you try to jump down form the bridge, you can jump down normally. Anyone know what could cause this crazy abnormality
 

TheLegend

New Member
Reaction score
10
solved it and made some updates, tnx for nothing... ill update the main Thread in a moment with the Bridge system and the OZSYS improved system
THERE STILL is a small problem and that is that youll have to click really close to the bridges edge to get onto it cause the unit still sees the pathing map and will refuse to just go under it, you have to force it under/onto but once there you can normally move
 

Zwiebelchen

You can change this now in User CP.
Reaction score
60
bump... so no one wants to participate in this huh...
Systems like this already exist. Check out my multi floor / two floor system that is in the graveyard.
It's very intuitive and 'works' but it simply fucks up the graphics of your map so nobody with brains will use it.
http://www.thehelper.net/forums/showthread.php/145900-Multi-Floor-System?highlight=floor+system

I don't want to decourage you, but things like that will not work the way you want them. I can tell you by experience.
There are some things you can not overcome and those are wc3 graphic limitations:

fact: you need to use flying units in order to make it work
problem: flying units have turned off collision, so all your units on a different layer than the ground layer will have no collision

fact: flying units have its shadow on the ground, not on your different layer
problem: no solution to this known, except using a model for the shadow, which will look weird, though

fact: You can not rightclick spots on the upper layer if there is no walkable destructable there
problem: no solution to this. If you don't use walkable destructables, you can not fix this. If you do, then units can't walk below them. Even if you use walkable destructables, the shadow will still be on the ground.

fact: You can not block pathing on the upper layer without using air pathing blockers.
problem: Air pathing blockers are bugged up by the wc3 engine. Ground units are affected by them and will sometimes randomly change their move direction for some weird reason.
 
General chit-chat
Help Users
  • No one is chatting at the moment.
  • Varine Varine:
    How can you tell the difference between real traffic and indexing or AI generation bots?
  • The Helper The Helper:
    The bots will show up as users online in the forum software but they do not show up in my stats tracking. I am sure there are bots in the stats but the way alot of the bots treat the site do not show up on the stats
  • Varine Varine:
    I want to build a filtration system for my 3d printer, and that shit is so much more complicated than I thought it would be
  • Varine Varine:
    Apparently ABS emits styrene particulates which can be like .2 micrometers, which idk if the VOC detectors I have can even catch that
  • Varine Varine:
    Anyway I need to get some of those sensors and two air pressure sensors installed before an after the filters, which I need to figure out how to calculate the necessary pressure for and I have yet to find anything that tells me how to actually do that, just the cfm ratings
  • Varine Varine:
    And then I have to set up an arduino board to read those sensors, which I also don't know very much about but I have a whole bunch of crash course things for that
  • Varine Varine:
    These sensors are also a lot more than I thought they would be. Like 5 to 10 each, idk why but I assumed they would be like 2 dollars
  • Varine Varine:
    Another issue I'm learning is that a lot of the air quality sensors don't work at very high ambient temperatures. I'm planning on heating this enclosure to like 60C or so, and that's the upper limit of their functionality
  • Varine Varine:
    Although I don't know if I need to actually actively heat it or just let the plate and hotend bring the ambient temp to whatever it will, but even then I need to figure out an exfiltration for hot air. I think I kind of know what to do but it's still fucking confusing
  • The Helper The Helper:
    Maybe you could find some of that information from AC tech - like how they detect freon and such
  • Varine Varine:
    That's mostly what I've been looking at
  • Varine Varine:
    I don't think I'm dealing with quite the same pressures though, at the very least its a significantly smaller system. For the time being I'm just going to put together a quick scrubby box though and hope it works good enough to not make my house toxic
  • Varine Varine:
    I mean I don't use this enough to pose any significant danger I don't think, but I would still rather not be throwing styrene all over the air
  • The Helper The Helper:
    New dessert added to recipes Southern Pecan Praline Cake https://www.thehelper.net/threads/recipe-southern-pecan-praline-cake.193555/
  • The Helper The Helper:
    Another bot invasion 493 members online most of them bots that do not show up on stats
  • Varine Varine:
    I'm looking at a solid 378 guests, but 3 members. Of which two are me and VSNES. The third is unlisted, which makes me think its a ghost.
    +1
  • The Helper The Helper:
    Some members choose invisibility mode
    +1
  • The Helper The Helper:
    I bitch about Xenforo sometimes but it really is full featured you just have to really know what you are doing to get the most out of it.
  • The Helper The Helper:
    It is just not easy to fix styles and customize but it definitely can be done
  • The Helper The Helper:
    I do know this - xenforo dropped the ball by not keeping the vbulletin reputation comments as a feature. The loss of the Reputation comments data when we switched to Xenforo really was the death knell for the site when it came to all the users that left. I know I missed it so much and I got way less interested in the site when that feature was gone and I run the site.
  • Blackveiled Blackveiled:
    People love rep, lol
    +1
  • The Helper The Helper:
    The recipe today is Sloppy Joe Casserole - one of my faves LOL https://www.thehelper.net/threads/sloppy-joe-casserole-with-manwich.193585/
  • The Helper The Helper:
    Decided to put up a healthier type recipe to mix it up - Honey Garlic Shrimp Stir-Fry https://www.thehelper.net/threads/recipe-honey-garlic-shrimp-stir-fry.193595/

      The Helper Discord

      Staff online

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top