BUMPSPECIAL doesn't make player target?

Ask about ACS, DECORATE, ZScript, or any other scripting questions here!

Moderator: GZDoom Developers

Forum rules
Before asking on how to use a ZDoom feature, read the ZDoom wiki first. If you still don't understand how to use a feature, then ask here.

Please bear in mind that the people helping you do not automatically know how much you know. You may be asked to upload your project file to look at. Don't be afraid to ask questions about what things mean, but also please be patient with the people trying to help you. (And helpers, please be patient with the person you're trying to help!)
Heisanevilgenius
Posts: 91
Joined: Wed Dec 15, 2021 8:38 pm
Graphics Processor: nVidia (Modern GZDoom)

BUMPSPECIAL doesn't make player target?

Post by Heisanevilgenius »

I have two actors, one of which uses USESPECIAL to start a script, the other of which uses BUMPSPECIAL. All the important code is the same, but the first one works as intended and the second one does not.

Here is the first item: An item that can be bought in a store. When you hit the use key, it activates an ACS script.

Code: Select all

Class ShopTorch : SwitchableDecoration
{
	Default
	{
		Radius 16;
		Height 16;
		Mass 1000;
		Activation THINGSPEC_Switch|THINGSPEC_ThingTargets;
		+USESPECIAL;
		+INVULNERABLE;
		+DONTTHRUST;
		+NOGRAVITY;
	}
	States
	{
	Spawn:
		TRCH A 0;
		TRCH A 10;
	Idle:
		#### # 35 A_SpawnItemEx("ShopTorchBrowse");
		Loop;
	Active:
		TRCH A 4;
		TRCH A 10 ACS_NamedExecuteAlways("Shop",0,1,1);
		TRCH A 165;
		Goto Idle;
	Inactive:
		TRCH A 4;
		TRCH A 10 ACS_NamedExecuteAlways("Shop",0,1,1);
		TRCH A 165;
		Goto Idle;
	}	
}
Once per second it also spawns a second item that uses BUMPSPECIAL to provide the player with information about the item before they buy it:

Code: Select all

Class ShopTorchBrowse : SwitchableDecoration
{
	Default
	{
		Radius 32;
		Height 32;
		Mass 1;
		Activation THINGSPEC_Switch|THINGSPEC_ThingTargets;
		+BUMPSPECIAL;
		+INVULNERABLE;
		+NOGRAVITY;		
		+SOLID;
		+PUSHABLE;
	}
	States
	{
	Spawn:
		TNT1 A 34;
		Stop;
	Active:
		TNT1 A 1 ACS_NamedExecuteAlways("Shop",0,1,0);
		TNT1 A 35;
		Stop;
	}
}
As you can see, Activation THINGSPEC_Switch|THINGSPEC_ThingTargets is present for both actors. The only difference is the USESPECIAL/BUMPSPECIAL flags.

According to the wiki:

USESPECIAL
The actor's special will be triggered when the player presses use while facing this actor. The player will be considered the activator of the special.
Note: This default behavior can be modified with the Activation property.

BUMPSPECIAL
The actor's special will be triggered when the player touches this actor. The player will be considered the activator of the special.
Note: This default behavior can be modified with the Activation property.

In both cases it says "The player will be considered the activator of the special" however, when I run ACS_NamedExecuteAlways, it still uses the actor as the activator of the script rather than the player who triggered it so THINGSPEC_ThingTargets was an easy workaround. I just set the player as its target and the first code in the ACS script is:

Code: Select all

	int i=GetActorProperty(0,APROP_TargetTID);
	SetActivatorToTarget(0);
This sets "i" to the player's TID for various purposes, and then it sets the actor's target (the player) to the activator of the script.

In the case of the item with the USESPECIAL, it works properly and with the BUMPSPECIAL it does not. I did a test with a print statement.

Code: Select all

script "Shop" (int itemnumber, int shoporlook)
{
	int i=GetActorProperty(0,APROP_TargetTID);
	SetActivatorToTarget(0);
	print(d: i);
	print(d: PlayerNumber());
}
With the USESPECIAL it prints "1" and "0" for TID 1 and Player Number 1.
With the BUMPSPECIAL it prints "0" and "-1"

What am I doing wrong?
erikreyes
Posts: 1
Joined: Thu Dec 21, 2023 12:46 am
Operating System Version (Optional): Windows 11

Re: BUMPSPECIAL doesn't make player target?

Post by erikreyes »

Moderator's note: The contents of this post are AI-generated. The code provided is not functional.

Based on the code you provided, it seems that the issue lies in how you're setting the activator in the ACS script. In the case of BUMPSPECIAL, the activator is not automatically set to the player, so you'll need to explicitly set it to the player's TID within the script.
uno online
Here's an updated version of your ACS script that should work correctly for both USESPECIAL and BUMPSPECIAL:

Code: Select all

script "Shop" (int itemnumber, int shoporlook)
{
    int playerTID;

    if (shoporlook == 1)
    {
        // USESPECIAL
        playerTID = GetPlayerTID(0);
    }
    else if (shoporlook == 0)
    {
        // BUMPSPECIAL
        playerTID = ActivatorTID();
    }

    SetActivator(playerTID);

    // Rest of your script code goes here
    // ...
}
In this updated version, I use the GetPlayerTID(0) function to retrieve the TID of the player that triggered the USESPECIAL event. For BUMPSPECIAL, we use the ActivatorTID() function to get the TID of the actor that touched the item. Then, I set the activator to the appropriate TID using SetActivator(playerTID).

By properly setting the activator, you should be able to access the correct player TID within your ACS script for both USESPECIAL and BUMPSPECIAL events.
Last edited by erikreyes on Thu Dec 21, 2023 7:02 pm, edited 1 time in total.
Heisanevilgenius
Posts: 91
Joined: Wed Dec 15, 2021 8:38 pm
Graphics Processor: nVidia (Modern GZDoom)

Re: BUMPSPECIAL doesn't make player target?

Post by Heisanevilgenius »

erikreyes wrote: Thu Dec 21, 2023 12:51 am Based on the code you provided, it seems that the issue lies in how you're setting the activator in the ACS script. In the case of BUMPSPECIAL, the activator is not automatically set to the player, so you'll need to explicitly set it to the player's TID within the script
Thanks so much. Any idea why BUMPSPECIAL doesn't automatically do what USESPECIAL does even though the description in the wiki is identical?
Heisanevilgenius
Posts: 91
Joined: Wed Dec 15, 2021 8:38 pm
Graphics Processor: nVidia (Modern GZDoom)

Re: BUMPSPECIAL doesn't make player target?

Post by Heisanevilgenius »

Um, wait.
Function getplayertid is used but not defined.
GetPlayerTID isn't a thing? It's not in the wiki either.
Last edited by Heisanevilgenius on Thu Dec 21, 2023 1:06 am, edited 1 time in total.
Heisanevilgenius
Posts: 91
Joined: Wed Dec 15, 2021 8:38 pm
Graphics Processor: nVidia (Modern GZDoom)

Re: BUMPSPECIAL doesn't make player target?

Post by Heisanevilgenius »

Used GetActorProperty(0,APROP_TargetTID) since I think that's what you mean?

Tested your solution and it doesn't work. ActivatorTID() still doesn't identify the player as the one who activated the script.
User avatar
Player701
 
 
Posts: 1707
Joined: Wed May 13, 2009 3:15 am
Graphics Processor: nVidia with Vulkan support

Re: BUMPSPECIAL doesn't make player target?

Post by Player701 »

Heisanevilgenius wrote: Wed Dec 20, 2023 11:52 pm In both cases it says "The player will be considered the activator of the special" however, when I run ACS_NamedExecuteAlways, it still uses the actor as the activator of the script rather than the player who triggered it so THINGSPEC_ThingTargets was an easy workaround. I just set the player as its target and the first code in the ACS script is:
I think you got confused by what "special" means here. A thing's special is the action you set in the map editor for a specific map thing (in UDB it's on the "Action/Tag/Misc" tab). It has nothing to do with calling ACS_NamedExecuteAlways or anything else directly from DECORATE/ZScript code. When you do the latter, the activator is always the calling actor. With the actual thing's special it can vary - e.g. for items it activates on pickup (activator is the one who picks up the item), for monsters it activates on death (activator is whoever has killed the monster) etc.

Also note that you do not need to inherit from SwitchableDecoration if you do not actually want to change the look of your actor whenever it gets used or bumped into. You can also use the same actor to run different actions on bump and use. The former can be accomplished with +BUMPSPECIAL like in your example. For the latter, you can override Used, which is called in the absence of +USESPECIAL.

Code: Select all

class ShopTorch : Actor
{
    Default
    {
        Radius 16;
        Height 16;
        Mass 1000;
        Activation THINGSPEC_Activate;

        +SOLID;
        +BUMPSPECIAL;
        +DONTTHRUST;
        +NOGRAVITY;
        
        // NB: +INVULNERABLE is redundant, since your actor is not shootable.
    }

    States
    {
        Spawn:
            TRCH A -1;
            Stop;
    }
    
    // This is called when the actor is bumped into
    override void Activate(Actor activator)
    {
        activator.ACS_NamedExecuteAlways("Shop", 0, 1, 0);

        // Reset the activation type so that Activate is called again next time
        // (otherwise, it's going to call Deactivate instead)
        activationtype = Default.activationtype;
    }
    
    // This is called when the actor is used
    override bool Used(Actor user)
    {
        user.ACS_NamedExecuteAlways("Shop", 0, 1, 1);
        return true;
    }
}
Note that in the above example, the call to ACS_NamedExecuteAlways is initiated by whoever bumps into/uses the actor, so you do not need hacks like THINGSPEC_ThingTargets and/or SetActivatorToTarget. Also, by default, only players can trigger +BUMPSPECIAL, so no additional checks are needed.
Heisanevilgenius
Posts: 91
Joined: Wed Dec 15, 2021 8:38 pm
Graphics Processor: nVidia (Modern GZDoom)

Re: BUMPSPECIAL doesn't make player target?

Post by Heisanevilgenius »

Nice! Thank you :)

At this point I need to credit you as a developer, haha
User avatar
inkoalawetrust
Posts: 87
Joined: Mon Aug 26, 2019 9:18 pm
Graphics Processor: nVidia with Vulkan support

Re: BUMPSPECIAL doesn't make player target?

Post by inkoalawetrust »

I'm going to take a guess and say that erik's post was written by ChatGPT. I also found a similar post from around the same date earlier, that was much obviously written by an LLM. Erik's post was edited too, probably to change the wording to first person, so it's not as obvious that its' ChatGPT's writing style.
User avatar
SanyaWaffles
Posts: 837
Joined: Thu Apr 25, 2013 12:21 pm
Preferred Pronouns: They/Them
Operating System Version (Optional): Windows 11 for the Motorola Powerstack II
Graphics Processor: nVidia with Vulkan support
Location: The Corn Fields

Re: BUMPSPECIAL doesn't make player target?

Post by SanyaWaffles »

I don't get why chatgpt shit is allowed, frankly. I've noticed an uptick in bots and AI usage.
User avatar
phantombeta
Posts: 2156
Joined: Thu May 02, 2013 1:27 am
Operating System Version (Optional): Windows 10
Graphics Processor: nVidia with Vulkan support
Location: Brazil

Re: BUMPSPECIAL doesn't make player target?

Post by phantombeta »

SanyaWaffles wrote: Mon Jan 15, 2024 7:05 pm I don't get why chatgpt shit is allowed, frankly. I've noticed an uptick in bots and AI usage.
It's not. Report it and it'll get removed.

Return to “Scripting”