Page 1 of 1

trigger_push, change push speed

Posted: Wed Jan 29, 2020 4:47 am
by InvisibleSoldiers
I'm trying to change push speed of trigger_push entity, Fortunately, push direction of the trigger is declared as datamap property, so it easy to change but the pushspeed - no.
I found out offset from CBaseTrigger to the variable is 0x74. But nothing happen when I set myself pushspeed, it remains the same actually.

CTriggerPush::Touch: https://github.com/ValveSoftware/source ... .cpp#L2242

Syntax: Select all

trigger_push_touch = server_binary['_ZN12CTriggerPush5TouchEP11CBaseEntity'].make_function(
Convention.THISCALL,
(DataType.POINTER, DataType.POINTER),
DataType.VOID
)

@PreHook(trigger_push_touch)
def pre_hook(stack_data):
print(stack_data[0].get_float(0x74)) # Real m_flPushspeed
stack_data[0].set_float(512.0, 0x74) # Changed but it doesn't lead to anything.

Re: trigger_push, change push speed

Posted: Wed Jan 29, 2020 7:17 am
by Sam
Maybe?

Code: Select all

stack_data[0].set_float(0x74, 512.0)

http://wiki.sourcepython.com/developing ... .set_float

Re: trigger_push, change push speed

Posted: Wed Jan 29, 2020 7:45 am
by InvisibleSoldiers
Sam wrote:Maybe?

Code: Select all

stack_data[0].set_float(0x74, 512.0

http://wiki.sourcepython.com/developing ... .set_float

set_float((Pointer)arg1, (float)arg2[, (Channel)offset=0]) → None

Re: trigger_push, change push speed

Posted: Wed Jan 29, 2020 7:54 am
by L'In20Cible
Your offset is definitely wrong. No way 0x74 is pointing to CTriggerPush::m_flPushSpeed. Hint:

Syntax: Select all

from entities.entity import Entity
from mathlib import Vector
from memory import get_size

entity = Entity.find_or_create('trigger_push')
print(
'm_flPushSpeed\'s offset is between ' +
f"{entity.datamap.find('m_vecPushDir').offset + get_size(Vector)} and " +
f"{entity.factory.size}."
)

Re: trigger_push, change push speed

Posted: Wed Jan 29, 2020 10:44 am
by InvisibleSoldiers
L'In20Cible wrote:Your offset is definitely wrong. No way 0x74 is pointing to CTriggerPush::m_flPushSpeed. Hint:

Syntax: Select all

from entities.entity import Entity
from mathlib import Vector
from memory import get_size

entity = Entity.find_or_create('trigger_push')
print(
'm_flPushSpeed\'s offset is between ' +
f"{entity.datamap.find('m_vecPushDir').offset + get_size(Vector)} and " +
f"{entity.factory.size}."
)

Thank you!

Syntax: Select all

@PreHook(trigger_push_touch)
def pre_hook(stack_data):
index = index_from_pointer(stack_data[1])

if 0 < index < 65:
player = playerdict[index]

if player.playing_style.trigger_push_scale >= 0:
default = stack_data[0].get_float(0x484)

stack_data[0].set_float(default * player.playing_style.trigger_push_scale, 0x484)
trigger_push_touch.skip_hooks(stack_data[0], stack_data[1])
stack_data[0].set_float(default, 0x484)

return False