This is a message change that affects the underlying weapons system. This WILL break your games. However I have tried my best to document everything that I've changed here - you can also find a script that attempts to perform most updates manually. However it cannot account for when you stray away from normal conventions and standards. The big change is that the weapon code no longer assumes 'self' to be the player. Functions from the weapon code can now be called in relation to different player entities. This is what is required for spectating others and being able to see what they're doing. This is one of those situations where this could have been prevented had I designed the system with all the fancy spectating stuff in mind... I'm sorry this all turned into an inconvenience. It's not quite a refactor though. If you've mainly kept to yourself and didn't 'fork' any files or functions then you usually just have to pass an extra parameter to make any errors/warnings disappear. General changes of note: 1. the weapon_t field .crosshair is now named .postdraw. 2. the following weapon_t fields have 'player pl' as their first parameter: .hudpic .aimanim .release .reload .secondary .primary .holster .draw .pickup .pmodel 3. Weapons_ViewAnimation(int) now specifies 'player' in the first parameter, becoming Weapons_ViewAnimation(player, int) 4. Weapons_ViewPunchAngle(vector) now specifies 'player' in the first parameter, becoming Weapons_ViewPunchAngle(player, vector) 5. Weapons_MakeVectors() now takes 'player' in the first parameter, becoming Weapons_MakeVectors(player). 5. Weapons_GetCameraPos() now takes 'player' in the first parameter, becoming Weapons_GetCameraPos(player). 6. Game_Input(void) becomes Game_Input(player); make sure that you don't make use 'self' as a substitute for the player. 7. Make sure any references of 'self' inside the weapons sources is limited and changed to 'pl' where applicable. E.g. rockets and nail touch/think functions will still use self. 8. View_UpdateWeapon(entity, entity) now will get passed player as its first parameter as well - making it View_UpdateWeapon(player, entity, entity) 9. Weapons_GetPlayermodel(int) becomes as expected the following: Weapons_GetPlayermodel(player, int) A bash script that will handle most conversion is below: #!/bin/bash find ./ -name 'w_*.qc' | while read MFILE_N; do sed -i 's/_pickup(int/_pickup(player pl, int/g' "$MFILE_N" sed -i 's/_hudpic(int/_hudpic(player pl, int/g' "$MFILE_N" sed -i 's/_hud(void/_hud(player pl/g' "$MFILE_N" sed -i 's/_crosshair(void/_crosshair(player pl/g' "$MFILE_N" sed -i 's/_aimanim(void/_aimanim(player pl/g' "$MFILE_N" sed -i 's/_draw(void/_draw(player pl/g' "$MFILE_N" sed -i 's/_holster(void/_holster(player pl/g' "$MFILE_N" sed -i 's/_primary(void/_primary(player pl/g' "$MFILE_N" sed -i 's/_secondary(void/_secondary(player pl/g' "$MFILE_N" sed -i 's/_reload(void/_reload(player pl/g' "$MFILE_N" sed -i 's/_release(void/_release(player pl/g' "$MFILE_N" sed -i 's/_type(void/_type(player pl/g' "$MFILE_N" sed -i 's/_isempty(void/_isempty(player pl/g' "$MFILE_N" sed -i 's/_pmodel(void/_pmodel(player pl/g' "$MFILE_N" sed -i 's/_pickup(new/_pickup(pl, new/g' "$MFILE_N" sed -i 's/_hud()/_hud(pl)/g' "$MFILE_N" sed -i 's/_draw()/_draw(pl)/g' "$MFILE_N" sed -i 's/_holster()/_holster(pl)/g' "$MFILE_N" sed -i 's/_primary()/_primary(pl)/g' "$MFILE_N" sed -i 's/_secondary()/_secondary(pl)/g' "$MFILE_N" sed -i 's/_holster()/_holster(pl)/g' "$MFILE_N" sed -i 's/_pmodel()/_pmodel(pl)/g' "$MFILE_N" sed -i 's/_reload()/_reload(pl)/g' "$MFILE_N" sed -i 's/_release()/_release(pl)/g' "$MFILE_N" sed -i 's/_isempty()/_isempty(pl)/g' "$MFILE_N" sed -i 's/_aimanim()/_aimanim(pl)/g' "$MFILE_N" sed -i 's/_type()/_type(pl)/g' "$MFILE_N" sed -i 's/Weapons_GetAnimation(/Weapons_GetAnimation(pl/g' "$MFILE_N" sed -i 's/Weapons_ViewAnimation(/Weapons_ViewAnimation(pl, /g' "$MFILE_N" sed -i 's/Weapons_ViewPunchAngle(/Weapons_ViewPunchAngle(pl, /g' "$MFILE_N" sed -i 's/Weapons_MakeVectors(/Weapons_MakeVectors(pl/g' "$MFILE_N" sed -i 's/Weapons_GetCameraPos(/Weapons_GetCameraPos(pl/g' "$MFILE_N" sed -i 's/Weapons_Reload(/Weapons_Reload(pl/g' "$MFILE_N" sed -i 's/Weapons_Release(/Weapons_Release(pl/g' "$MFILE_N" sed -i 's/\.crosshair/\.postdraw/g' "$MFILE_N" sed -i '/player pl = (player)self;/d' "$MFILE_N" done find ./ -name 'input.qc' | while read MFILE_N; do sed -i '/player pl = (player)self;/d' "$MFILE_N" sed -i 's/self/pl/g' "$MFILE_N" done find ./ -name '*.qc' | while read MFILE_N; do sed -i 's/Weapons_GetPlayermodel(pl, pl\.activeweapon)/Weapons_GetPlayermodel(pl, pl\.activeweapon)/g' "$MFILE_N" sed -i 's/View_UpdateWeapon(entity/View_UpdateWeapon(player pl, entity/g' "$MFILE_N" sed -i 's/Game_Input(void)/Game_Input(player pl)/g' "$MFILE_N" sed -i 's/Weapons_Primary()/Weapons_Primary(pl)/g' "$MFILE_N" sed -i 's/Weapons_Reload()/Weapons_Reload(pl)/g' "$MFILE_N" sed -i 's/Weapons_Secondary()/Weapons_Secondary(pl)/g' "$MFILE_N" sed -i 's/Weapons_Release()/Weapons_Release(pl)/g' "$MFILE_N" sed -i 's/void Weapons_Draw(void)/void Weapons_Draw(player)/g' "$MFILE_N" sed -i 's/Weapons_Draw(void)/Weapons_Draw(player)/g' "$MFILE_N" sed -i 's/Weapons_Draw(/Weapons_Draw(pl/g' "$MFILE_N" sed -i 's/Weapons_DrawCrosshair(/Weapons_DrawCrosshair(pl/g' "$MFILE_N" sed -i 's/Weapons_HUDPic(/Weapons_HUDPic(pl, /g' "$MFILE_N" sed -i 's/Weapons_GetAim(pl\.activeweapon/Weapons_GetAim(pl, pl\.activeweapon/g' "$MFILE_N" done