Page 1 of 1

New release July 2nd, 2015!!

Posted: Thu Jul 02, 2015 4:24 am
by satoon101
There have been a lot of good updates since the last release. Here is a quick rundown of the highlights to those changes:

  • added PlayerEntity.client_command(<str command>, [bool server_side])
  • added PlayerEntity.slay()
  • added EntityPostHook and EntityPreHook decorators to entities.hooks:
    • @Entity<type>Hook(<str/list entity type(s)>, <str entity-method>)
    • no longer a need to make sure an entity is on the server to create the hook
  • added set_transmit virtual function to CBaseEntity data
  • added sys.argv to get command line arguments when server was initialized
  • added hard-coded entity KeyValues capabilities to Entity/PlayerEntity server classes
  • added voice module with voice_server singleton
  • added ability to get virtual functions of exposed member functions
    • added a new FunctionInfo class, which stores information of a virtual member function.
    • added a new Pointer.make_function() method, which requires a FunctionInfo object.
    • added new functions to the memory module to retrieve FunctionInfo objects, class information, class names of the C++ classes, etc.
    • Note: currently we have only added FunctionInfo objects for the IVoiceServer class. We will add more very soon.
    • Here is an example on how to use the new functionality:

      Syntax: Select all

      import memory

      from memory.hooks import PreHook
      from players.voice import voice_server

      # This function will be added in the next release
      def get_function(obj, function_name, function_index=0):
      return memory.get_object_pointer(obj).make_function(
      memory.get_function_info(obj, function_name, function_index))

      @PreHook(get_function(voice_server, 'SetClientListening'))
      def on_pre_set_client_listening(args):
      print(args)
  • correctly raises a NameError when trying to get an entity KeyValue when the entity contains no KeyValue of the given name
  • exposed CCheckTransmitInfo
  • fixed several reported issues
  • added Function.is_hooked() to test if the function (address) was hooked by SP
  • reorganized the memory module on the C++ side (it's now much easier to read. though, that's just an internal change)
  • updated data files (virtual function indexes)

For the full change log, look here:
https://github.com/Source-Python-Dev-Team/Source.Python/compare/90bf270...37a0444

As always, the release can be found here:
https://github.com/Source-Python-Dev-Team/Source.Python/releases

We do hope to have a build-bot site up and running fairly soon. We are just waiting on a couple things to get done before that becomes a reality. This means that in the future, you will be able to get an updated snapshot when we commit to the development branch.

Posted: Thu Jul 02, 2015 9:18 am
by stonedegg
As always, great work!

Posted: Thu Jul 02, 2015 11:50 am
by Mahi
These are some insanely nice features! Awesome job, thank you very much for these! :)

Posted: Thu Jul 02, 2015 7:54 pm
by Ayuto
I have updated the main post with some additional points. :)

Posted: Wed Jul 15, 2015 9:13 pm
by qazuar
I wrote this in the previous release:
I have a small issue with remove_entity.
It works fine with 1 client connected to the server, it does however not work at all when there are multiple clients on the server.
I'm talking about actual human players and not bots, as I've been unable to meet this issue with me alone and a lot of bots.

This is on CS:GO (I dont know about the other games), and I've tested it on 2 different windows servers.
No errors appear in the console, basically remove_entity is just doing nothing.


I've been able to reproduce the issue, and it has nothing to do with the amount of players connected.
The issue basically starts to happen if you do like the following:

Syntax: Select all

def test():
remove_entity(index1)
remove_entity(index2)


Using it like that somehow breaks everything and remove_entity entirely stops working until you change map.

Technically, I just want to know if it is supposed to stop working when used multiple times at the same time in the code.
Although this did not happen a long time ago.

Still only tested on CS:GO windows.

Posted: Wed Jul 15, 2015 9:20 pm
by Ayuto
We are using a little workaround on CS:GO to remove entities. What happens if you remove this function instead?

Syntax: Select all

from entities.entity import Entity

def remove_entity(index):
Entity(index).call_input('Kill')

Posted: Thu Jul 16, 2015 4:05 pm
by qazuar
Don't you mean "use this function instead?".
Anyway, yes it seems to work fine using call_input('Kill') as an alternative solution.

Posted: Thu Jul 16, 2015 5:34 pm
by satoon101
Yes, that is what he meant. Also, we have the Kill Input dynamically added as the 'remove' method for the Entity class:

https://github.com/Source-Python-Dev-Team/Source.Python/blob/master/addons/source-python/data/source-python/entities/CBaseEntity.ini#L16

Syntax: Select all

Entity(index).remove()

Posted: Fri Jul 17, 2015 11:10 am
by Mahi
satoon101 wrote:Yes, that is what he meant. Also, we have the Kill Input dynamically added as the 'remove' method for the Entity class:

https://github.com/Source-Python-Dev-Team/Source.Python/blob/master/addons/source-python/data/source-python/entities/CBaseEntity.ini#L16

Syntax: Select all

Entity(index).remove()

Is there a reason it's not called .kill()? Just wondering, since SP is quite consistent with the Source engine's naming.

Posted: Fri Jul 17, 2015 1:19 pm
by satoon101
When it was first added, we didn't have a built in way to slay a player. If someone saw that a PlayerEntity instance had a 'kill' method, they might try to use it and it would crash their server instead of kill the player. We do have a 'slay' method now, that we could also wrap with kill, which would eliminate that issue. That is something we probably need to consider. Though, remove is technically what the Kill input does, so that should be taken into consideration, as well.

Posted: Fri Jul 17, 2015 5:16 pm
by Mahi
satoon101 wrote:When it was first added, we didn't have a built in way to slay a player. If someone saw that a PlayerEntity instance had a 'kill' method, they might try to use it and it would crash their server instead of kill the player. We do have a 'slay' method now, that we could also wrap with kill, which would eliminate that issue. That is something we probably need to consider. Though, remove is technically what the Kill input does, so that should be taken into consideration, as well.

Yeah actually, I think .remove() sounds much better (even though it's not the one valve is using). kill really does sound like a way to kill a player, even if there's slay() for that.

Posted: Sat Jul 25, 2015 7:53 am
by nullable
After install new version of plugin I can't send command exit to server. I have an error:

Syntax: Select all

Segmentation fault (core dumped)
BFD: Warning: /home/csgoserver/serverfiles/core is truncated: expected core file size >= 227799040, found: 1085440.
Cannot access memory at address 0xb7793908
Cannot access memory at address 0xb7793904
debug.cmds:1: Error in sourced command file:
Cannot access memory at address 0xbf853600
email debug.log to linux@valvesoftware.com
Sat Jul 25 07:43:30 UTC 2015: Server restart in 10 seconds

Posted: Sat Jul 25, 2015 11:26 am
by Ayuto

Posted: Sat Jul 25, 2015 11:31 am
by nullable
Ok. Thanks. Can you make a new release with this fix?

Posted: Sun Jul 26, 2015 5:42 am
by nullable
I think its a critical bug. When will the next release of the plugin?