Duke4.net Forums: EDuke32 Scripting - Duke4.net Forums

Jump to content

  • 124 Pages +
  • « First
  • 91
  • 92
  • 93
  • 94
  • 95
  • Last »
  • You cannot start a new topic
  • You cannot reply to this topic

EDuke32 Scripting  "CON coding help"

User is offline   jimbob 

#2754

well, i have it working with an incremental pathfinding way, but it has a problem. once it reaches the destination it keeps on moving in the direction it came from until the distance from the point he was going first is greater than the distance to the point he is supposed to be going to. what i need is a way to completely ignore the point ( and all others ) that are nót the ones he is going to, in other words only regard the waypoint actor that has the correct hitag as the only actor he could find.

tate navigate // navigate to the waypoint. 
findnearactor WAYPOINT 409600 TEMP 
getactor[TEMP].hitag MHITAG // TEMP is in this case the waypoint actor. 
ifvarvare MHITAG COUNT  // make sure the waypoint he is going to is the next sequential one, so he doesnt backtrack. 
                                            // IE only find nearactor with a hightag the count currently has, one at a time.
	ifvarn TEMP -1 // the actor should only care about the waypoint if both statements return true. 
	{
       		 getactor[TEMP].x MX
       		 getactor[TEMP].y MY
       		 getactor[THISACTOR].x x
       		 getactor[THISACTOR].y y
       		 subvarvar MX x
       		 subvarvar MY y
       		 getangle ANGVAR MX MY
       		 setactor[THISACTOR].ang ANGVAR
	}

// here starts my own changes to make the system do what i need. 
// if the actor is within the accepted distance from the waypoint, make him aim for the next one by adding one to the count. 
findnearactor WAYPOINT 512 TEMP2
	getactor[TEMP].hitag MHITAG
	ifvarn TEMP2 -1
	ifvarvare MHITAG COUNT  // add 1 to count only if the current waypoint has the same value as the one where the player was moving towards, 
                                                    //  used to prevent a retrigger causing the count to rise 1 every tick the actor is within the set distance
	{
		addvar COUNT 1
		spawn EXPLOSION2 // just to check if he reaches the correct point, and does not re-trigger the count. set off fireworks one you reach your goal.
		break // force restart of the subroutine
	}

ends


i tried putting a ifvarvarn MHITAG COUNT { break } after the actual getting the angle code but that didnt seem to work, if i place a waypoint between the actor, and it has not the correct hitag the actor will then ignore the one that does have the correct hitag, this makes figure 8 forms impossible, wich is something i could live with, but surely there is a way around it.
i was thinking allong the lines of running a search through the spriteid's until it finds the correct one before proceeding.

but my actor does not follow a simple path i layed out start to finish, so thats a win.

This post has been edited by jimbob: 17 August 2021 - 02:41 AM

0

User is offline   Danukem 

  • Duke Plus Developer

#2755

Regardless of how many instances of the actor are within the distance, findnearactor will always return one result, so you can't use it to sort through them. The only time I would use findnearactor is when it really doesn't matter which one you are finding as long as it is within the distance. For example, if I had a paper actor that I wanted to catch on fire if a fire actor was near, then I might make it use findnearactor to search for close fires and then start burning on a positive result.

For pathing, if you are going to do a search at all (which may not be necessary depending on how you set things up), then you should start the search using statnum with a loop using commands such as headspritestat/whilevarn/nextspritestat. In the loop you can check picnum, distance, tags, or whatever you want.
0

User is offline   jimbob 

#2756

i tried setting up a headsprite loop but i dont know how to set it up, so it probably did an infinite runs and locked the game.
how could i set up a pathing system without doing a search for the correct pathnode? afaik no matter wich way tou slice it you are going to have to do a check to see if there is a pathnode within range, get wich node it is and make sure that the AI is going to the next sequential one in order to avoid it backtracking or going the wrong direction. my reasoning was to do a check ( findnearactor ) then check if it is the correct pathnode ( does it have Hitag 0? ) and if so move to that. then increment the search for hitag value +1 once it reaches the correct pathnode ( ignoring others in its patch because they do not equal the hitag value, wich is important because the closest he just reached will need to be ignored so he can immediatly fixate on the next one. )
0

User is offline   Danukem 

  • Duke Plus Developer

#2757

View Postjimbob, on 19 August 2021 - 06:47 AM, said:

i tried setting up a headsprite loop but i dont know how to set it up, so it probably did an infinite runs and locked the game.


When I get some time I will put an example on the wiki (remind me if the weekend goes by and its still not there). Otherwise, if I post some code for you here, it will just be lost in time like so many other code snippets.

EDIT: You could also start the loop with "for spritesofstatus 1" which might be easier for you to get your head around:

https://wiki.eduke32.com/wiki/For

This post has been edited by Danukem: 19 August 2021 - 12:55 PM

0

User is offline   Danukem 

  • Duke Plus Developer

#2758

Here you go:

https://wiki.eduke32.../Headspritestat

My example shows how to set up the loop. But instead of counting, what you want to do is check picnum (for the waypoint actor), then check its tag. If your moving actor has already latched onto a waypoint, you don't need to keep running the loop unless it is close enough to require going to the next one, or in case something has gone wrong.
0

User is offline   jimbob 

#2759

Awesome, i’ll study that later today. Hardly slept so the info will probably not stick. Updating the wiki was a great idea, who knows what great nuggets of info are burried in this thread.
0

User is offline   Mark 

#2760

Probably not much from this year but here is a folder of con tips and tricks I gathered from posts over the years. I released it before but maybe you missed it. Its unorganized but still very useful.

Attached File(s)


1

User is offline   jimbob 

#2761

awesome :D
0

User is offline   jimbob 

#2762

View PostDanukem, on 19 August 2021 - 12:44 PM, said:

When I get some time I will put an example on the wiki (remind me if the weekend goes by and its still not there). Otherwise, if I post some code for you here, it will just be lost in time like so many other code snippets.

EDIT: You could also start the loop with "for spritesofstatus 1" which might be easier for you to get your head around:

https://wiki.eduke32.com/wiki/For

ive gotten it to work for like 80%, the actor moves towards the right point, ignores other points with a 'wrong' hitag value and clearly reaches the destination ( it sets off an explosion ) but then just keeps going in that direction, the loop doesnt seem to restart with the new COUNT +1 :/ the code could be heavily condensed with this method though.

TEMP in this context is the waypoint, and THISACTOR is whoever needs to go to the waypoint.
state navigate // navigate to the waypoint. 
for TEMP sprofstat 1 { getactor[TEMP].hitag MHITAG  ldist xydist THISACTOR TEMP }
ifvarvare MHITAG COUNT  // make sure the waypoint he is going to is the next sequential one, so he doesnt backtrack.
                                             // IE only find nearactor with a hightag the count currently has, one at a time.
	{
       		 getactor[TEMP].x MX
       		 getactor[TEMP].y MY
       		 getactor[THISACTOR].x x
       		 getactor[THISACTOR].y y
       		 subvarvar MX x
       		 subvarvar MY y
       		 getangle ANGVAR MX MY
       		 setactor[THISACTOR].ang ANGVAR
					ifl xydist 512
					ifvarvare MHITAG COUNT  // add 1 to count only if the current waypoint has the same value as the one where the player was moving towards, 
                                        // used to prevent a retrigger causing the count to rise 1 every tick the actor is within the set distance
					{
						addvar COUNT 1
						spawn EXPLOSION2
						break // force restart of the subroutine
					}

	}
ends


maybe it needs an actor side restart? say if the xydist is lower than 512 run the state again in the actors code?

This post has been edited by jimbob: 21 August 2021 - 08:09 AM

0

User is offline   Danukem 

  • Duke Plus Developer

#2763

You should be getting the hitags of the waypoints into a per actor var using eventloadactor, and then checking the var of the waypoint against the COUNT var. Right now you are pulling the actual hitag, and I'm guessing those are all zero. To be clear: you are using getactor[TEMP].hitag when you should be using getav[TEMP].hitag.

That would explain why it keeps going straight -- you increment COUNT but then no sprites in the map actually have the next hitag of 1.

Also, you need to check for the picnum before checking tags, because right now ANY sprite of statnum 1 with the right hitag will be seen as a target.
0

User is offline   jimbob 

#2764

i have my waypoints set up like a path for the recon car, i manually set the hightag for each pathnode with the apropriate hightag starting at 0 then 1 etc.
for now my code works for like 90% again, it sees the waypoint sprite, gets the angle, moves towards it, when he reaches it does an explosion and then again just keeps going straight. i used some setactor flag to change the pal for some steps so i can visually check what the actor is doing.

anyway, here's my piece of frankencode, im going to bed, not feeling too great meaning i cant focus right. :o

onevent EVENT_LOADACTOR 
//	switch sprite[].picnum // other way of checking the picnum, seems needlessly complicated.
//		case WAYPOINT
ifactor WAYPOINT
			{	
			    getactor[].hitag MHITAG
			    getactor[].lotag MLOTAG
			    // setactor[].hitag ZERO // resetting to zero seems counter intuitive to what i need.
			    // setactor[].lotag ZERO

			
			}
//		break
//	endswitch
endevent


state navigate
for TEMP sprofstat 1   
ife sprite[TEMP].picnum 5427
			{ 
				setactor[THISACTOR].pal 2 // if found the node, turn angry and try to grab it.
				getav[TEMP].HITAG MHITAG  
				ldist xydist THISACTOR TEMP 
			}
ifvarvare MHITAG COUNT  // make sure the waypoint he is going to is the next sequential one, so he doesnt backtrack. 
//IE only find nearactor with a hightag the count currently has, one at a time.
// ife sprite[TEMP].hitag COUNT 
	{
		
       		 getactor[TEMP].x MX
       		 getactor[TEMP].y MY
       		 getactor[THISACTOR].x x
       		 getactor[THISACTOR].y y
       		 subvarvar MX x
       		 subvarvar MY y
       		 getangle ANGVAR MX MY
       		 setactor[THISACTOR].ang ANGVAR

			{ 
				getav[TEMP].HITAG MHITAG  
				ldist xydist THISACTOR TEMP 
			} 
	}
else break

					ifl xydist 512
				 	ife sprite[TEMP].hitag COUNT 
					// ifvarvare MHITAG COUNT 
// add 1 to count only if the current waypoint has the same value as the one where the player was moving towards, 
// used to prevent a retrigger causing the count to rise 1 every tick the actor is within the set distance
					{
						setactor[THISACTOR].pal 1 // visual check, does he reach the point and stay in this line of code?
// it apears not. he immediatly turns to spritepal 2 again after briefly flashing blue. 
/// IE once the nasty node has been grabbed and destroyed move to the next one.
						addvar COUNT 1
						spawn EXPLOSION2
						break // force restart of the subroutine
					}
break
ends



This post has been edited by jimbob: 22 August 2021 - 03:22 PM

0

User is offline   Danukem 

  • Duke Plus Developer

#2765

I've got my own projects to worry about so I'm not spending any more time on this. The one piece of advice I will give you is you need to do more debugging than just spawning an explosion when the actor reaches the first waypoint. You need to be logging vars at key points to check what is going on.
0

User is offline   jimbob 

#2766

View PostDanukem, on 22 August 2021 - 04:34 PM, said:

I've got my own projects to worry about so I'm not spending any more time on this. The one piece of advice I will give you is you need to do more debugging than just spawning an explosion when the actor reaches the first waypoint. You need to be logging vars at key points to check what is going on.

adding logvars helped, managed to track down the issue and now have a working system.

state navigate
for temp sprofstat 1
ife sprite[temp].picnum WAYPOINT
                        { 
				getav[THISACTOR].COUNT COUNT 
				getactor[temp].htowner NODE 
				getactor[temp].hitag FOUNDHITAG
				ifvarvare FOUNDHITAG COUNT
					{
						addlogvar COUNT
						addlogvar FOUNDHITAG
						addlogvar NODE
					}
						ifvarvare FOUNDHITAG COUNT
						{

						        {              
						                 getactor[NODE].x MX
						                 getactor[NODE].y MY	
						                 getactor[THISACTOR].x x	
						                 getactor[THISACTOR].y y
						                 subvarvar MX x
						                 subvarvar MY y
						                 getangle ANGVAR MX MY
						                 setactor[THISACTOR].ang ANGVAR

						                        { 
										getactor[temp].htowner NODE 
						                                getav[NODE].FOUNDHITAG FOUNDHITAG 
						                                ldist xydist THISACTOR temp
						                        } 
										ifl xydist 512
						                        		{
						                                                addvar COUNT 1										
						                                        }
						        }
				
                      		  }
				
			}


ends

1

User is offline   jimbob 

#2767

quick question, how can i make an actor be affected by the masterswitch and or activator? i want my waypoint to be able to be 'switchable' for example, i want actors to stop navigating ( or waiting ) when a certain condition is not met. like a wall that has to be blown up, or a gate to be opened. imho the easiest way is to have a pal switch so when the pal is 1 the actor waits, but after doing X and the activator is activated, switch to pal 0 wich gives the OK to move ahead. right now the actors are piling up on a wall so i need a way to halt them.

another way would be a line of sight check, i tried that but for whatever reason they always seem to come back positive. :/
0

User is offline   Danukem 

  • Duke Plus Developer

#2768

https://wiki.eduke32...activatormotion

You can check for an activator being triggered using that.

Make sure that you test your ability to detect the activation separately from your code that makes the actors wait. I would use ifhitspace to trigger the waiting mechanic first just to make sure it works properly, then change it to trigger on the activator once you have it working. Otherwise if you test everything at once and then the inevitable failures occur you won't know where it is breaking.
0

User is offline   jimbob 

#2769

so activatormotion doesnt mean physical motion, but rather 'switching' motion? well even if it is i can just make a simple 2way train with it i guess. i came across that but it didnt seem like what i needed. guess i was wrong. thanks :)

This post has been edited by jimbob: 09 September 2021 - 11:02 AM

0

User is offline   Danukem 

  • Duke Plus Developer

#2770

You could also set a gamevar when a switch is used by checking its picnum, or have it set when a crack is blown up or whatever the condition is. You don't have to use checkactivatormotion, I just mentioned it because you specifically asked about activators.
1

User is offline   Salvation 

#2771

I was able to implement a scope code but my problem is that the scope won't shut down after i change my weapon.So the scope is active if i once press turnaround -key and then switch weapon and no matter does that other weapon has a scope code or not.

To shut it down i must "disable" scope by clicking turnaround off and then switch weapon.

Here is the code:
onevent EVENT_DISPLAYROOMS
ifvare currentweapon 3
//ifvare player[THISACTOR].curr_weapon 3 // if player has weapon m4 selected

 getinput[THISACTOR].bits TEMP1
 ifvarand TEMP1 268435456
 { addvar turnaround_keytime 1 }
  else
   { setvar  turnaround_keytime 0 }

ifvare turnaround_keytime 1
   { xorvar sight_on 1 }

ifvare sight_on 1
  {
   setaspect 32768 52428 // activate the 4x scope 
  }
endevent


What should i do to do following: If i have scope and i switch weapon which does not have scope code the setaspect will return as it is before scoping?
1

User is online   Reaper_Man 

  • Once and Future King

#2772

You probably need an "else" for that very first "ifvare currentweapon 3", and/or you need more brackets around things. So something like:

onevent EVENT_DISPLAYROOMS
ifvare currentweapon 3
{
    getinput[THISACTOR].bits TEMP1
    ifvarand TEMP1 268435456
        addvar turnaround_keytime 1
    else
        setvar  turnaround_keytime 0

    ifvare turnaround_keytime 1
        xorvar sight_on 1
}
else
    setvar sight_on 0

ifvare sight_on 1
    setaspect 32768 52428 // activate the 4x scope 
endevent

0

User is offline   Salvation 

#2773

Hey, thanks! It actually worked perfectly!

However i encountered another issue...

I have also another weapon that requires scope, it is in place of the shrinker. I tried to copy-paste the code you described above with only change that currentweapon -> 6

---> Result is that now both scopes does not work. The setaspect -effect is visible only on a 1 microsecond.
I do onevent EVENT_DISPLAYROOMS
---> then i paste code
endevent

Sorry to bother you like this. I thought that this code will work in a weapon like a weapon as long as i change the currentweapon -value. So what i should do so that the code can be modified to work in a more than a one weapon.

EDIT: I FOUND THE SOLUTION!

just a quick testing and felt that this one works: Switch the place of currentweapon and put a few { } more and made a rows for currentweapon 6.
onevent EVENT_DISPLAYROOMS
{
    getinput[THISACTOR].bits TEMP1
    ifvarand TEMP1 268435456
        addvar turnaround_keytime 1
    else
        setvar  turnaround_keytime 0

    ifvare turnaround_keytime 1
        xorvar sight_on 1
}
else
    setvar sight_on 0

ifvare sight_on 1
ifvare currentweapon 3
	{
    setaspect 32768 52428 // activate the 4x scope 
	}
ifvare sight_on 1
ifvare currentweapon 6
	{
    setaspect 32768 52428 // activate the 4x scope 
	}
endevent


This post has been edited by Salvation: 24 September 2021 - 03:04 PM

0

User is online   Reaper_Man 

  • Once and Future King

#2774

Not sure that is working the way you want, you have an orphan "else" with no "if" because you moved around code. I'm actually surprised that even compiles.

Just FYI, if you have a series of if statements with only a single command within them, you don't need brackets:

ifvare sight_on 1
    ifvare currentweapon 6
        setaspect 32768 52428


You could also tighten up your if logic at the end:

ifvare sight_on 1
{
    ifvare currentweapon 3
        setaspect 32768 52428 // activate the 4x scope 

    ifvare currentweapon 6
        setaspect 32768 52428 // activate the 4x scope 
}


I'd also argue that the key press processing being in the same block of code as the aspect ratio stuff is bad practice. You want your code to do one thing, and only one thing. So here's what I'd do:

appendevent EVENT_TURNAROUND
{
    geti .bits TEMP1
    ifand TEMP1 268435456
        add turnaround_keytime 1
    else
        set turnaround_keytime 0

    ife turnaround_keytime 1
        xor sight_on 1
}
endevent

onevent EVENT_DISPLAYROOMS
{
    ife sight_on 1
    {
        ife currentweapon 3
            setaspect 32768 52428
        else
        ife currentweapon 6
            setaspect 32768 52428
        else
            set sight_on 0
    }
}
endevent

0

User is offline   Salvation 

#2775

Sorry for my late response. I replaced my code with yours but result was that the sight stopped working. :unsure: When i press the turnaround key nothing happens. Could the issue be in my weapon code? I'm not using original renders, i'm using state -renders and scope code is quite interesting.
0

User is online   Reaper_Man 

  • Once and Future King

#2776

You could try changing EVENT_TURNAROUND to simply:

appendevent EVENT_TURNAROUND
{
    xor sight_on 1
}
endevent


Since you don't need the additional code capturing the key press.
0

User is offline   RPD Guy 

#2777

Hello there,

How can I check if there's a wall between 2 different coords in the game? I think that is something like "ifcansee".
0

#2778

View PostRPD Guy, on 01 October 2021 - 07:52 AM, said:

Hello there,

How can I check if there's a wall between 2 different coords in the game? I think that is something like "ifcansee".

https://wiki.eduke32.com/wiki/Cansee

Do you know how to set in variables?
If you are trying to make 2 actors check if they can see each other, remember that their xyz is the bottom center of the sprite.

This post has been edited by bullerbullerseven: 01 October 2021 - 09:56 AM

0

User is offline   RPD Guy 

#2779

View Postbullerbullerseven, on 01 October 2021 - 09:54 AM, said:

https://wiki.eduke32.com/wiki/Cansee

Do you know how to set in variables?
If you are trying to make 2 actors check if they can see each other, remember that their xyz is the bottom center of the sprite.



Thanks mr. bullerbullerseven.
That's just what I needed.
0

User is online   Reaper_Man 

  • Once and Future King

#2780

Is there a simple/clean way of detecting when a switch triggers a given channel?

I thought I remember some event for this. EVENT_MOVEEFFECTORS and EVENT_MOVESECTORS come close, but they relate to literal motion I'm really just looking for the actual switch talking on that channel. checkactivatormotion also seems to relate to physical motion.

This post has been edited by Reaper_Man: 14 October 2021 - 05:23 PM

0

User is offline   Hendricks266 

  • Weaponized Autism

  #2781

If you can navigate the source code and find the place where that is handled, we might be able to figure something out.
0

User is online   Reaper_Man 

  • Once and Future King

#2782

Already ahead of you. Working on AWOL and having to look into weird behaviors, I have become more familiar with the source code than I ever thought I would :lol:

I think this is happening in sector.cpp at P_ActivateSwitch, line 1227. Lines at 1480 is where the switches are told to perform the G_OperateActivators / G_ForceFields / G_MasterSwitches (with G_OperateRespawns already happening within G_OperateActivators at line 1061), and then play their sounds. I think an Event could be triggered here carrying the Lotag channel that is currently "talking". It looks like P_ActivateSwitch already handles a return 0 state, so we could even set RETURN 0 to cancel the switch. Although I didn't look into what is calling P_ActivateSwitch to see what returning 0 actually does or breaks. I assume just switches with invalid or orphaned Lotags.
0

User is offline   jimbob 

#2783

is there an easy way to make an enemy impervious to bullet weapons? i want to program a tank, so obviously i want bullets to do no damage. the hard way would be to add the health taken away back to the actor immediatly, but since there are a few types of bullet weapons it would require too much math. and obviously ifwasweapon shotspark1 { break } wont work as it still detracts damage.
0

Share this topic:


  • 124 Pages +
  • « First
  • 91
  • 92
  • 93
  • 94
  • 95
  • Last »
  • You cannot start a new topic
  • You cannot reply to this topic


All copyrights and trademarks not owned by Voidpoint, LLC are the sole property of their respective owners. Play Ion Fury! ;) © Voidpoint, LLC

Enter your sign in name and password


Sign in options