Skip to content

Commit

Permalink
expose events
Browse files Browse the repository at this point in the history
  • Loading branch information
s95rob committed Oct 22, 2023
1 parent 5e2d762 commit 1b2d078
Show file tree
Hide file tree
Showing 13 changed files with 485 additions and 20 deletions.
1 change: 1 addition & 0 deletions CMake/Package.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ add_custom_command(TARGET Source2Py POST_BUILD

COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:Source2Py> "${SOURCE2PY_PACKAGE_DIR}/bin"
COMMAND ${CMAKE_COMMAND} -E copy "${SOURCE2PY_PACKAGE_RES_DIR}/pyplugins.ini" "${SOURCE2PY_PACKAGE_DIR}"
COMMAND ${CMAKE_COMMAND} -E copy "${SOURCE2PY_PACKAGE_RES_DIR}/gameevents.ini" "${SOURCE2PY_PACKAGE_DIR}/bin"

# Copy sample plugins to package directory
COMMAND ${CMAKE_COMMAND} -E copy "${SAMPLE_PLUGINS_DIR}/SamplePlugin.py" "${SOURCE2PY_PACKAGE_DIR}/plugins"
Expand Down
287 changes: 287 additions & 0 deletions CMake/Resources/gameevents.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,287 @@
# Dumped event names from CS2, not all are tested
# https://cs2.poggu.me/dumped-data/game-events/

server_spawn
server_pre_shutdown
server_shutdown
server_message
server_cvar
player_activate
player_connect_full
player_full_update
player_connect
player_disconnect
player_info
player_spawn
player_team
local_player_team
local_player_controller_team
player_changename
player_hurt
player_chat
local_player_pawn_changed
teamplay_broadcast_audio
finale_start
player_stats_updated
user_data_downloaded
ragdoll_dissolved
team_info
team_score
hltv_cameraman
hltv_chase
hltv_rank_camera
hltv_rank_entity
hltv_fixed
hltv_message
hltv_status
hltv_title
hltv_chat
hltv_versioninfo
hltv_replay
demo_start
demo_stop
demo_skip
map_shutdown
map_transition
hostname_changed
difficulty_changed
game_message
game_newmap
round_start
round_end
round_start_pre_entity
round_start_post_nav
round_freeze_end
teamplay_round_start
player_death
player_footstep
player_hintmessage
break_breakable
break_prop
entity_killed
door_close
vote_started
vote_failed
vote_passed
vote_changed
vote_cast_yes
vote_cast_no
achievement_event
achievement_earned
achievement_write_failed
bonus_updated
spec_target_updated
spec_mode_updated
entity_visible
gameinstructor_draw
gameinstructor_nodraw
flare_ignite_npc
helicopter_grenade_punt_miss
physgun_pickup
inventory_updated
cart_updated
store_pricesheet_updated
item_schema_initialized
drop_rate_modified
event_ticket_modified
gc_connected
instructor_start_lesson
instructor_close_lesson
instructor_server_hint_create
clientside_lesson_closed
dynamic_shadow_light_changed
gameui_hidden
items_gifted
player_score
player_shoot
game_init
game_start
game_end
round_announce_match_point
round_announce_final
round_announce_last_round_half
round_announce_match_start
round_announce_warmup
round_end_upload_stats
round_officially_ended
round_time_warning
ugc_map_info_received
ugc_map_unsubscribed
ugc_map_download_error
ugc_file_download_finished
ugc_file_download_start
begin_new_match
dm_bonus_weapon_start
survival_announce_phase
broken_breakable
player_decal
achievement_increment
set_instructor_group_enabled
instructor_server_hint_stop
read_game_titledata
write_game_titledata
reset_game_titledata
weaponhud_selection
vote_ended
vote_cast
vote_options
endmatch_mapvote_selecting_map
endmatch_cmm_start_reveal_items
client_loadout_changed
add_player_sonar_icon
add_bullet_hit_marker
other_death
item_purchase
bomb_beginplant
bomb_abortplant
bomb_planted
bomb_defused
bomb_exploded
bomb_dropped
bomb_pickup
defuser_dropped
defuser_pickup
announce_phase_end
cs_intermission
bomb_begindefuse
bomb_abortdefuse
hostage_follows
hostage_hurt
hostage_killed
hostage_rescued
hostage_stops_following
hostage_rescued_all
hostage_call_for_help
vip_escaped
vip_killed
player_radio
bomb_beep
weapon_fire
weapon_fire_on_empty
grenade_thrown
weapon_outofammo
weapon_reload
weapon_zoom
silencer_detach
inspect_weapon
weapon_zoom_rifle
player_spawned
item_pickup
item_pickup_slerp
item_pickup_failed
item_remove
ammo_pickup
item_equip
enter_buyzone
exit_buyzone
buytime_ended
enter_bombzone
exit_bombzone
enter_rescue_zone
exit_rescue_zone
silencer_off
silencer_on
buymenu_open
buymenu_close
round_prestart
round_poststart
grenade_bounce
hegrenade_detonate
flashbang_detonate
smokegrenade_detonate
smokegrenade_expired
molotov_detonate
decoy_detonate
decoy_started
tagrenade_detonate
inferno_startburn
inferno_expire
inferno_extinguish
decoy_firing
bullet_impact
player_jump
player_blind
player_falldamage
door_moving
mb_input_lock_success
mb_input_lock_cancel
nav_blocked
nav_generate
achievement_info_loaded
hltv_changed_mode
cs_game_disconnected
cs_round_final_beep
cs_round_start_beep
cs_win_panel_round
cs_win_panel_match
cs_match_end_restart
cs_pre_restart
show_deathpanel
hide_deathpanel
player_avenged_teammate
achievement_earned_local
repost_xbox_achievements
match_end_conditions
round_mvp
show_survival_respawn_status
client_disconnect
gg_player_levelup
ggtr_player_levelup
ggprogressive_player_levelup
gg_killed_enemy
gg_final_weapon_achieved
gg_bonus_grenade_achieved
switch_team
gg_leader
gg_team_leader
gg_player_impending_upgrade
write_profile_data
trial_time_expired
update_matchmaking_stats
player_reset_vote
enable_restart_voting
sfuievent
start_vote
player_given_c4
gg_reset_round_start_sounds
tr_player_flashbanged
tr_mark_complete
tr_mark_best_time
tr_exit_hint_trigger
bot_takeover
tr_show_finish_msgbox
tr_show_exit_msgbox
jointeam_failed
teamchange_pending
material_default_complete
cs_prev_next_spectator
cs_handle_ime_event
nextlevel_changed
seasoncoin_levelup
tournament_reward
start_halftime
ammo_refill
parachute_pickup
parachute_deploy
dronegun_attack
drone_dispatched
loot_crate_visible
loot_crate_opened
open_crate_instr
smoke_beacon_paradrop
survival_paradrop_spawn
survival_paradrop_break
drone_cargo_detached
drone_above_roof
choppers_incoming_warning
firstbombs_incoming_warning
dz_item_interaction
survival_teammate_respawn
survival_no_respawns_warning
survival_no_respawns_final
player_ping
player_ping_stop
player_sound
guardian_wave_restart
team_intro_start
team_intro_end
71 changes: 71 additions & 0 deletions Source2Py/src/Events.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
#include "Events.h"
#include "Utility.h"

#include <vector>
#include <fstream>
#include <igameevents.h>
#include <eiface.h>

#define EVENTLISTENER_SLOTS 300 // todo: remove

namespace Source2Py {

extern IGameEventManager2* gameevents;
extern IServerGameDLL* server;

std::vector<EventListener> eventListeners;

bool EventService::Init() {
gameevents = static_cast<IGameEventManager2*>(CallVFunc<IToolGameEventAPI*, 91>(server)); // get interface from ISource2Server vtable (func signature incomplete)
if (!gameevents) {
Log::Write("Failed to load IGameEventManager2!");
return false;
}

Log::Write("IGameEventManager2 @ 0x" + AddrToString(static_cast<void*>(gameevents)));
Log::Write("EventService initialized");
return true;
}

bool EventService::LoadEventsFromFile(const std::string& filepath) {
std::ifstream eventsFile(filepath);

if (eventsFile.fail()) {
Log::Error("Failed to load events file: " + filepath);
return false;
}

// Keep the EventListeners memory block from jumping around
// todo: precalculate the exact vector size needed. this is a crash waiting to happen if events
eventListeners.reserve(EVENTLISTENER_SLOTS);
Log::Write("Reserved " + std::to_string(EVENTLISTENER_SLOTS) + " EventListener slots (" + std::to_string(sizeof(EventListener) * EVENTLISTENER_SLOTS) + " bytes)");

std::string line;
while (std::getline(eventsFile, line)) {
// ignore comments
if (line[0] == '#' || line[0] == ';' || line.empty())
continue;

eventListeners.push_back(line);
EventListener& listener = eventListeners.back();

if (!gameevents->AddListener(&listener, listener.GetEventName(), true)) {
Log::Write("Failed to add EventListener: " + std::string(listener.GetEventName()));
eventListeners.pop_back();
}
}

Log::Write("Added " + std::to_string(eventListeners.size()) + " EventListeners");
if (eventListeners.size() > EVENTLISTENER_SLOTS) // todo: remove
Log::Error("Added more EventListeners than reserved, prepare for crash!");

return true;
}

void EventService::UnloadEvents() {
for (auto& listener : eventListeners)
gameevents->RemoveListener(&listener);

Log::Write("Unloaded all EventListeners");
}
}
Loading

0 comments on commit 1b2d078

Please sign in to comment.