Am I doing something wrong, or is there something wrong with the mathlib vector?

Please post any questions about developing your plugin here. Please use the search function before posting!
User avatar
Doldol
Senior Member
Posts: 201
Joined: Sat Jul 07, 2012 7:09 pm
Location: Belgium

Am I doing something wrong, or is there something wrong with the mathlib vector?

Postby Doldol » Tue Sep 09, 2014 3:44 pm

The Vector seems to change it's values between when I store it and call it again?
Excuse the messy code, it's just for testing atm.

Full script:

Syntax: Select all

from memory import get_object_pointer
from memory import make_object
from memory import Convention, Argument, Return
from events import GameEvent
from memory.hooks import PreHook, PostHook
from core import PLATFORM
from effects import temp_entities, effects


from memory import StackData, Pointer, make_object
import memory

from memory.manager import manager
from memory.manager import CustomType
from memory.manager import Argument
#POINTER BOOL FLOAT ULONG CHAR USHORT DOUBLE SHORT LONGLONG STRING INT UINT UCHAR LONG
from memory.manager import Return
from memory import get_size

from filters.players import PlayerIter

from players.helpers import *
from players.entity import PlayerEntity
from entities.entity import BaseEntity


from _mathlib import Vector, RadianEuler, QAngle


from memory.manager import manager
from memory.helpers import Array
from filters.recipients import RecipientFilter
from messages import SayText2
from events import Event
from commands.client import ClientCommand
from commands.say import SayCommand
from players import PlayerGenerator
from engines.server import engine_server
from listeners.tick.delays import tick_delays


spray_locations = {}


#CSS
#offsets https://github.com/Source-Python-Dev-Team/Source.Python/blob/master/addons/source-python/data/source-python/virtuals/cstrike/CTempEntsSystem.ini
SPRAY_DECAL_FUNC = get_object_pointer(
temp_entities).make_virtual_function(
28 if PLATFORM == 'windows' else 29,
Convention.THISCALL,
(Argument.POINTER, Argument.POINTER, Argument.FLOAT, Argument.POINTER, Argument.INT, Argument.INT),
Return.VOID
)


#Try prehooking the func from lib too!!!
@PreHook(SPRAY_DECAL_FUNC)
#POINTER + IRecipientFilter& filer, float delay, const Vector* pos, int player, int entity
def pre_spray_decal(arguments):
vector = make_object(Vector, arguments[3])
player = PlayerEntity(arguments[4])
spray_locations[player.index] = vector
print(vector)
SayText2(message="\x04{0} \x01sprayed their spray @ \x05{1} {2} {3}\x01!".format(player.name, vector.x, vector.y, vector.z)).send()


def index_from_partial_name(name):
for playerinfo in PlayerGenerator():
if name in playerinfo.get_name():
return index_from_playerinfo(playerinfo)




def do_trace(playerinfo, command):
command = " ".join(list(command)[2:])
i_player = index_from_playerinfo(playerinfo)
a = index_from_partial_name(command)
if not a:
SayText2(message="Could not trace spray from \x04{0}\x01!".format(command)).send(RecipientFilter(i_player))
target = PlayerEntity(a)
try:
vector = spray_locations[target.index]
except KeyError:
SayText2(message="Could not trace spray from \x04{0}\x01!".format(target.name)).send(RecipientFilter(i_player))
else:
i_model = engine_server.precache_model('sprites/laserbeam.vmt')
#ngineServer.precache_decal("sprites/laser.vmt")
SayText2(message="Traced spray from \x04{0}\x01 to \x05{1} {2} {3}\x01!".format(target.name, vector.x, vector.y, vector.z)).send(RecipientFilter(i_player))
tick_delays.delay(0, effects.beam, vector, PlayerEntity(i_player).get_abs_origin(), i_model, i_model, 0, 0, 20.0, 1, 1, 0, 0, 255, 0, 255, 255, 0)
""" tick_delays.delay(0, temp_entities.beam_ent_point, RecipientFilter(i_player), # users
0.0, # fDelay
i_player, # iStartEntityIndex
PlayerEntity(i_player).get_abs_origin(), # vStartOrigin
0, # iEndEntityIndex
vector, # vEndOrigin
i_model, # szModelPath
1, # iHaloIndex
1, # iStartFrame
255, # iFrameRate
5.0, # fLife
3.0, # fWidth
3.0, # fEndWidth
10, # fFadeLength
5.0, # fAmplitude
255, # iRed
255, # iGreen
255, # iBlue
255, # iAlpha
1, # iSpeed)
)"""


@Event
def player_disconnect(event):
p_index = index_from_userid(event.get_int('userid'))
try:
del spray_locations[p_index]
except KeyError:
pass


@SayCommand('!tracespray')
def test_entry(playerinfo, teamonly, command):
do_trace(playerinfo, command)


@ClientCommand('egn_tracespray')
def entry_client(playerinfo, command):
do_trace(playerinfo, command)


"""
Gives:
EgN-L| Doldol | DSU sprayed their spray @ -1433.946044921875 528.03125 126.11534881591797!
EgN-L| Doldol | DSU : !tracespray
Traced spray from EgN-L| Doldol | DSU to 437893726208000.0 6.305843089461677e-44 437893122228224.0!
"""

User avatar
Ayuto
Project Leader
Posts: 2209
Joined: Sat Jul 07, 2012 8:17 am
Location: Germany

Postby Ayuto » Tue Sep 09, 2014 6:11 pm

Yes, this can happen if you convert a pointer to a Python class. The pointer was probably deallocated later. To solve the issue just create a copy of it.

Syntax: Select all

def pre_spray_decal(arguments):

vector = Vector(*tuple(make_object(Vector, arguments[3])))

player = PlayerEntity(arguments[4])

spray_locations[player.index] = vector

print(vector)

SayText2(message="\x04{0} \x01sprayed their spray @ \x05{1} {2} {3}\x01!".format(player.name, vector.x, vector.y, vector.z)).send()
Btw. you don't need to delay effects anymore. We have found and fixed the problem.
User avatar
Doldol
Senior Member
Posts: 201
Joined: Sat Jul 07, 2012 7:09 pm
Location: Belgium

Postby Doldol » Tue Sep 09, 2014 8:19 pm

Ah ok, good to know, I'll watch out for it in the future.

Return to “Plugin Development Support”

Who is online

Users browsing this forum: No registered users and 121 guests