[TF2] Retrieving the amount of ammo in a gun

Please post any questions about developing your plugin here. Please use the search function before posting!
123marble
Junior Member
Posts: 6
Joined: Fri Mar 03, 2017 5:46 pm

[TF2] Retrieving the amount of ammo in a gun

Postby 123marble » Fri Mar 10, 2017 5:44 pm

Hey, everybody! I was wondering if there is a way to find out the amount of ammo in a gun in TF2. I am using the weapons.entity.Weapon module thing and used player.active_weapon to find the weapon. What's strange is that I can access the value of a clip in my weapon but not the value of the ammo. The error I receive is that this is not supported for game TF.

Syntax: Select all

from filters.players import PlayerIter
from players.entity import Player
from weapons.entity import Weapon

alive_players = PlayerIter('alive')

for player in alive_players:
if player.name == "Dr. Seuss": # my steam character
player = player
break
global gun
gun= player.active_weapon
clip= gun.clip # this works and prints out the clip size
print(clip)
ammo = gun.ammo # errors and says not compatible with TF
print(ammo)


I figure there must be a way to find the current ammo of the gun, i just don't know how. Any help would be greatly appreciated.
User avatar
Ayuto
Project Leader
Posts: 2193
Joined: Sat Jul 07, 2012 8:17 am
Location: Germany

Re: [TF2] Retrieving the amount of ammo in a gun

Postby Ayuto » Fri Mar 10, 2017 6:08 pm

Could you please post the exception you get? Also, which weapon did you test?
User avatar
satoon101
Project Leader
Posts: 2697
Joined: Sat Jul 07, 2012 1:59 am

Re: [TF2] Retrieving the amount of ammo in a gun

Postby satoon101 » Fri Mar 10, 2017 6:10 pm

The issue is because we don't have any weapon data for TF2:
https://github.com/Source-Python-Dev-Te ... on/weapons

If you want to, please feel free to find out the info we need and create a pull request. You can use the current files for other games as a reference and ask questions here.
Image
123marble
Junior Member
Posts: 6
Joined: Fri Mar 03, 2017 5:46 pm

Re: [TF2] Retrieving the amount of ammo in a gun

Postby 123marble » Sat Mar 11, 2017 5:40 pm

satoon101 wrote:The issue is because we don't have any weapon data for TF2:
https://github.com/Source-Python-Dev-Te ... on/weapons

If you want to, please feel free to find out the info we need and create a pull request. You can use the current files for other games as a reference and ask questions here.


Interesting... I don't really know what I am doing but am eager to help. I looked through the link you gave me and I think I am right in saying you are missing a tf.ini file, I just don't really understand how everything fits together yet. From where should I get the information from to complete the file? Here is what I have done so far:

Syntax: Select all

[properties]
prefix = "weapon_" # is this right? On alliedmodders every weapon is
# tf_weapon_WEAPONNAME
ammoprop = "localdata.m_iAmmo."
myweapons = "m_hMyWeapons."

[projectiles]

spellbook_projectile = "spellbook"
grenade_jar = jar
grenade_jar_milk = jar_milk

[weapons]

# =========================================================================
# PRIMARY WEAPONS
# =========================================================================


[[scattergun]]
slot = 1
clip = 6
maxammo = 32
ammoprop = 2 # I don't really understand what this is
item_definition_index = 16
tags = "all,primary,scattergun"


[[rocketlauncher]]
slot = 1
clip = 4
maxammo = 20
ammoprop = 2
item_definition_index = 22
tags = "all,primary,rocketlauncher"



# =========================================================================
# SECONDARY WEAPONS
# =========================================================================
[[pistol_scout]]
slot = 2
clip = 12
maxammo = 36
ammoprop = 2
item_definition_index = 42
tags = "all,secondary,pistol"

[[shotgun_soldier]]
slot = 2
clip = 6
maxammo = 32
ammoprop = 2
item_definition_index = 13
tags = "all,secondary,shotgun"


# =========================================================================
# MELEE WEAPONS
# =========================================================================

[[bat]]
slot = 3
item_definition_index = 42
tags = "all,melee,bat"

[[shotgun_soldier]]
slot = 3
item_definition_index = 9
tags = "all,melee,shovel"



# =========================================================================
# OTHER WEAPONS
# =========================================================================

# =========================================================================
# EXPLOSIVE WEAPONS
# =========================================================================


I copied the hl2mp.ini file as a template, and for index and names am using the tf weaponID file.
https://github.com/Source-Python-Dev-Te ... aponID.ini

I think that the prefix should be weapon_, but I an not sure because on alliedmodders every weapon has tf_weapon before it.
https://wiki.alliedmods.net/Team_fortre ... on_indexes

I also have no idea what ammoprop is or how to find the value of that out. Hopefully I've not done everything completely wrong, I just have a limited understanding at the moment. Sorry for asking so many questions all at once, i am relatively new to this sort of thing.
123marble
Junior Member
Posts: 6
Joined: Fri Mar 03, 2017 5:46 pm

Re: [TF2] Retrieving the amount of ammo in a gun

Postby 123marble » Sat Mar 11, 2017 5:44 pm

Ayuto wrote:Could you please post the exception you get? Also, which weapon did you test?

Sorry, I probably should've included this before. I was using the original, and here is the exception.

[SP] Caught an Exception:
Traceback (most recent call last):
File "..\addons\source-python\packages\source-python\plugins\command.py", line 162, in load_plugin
plugin = self.manager.load(plugin_name)
File "..\addons\source-python\packages\source-python\plugins\manager.py", line 193, in load
plugin._load()
File "..\addons\source-python\packages\source-python\plugins\instance.py", line 74, in _load
self.module = import_module(self.import_name)
File "..\addons\source-python\plugins\test\test.py", line 89, in <module>
ammo = gun.ammo # errors and says not compatible with TF
File "..\addons\source-python\packages\source-python\weapons\_base.py", line 75, in get_ammo
base=weapon_manager.ammoprop,
File "..\addons\source-python\packages\source-python\weapons\default.py", line 29, in __getattribute__
'No support for game "{0}"'.format(GAME_NAME))

NotImplementedError: No support for game "tf"
User avatar
satoon101
Project Leader
Posts: 2697
Joined: Sat Jul 07, 2012 1:59 am

Re: [TF2] Retrieving the amount of ammo in a gun

Postby satoon101 » Sat Mar 11, 2017 6:38 pm

You can get a list of all entity class names by using the dumpentityfactories command on the server. The current output for TF2 is:

Code: Select all

_ballplayertoucher
_firesmoke
_plasma
ai_ally_speech_manager
ai_battle_line
ai_changehintgroup
ai_changetarget
ai_goal_assault
ai_goal_follow
ai_goal_lead
ai_goal_lead_weapon
ai_goal_standoff
ai_hint
ai_network
ai_relationship
ai_script_conditions
ai_sound
ai_speechfilter
aiscripted_schedule
aitesthull
ambient_generic
archer_proxy
assault_assaultpoint
assault_rallypoint
base_boss
beam
bot_action_point
bot_controller
bot_generator
bot_hint_engineer_nest
bot_hint_sentrygun
bot_hint_teleporter_exit
bot_npc_archer
bot_npc_decoy
bot_proxy
bot_roster
color_correction
color_correction_volume
commentary_auto
cycler_actor
cycler_flex
dispenser_touch_trigger
dynamic_prop
entity_bird
entity_blocker
entity_carrier
entity_medigun_shield
entity_revive_marker
entity_rocket
entity_saucer
entity_sign
entity_spawn_manager
entity_spawn_point
entityflame
env_beam
env_beverage
env_blood
env_bubbles
env_credits
env_debughistory
env_detail_controller
env_dustpuff
env_dusttrail
env_effectscript
env_embers
env_entity_dissolver
env_entity_igniter
env_entity_maker
env_explosion
env_fade
env_fire
env_fire_trail
env_firesensor
env_firesource
env_fog_controller
env_funnel
env_global
env_glow
env_gunfire
env_hudhint
env_laser
env_laserdot
env_lightglow
env_message
env_microphone
env_movieexplosion
env_muzzleflash
env_particle_performance_monitor
env_particle_trail
env_particlefire
env_particlelight
env_particlescript
env_particlesmokegrenade
env_physexplosion
env_physimpact
env_physwire
env_player_surface_trigger
env_projectedtexture
env_quadraticbeam
env_ragdoll_boogie
env_rockettrail
env_rotorshooter
env_screeneffect
env_screenoverlay
env_shake
env_shooter
env_smokestack
env_smoketrail
env_sniperdot
env_soundscape
env_soundscape_proxy
env_soundscape_triggerable
env_spark
env_splash
env_sporeexplosion
env_sporetrail
env_sprite
env_sprite_oriented
env_spritetrail
env_steam
env_steamjet
env_sun
env_texturetoggle
env_tonemap_controller
env_tracer
env_viewpunch
env_wind
env_zoom
event_queue_saveload_proxy
eyeball_boss
filter_activator_class
filter_activator_mass_greater
filter_activator_name
filter_activator_team
filter_activator_tfteam
filter_base
filter_damage_type
filter_enemy
filter_multi
filter_tf_bot_has_tag
filter_tf_class
filter_tf_condition
filter_tf_damaged_by_weapon_in_slot
filter_tf_player_can_cap
fish
func_achievement
func_areaportal
func_areaportalwindow
func_breakable
func_breakable_surf
func_brush
func_button
func_capturezone
func_changeclass
func_clip_vphysics
func_conveyor
func_door
func_door_rotating
func_dustcloud
func_dustmotes
func_fish_pool
func_flag_alert
func_flagdetectionzone
func_forcefield
func_guntarget
func_illusionary
func_ladderendpoint
func_lod
func_monitor
func_movelinear
func_nav_avoid
func_nav_avoidance_obstacle
func_nav_blocker
func_nav_prefer
func_nav_prerequisite
func_nobuild
func_nogrenades
func_occluder
func_passtime_goal
func_passtime_goalie_zone
func_passtime_no_ball_zone
func_physbox
func_physbox_multiplayer
func_plat
func_platrot
func_powerupvolume
func_precipitation
func_proprrespawnzone
func_pushable
func_reflective_glass
func_regenerate
func_respawnflag
func_respawnroom
func_respawnroomvisualizer
func_rot_button
func_rotating
func_smokevolume
func_suggested_build
func_tanktrain
func_tfbot_hint
func_trackautochange
func_trackchange
func_tracktrain
func_train
func_traincontrols
func_upgradestation
func_useableladder
func_vehicleclip
func_wall
func_wall_toggle
func_water
func_water_analog
func_weight_button
funCBaseFlex
game_end
game_forcerespawn
game_gib_manager
game_intro_viewpoint
game_player_equip
game_player_team
game_ragdoll_manager
game_round_win
game_score
game_text
game_text_tf
game_ui
game_weapon_manager
game_zone_player
generic_actor
ghost
gib
gibshooter
grenade
halloween_fortune_teller
halloween_souls_pack
halloween_zapper
hammer_updateignorelist
handle_dummy
handle_test
headless_hatman
hightower_teleport_vortex
info_camera_link
info_constraint_anchor
info_hint
info_intermission
info_ladder_dismount
info_landmark
info_lighting_relative
info_mass_center
info_node
info_node_air
info_node_air_hint
info_node_climb
info_node_hint
info_node_link
info_node_link_controller
info_npc_spawn_destination
info_null
info_observer_point
info_overlay_accessor
info_particle_system
info_passtime_ball_spawn
info_player_deathmatch
info_player_start
info_player_teamspawn
info_populator
info_powerup_spawn
info_projecteddecal
info_radial_link_controller
info_target
info_teleport_destination
infodecal
instanced_scripted_scene
item_ammopack_full
item_ammopack_medium
item_ammopack_small
item_armor
item_bonuspack
item_currencypack_custom
item_currencypack_large
item_currencypack_medium
item_currencypack_small
item_healthammokit
item_healthkit_full
item_healthkit_medium
item_healthkit_small
item_powerup_crit
item_powerup_rune
item_powerup_rune_temp
item_powerup_uber
item_sodacan
item_teamflag
item_teamflag_return_icon
keyframe_rope
keyframe_track
light
light_dynamic
light_environment
light_glspot
light_spot
logic_active_autosave
logic_auto
logic_autosave
logic_branch
logic_branch_listener
logic_case
logic_choreographed_scene
logic_collision_pair
logic_compare
logic_lineto
logic_measure_movement
logic_multicompare
logic_navigation
logic_proximity
logic_relay
logic_scene_list_manager
logic_timer
mapobj_cart_dispenser
material_modify_control
math_colorblend
math_counter
math_remap
merasmus
merasmus_dancer
momentary_door
momentary_rot_button
monster_furniture
monster_generic
monster_resource
move_keyframed
move_rope
multisource
npc_concussiongrenade
npc_contactgrenade
npc_furniture
npc_handgrenade
npc_maker
npc_template_maker
npc_vehicledriver
obj_attachment_sapper
obj_dispenser
obj_sentrygun
obj_teleporter
passtime_ball
passtime_logic
path_corner
path_corner_crash
path_track
pd_dispenser
phys_ballsocket
phys_bone_follower
phys_constraint
phys_constraintsystem
phys_convert
phys_hinge
phys_keepupright
phys_lengthconstraint
phys_magnet
phys_motor
phys_pulleyconstraint
phys_ragdollconstraint
phys_ragdollmagnet
phys_slideconstraint
phys_spring
phys_thruster
phys_torque
physics_cannister
physics_entity_solver
physics_npc_solver
physics_prop
physics_prop_ragdoll
player
player_loadsaved
player_manager
player_speedmod
player_weaponstrip
point_anglesensor
point_angularvelocitysensor
point_bonusmaps_accessor
point_camera
point_clientcommand
point_commentary_node
point_commentary_viewpoint
point_devshot_camera
point_enable_motion_fixup
point_gamestats_counter
point_hurt
point_intermission
point_message
point_playermoveconstraint
point_populator_interface
point_posecontroller
point_proximity_sensor
point_push
point_servercommand
point_spotlight
point_teleport
point_template
point_tesla
point_velocitysensor
point_viewcontrol
populator_internal_spawn_point
prop_door_rotating
prop_dynamic
prop_dynamic_ornament
prop_dynamic_override
prop_physics
prop_physics_multiplayer
prop_physics_override
prop_physics_respawnable
prop_ragdoll
prop_ragdoll_attached
prop_soccer_ball
prop_sphere
prop_vehicle
prop_vehicle_driveable
raggib
rd_robot_dispenser
rope_anchor
scene_manager
scripted_scene
scripted_sentence
scripted_sequence
scripted_target
shadow_control
simple_bot
simple_physics_brush
simple_physics_prop
sky_camera
soundent
spark_shower
spotlight_end
spraycan
tank_boss
tank_destruction
tanktrain_ai
tanktrain_aitarget
target_cdaudio
target_changegravity
te_tester
team_control_point
team_control_point_master
team_control_point_round
team_manager
team_round_timer
team_train_watcher
teleport_vortex
test_effect
test_proxytoggle
test_traceline
tf_ammo_pack
tf_base_minigame
tf_bonus_duck_pickup
tf_bot
tf_dropped_weapon
tf_flame
tf_gamerules
tf_generic_bomb
tf_glow
tf_halloween_gift_pickup
tf_halloween_gift_spawn_location
tf_halloween_minigame
tf_halloween_minigame_falling_platforms
tf_halloween_pickup
tf_logic_arena
tf_logic_bonusround
tf_logic_competitive
tf_logic_cp_timer
tf_logic_holiday
tf_logic_hybrid_ctf_cp
tf_logic_koth
tf_logic_mann_vs_machine
tf_logic_mannpower
tf_logic_medieval
tf_logic_minigames
tf_logic_multiple_escort
tf_logic_on_holiday
tf_logic_player_destruction
tf_logic_robot_destruction
tf_logic_training_mode
tf_mann_vs_machine_stats
tf_merasmus_trick_or_treat_prop
tf_objective_resource
tf_pda_expansion_dispenser
tf_pda_expansion_teleporter
tf_player_manager
tf_point_nav_interface
tf_point_weapon_mimic
tf_powerup_bottle
tf_projectile_arrow
tf_projectile_ball_ornament
tf_projectile_cleaver
tf_projectile_energy_ball
tf_projectile_energy_ring
tf_projectile_flare
tf_projectile_grapplinghook
tf_projectile_healing_bolt
tf_projectile_jar
tf_projectile_jar_milk
tf_projectile_lightningorb
tf_projectile_pipe
tf_projectile_pipe_remote
tf_projectile_rocket
tf_projectile_sentryrocket
tf_projectile_spellbats
tf_projectile_spellfireball
tf_projectile_spellkartbats
tf_projectile_spellkartorb
tf_projectile_spellmeteorshower
tf_projectile_spellmirv
tf_projectile_spellpumpkin
tf_projectile_spellspawnboss
tf_projectile_spellspawnhorde
tf_projectile_spellspawnzombie
tf_projectile_spelltransposeteleport
tf_projectile_stun_ball
tf_projectile_syringe
tf_projectile_throwable
tf_projectile_throwable_breadmonster
tf_projectile_throwable_brick
tf_projectile_throwable_repel
tf_pumpkin_bomb
tf_ragdoll
tf_robot_destruction_robot
tf_robot_destruction_robot_spawn
tf_robot_destruction_spawn_group
tf_spawner
tf_spell_meteorshowerspawner
tf_spell_pickup
tf_target_dummy
tf_taunt_prop
tf_team
tf_teleport_location
tf_viewmodel
tf_weapon_base
tf_weapon_bat
tf_weapon_bat_fish
tf_weapon_bat_giftwrap
tf_weapon_bat_wood
tf_weapon_bonesaw
tf_weapon_bottle
tf_weapon_buff_item
tf_weapon_builder
tf_weapon_cannon
tf_weapon_charged_smg
tf_weapon_cleaver
tf_weapon_club
tf_weapon_compound_bow
tf_weapon_crossbow
tf_weapon_drg_pomson
tf_weapon_fireaxe
tf_weapon_fists
tf_weapon_flamethrower
tf_weapon_flaregun
tf_weapon_flaregun_revenge
tf_weapon_grapplinghook
tf_weapon_grenadelauncher
tf_weapon_handgun_scout_primary
tf_weapon_handgun_scout_secondary
tf_weapon_invis
tf_weapon_jar
tf_weapon_jar_milk
tf_weapon_katana
tf_weapon_knife
tf_weapon_laser_pointer
tf_weapon_lunchbox
tf_weapon_lunchbox_drink
tf_weapon_mechanical_arm
tf_weapon_medigun
tf_weapon_minigun
tf_weapon_parachute
tf_weapon_parachute_primary
tf_weapon_parachute_secondary
tf_weapon_particle_cannon
tf_weapon_passtime_gun
tf_weapon_pda_engineer_build
tf_weapon_pda_engineer_destroy
tf_weapon_pda_spy
tf_weapon_pep_brawler_blaster
tf_weapon_pipebomblauncher
tf_weapon_pistol
tf_weapon_pistol_scout
tf_weapon_raygun
tf_weapon_revolver
tf_weapon_robot_arm
tf_weapon_rocketlauncher
tf_weapon_rocketlauncher_airstrike
tf_weapon_rocketlauncher_directhit
tf_weapon_sapper
tf_weapon_scattergun
tf_weapon_sentry_revenge
tf_weapon_shotgun_building_rescue
tf_weapon_shotgun_hwg
tf_weapon_shotgun_primary
tf_weapon_shotgun_pyro
tf_weapon_shotgun_soldier
tf_weapon_shovel
tf_weapon_smg
tf_weapon_sniperrifle
tf_weapon_sniperrifle_classic
tf_weapon_sniperrifle_decap
tf_weapon_soda_popper
tf_weapon_spellbook
tf_weapon_stickbomb
tf_weapon_sword
tf_weapon_syringegun_medic
tf_weapon_wrench
tf_weaponbase_grenade_proj
tf_weaponbase_melee
tf_weaponbase_merasmus_grenade
tf_wearable
tf_wearable_demoshield
tf_wearable_levelable_item
tf_wearable_robot_arm
tf_wearable_vm
tf_zombie
tf_zombie_spawner
training_annotation
training_prop_dynamic
trigger
trigger_add_or_remove_tf_player_attributes
trigger_add_tf_player_condition
trigger_apply_impulse
trigger_autosave
trigger_bot_tag
trigger_brush
trigger_capture_area
trigger_catapult
trigger_cdaudio
trigger_changelevel
trigger_gravity
trigger_hurt
trigger_ignite
trigger_ignite_arrows
trigger_impact
trigger_look
trigger_multiple
trigger_once
trigger_particle
trigger_passtime_ball
trigger_player_respawn_override
trigger_playermovement
trigger_proximity
trigger_push
trigger_rd_vault_trigger
trigger_remove
trigger_remove_tf_player_condition
trigger_serverragdoll
trigger_soundscape
trigger_stun
trigger_teleport
trigger_teleport_relative
trigger_timer_door
trigger_togglesave
trigger_transition
trigger_vphysics_motion
trigger_wind
vgui_screen
vgui_screen_team
vgui_slideshow_display
viewmodel
vote_controller
water_lod_control
waterbullet
weapon_ifm_base
weapon_ifm_base_camera
weapon_ifm_steadycam
wearable_item
wheel_of_doom
wheel_of_doom_spiral
window_pane
world_items
worldspawn

Notice how only 3 entity class names are prefixed with weapon_, but a lot are prefixed with tf_weapon_. Also, none of the 3 are actual weapons. So, tf_weapon_ is what you would want to use for the prefix.

To get the ammoprop and myweapons values in the [properties] section, you will need to look through the ServerClass output. To get that list, you can use the following on your server:

Code: Select all

sp dump server_classes tf_server_classes

Now, a file called tf_server_classes.txt will be created in your server's ../logs/source-python/ directory. I also already have these on my Pastebin, but they might not be 100% up-to-date:


m_iAmmo can be found under CBasePlayer->localdata->m_iAmmo, so what you have currently is correct (we don't include the ServerClass name itself).

m_hMyWeapons can be found under CBaseCombatCharacter->m_hMyWeapons, so once again, what you have is correct.

For [projectiles], the keys (spellbook_projectile, grenade_jar, and grenade_jar_milk) must be the entity class name of the projectile. None of the 3 you have listed are entities listed in dumpentityfactories. To find these out, you will need to do some testing:

Syntax: Select all

from entities import TakeDamageInfo
from entities.entity import Entity
from entities.hooks import EntityCondition, EntityPreHook
from memory import make_object


@EntityPreHook(EntityCondition.is_player, 'on_take_damage')
def _pre_take_damage(stack_data):
victim = make_object(Entity, stack_data[0])
if not victim.is_player():
return

info = make_object(TakeDamageInfo, stack_data[1])
weapon_index = info.weapon
try:
weapon = Entity(weapon_index).classname
except AttributeError:
return
print('Take Damage:', weapon)

Use that code and try to damage players using each of the projectile weapons. I also notice that there are a lot of tf_projectile_ prefixed entity class names, so those are likely the ones you want to use. But, just to make sure, you should do some testing.

The value for each of those (spellbook, jar, jar_milk) should be the entity class name minus the tf_weapon_ prefix, so all of those 3 seem correct.

To get the ammoprop and item_definition_index for each weapon, you will also need to do a bit of testing. Currently, the following will not work, so please wait until build 557 is available:

Syntax: Select all

from entities.hooks import EntityCondition, EntityPreHook
from memory import make_object
from weapons.entity import Weapon


@EntityPreHook(EntityCondition.is_player, 'bump_weapon')
def _pre_take_damage(stack_data):
weapon = make_object(Weapon, stack_data[1])
try:
ammoprop = weapon.ammoprop
except UnicodeDecodeError:
ammoprop = None
print(weapon.classname, ammoprop, weapon.item_definition_index)


Hopefully this helps get you most of the way there.
Image
123marble
Junior Member
Posts: 6
Joined: Fri Mar 03, 2017 5:46 pm

Re: [TF2] Retrieving the amount of ammo in a gun

Postby 123marble » Sun Mar 12, 2017 12:19 pm

Everything you posted seems to be working except for the projectile code.

Syntax: Select all

from entities import TakeDamageInfo
from entities.entity import Entity
from entities.hooks import EntityCondition, EntityPreHook
from memory import make_object

@EntityPreHook(EntityCondition.is_player, 'on_take_damage')
def _pre_take_damage(stack_data):
victim = make_object(Entity, stack_data[0])
if not victim.is_player():
return

info = make_object(TakeDamageInfo, stack_data[1])
weapon_index = info.weapon
try:
weapon = Entity(weapon_index).classname
except AttributeError:
return
print('Take Damage:', weapon)

I set up a bot and gave him resistance to all damage (but even with resistance off I get the same output). When shooting him with a pojectile weapon the output I get is the weapon classname. e.g. I shot him with the huntsman and returned: 'Take Damage: tf_weapon_compound_bow'. Something to note is that when I used jarate it returned nothing. Hopefully you know the fix to this and this is not too complicated. Should I just assume that the projectile for the huntsman is 'tf_projectile_arrow'?

Return to “Plugin Development Support”

Who is online

Users browsing this forum: No registered users and 16 guests