1
+ #include " effects/OneTimeEffect.h"
2
+ #include " util/GameUtil.h"
3
+
4
+ #include < CPickups.h>
5
+ #include < CStreaming.h>
6
+ #include < CWeaponInfo.h>
7
+ #include < extensions/ScriptCommands.h>
8
+
9
+ using namespace plugin ;
10
+ namespace
11
+ {
12
+ enum eWeaponSlot : unsigned int
13
+ {
14
+ UNARMED,
15
+ MELEE,
16
+ HANDGUN,
17
+ SHOTGUN,
18
+ SMG,
19
+ RIFLE,
20
+ SNIPER,
21
+ HEAVY,
22
+ THROWN,
23
+ SPECIAL,
24
+ GIFT,
25
+ PARACHUTE,
26
+ DETONATOR,
27
+ };
28
+ } // namespace
29
+
30
+ class GivePlayerAWeapon : public OneTimeEffect
31
+ {
32
+ private:
33
+ eWeaponType weaponType = WEAPON_BRASSKNUCKLE;
34
+
35
+ public:
36
+ GivePlayerAWeapon (eWeaponType weapon) : weaponType (weapon) {}
37
+
38
+ bool
39
+ CanActivate () override
40
+ {
41
+ CPlayerPed *player = FindPlayerPed ();
42
+ if (!player) return false ;
43
+
44
+ if (player->m_aWeapons [player->GetWeaponSlot (weaponType)].m_eWeaponType
45
+ == WEAPON_PARACHUTE)
46
+ return false ;
47
+
48
+ return GameUtil::IsPlayerSafe ();
49
+ }
50
+
51
+ void
52
+ OnStart (EffectInstance *inst) override
53
+ {
54
+ CPlayerPed *player = FindPlayerPed ();
55
+ if (!player) return ;
56
+
57
+ auto m = CPickups::ModelForWeapon (weaponType);
58
+ CStreaming::RequestModel (m, 2 );
59
+ CStreaming::LoadAllRequestedModels (false );
60
+
61
+ const auto *info = CWeaponInfo::GetWeaponInfo (weaponType, 1 );
62
+
63
+ if (!info) return ;
64
+
65
+ unsigned int ammo = 0 ;
66
+
67
+ switch (info->m_nSlot )
68
+ {
69
+ case eWeaponSlot::HANDGUN: ammo = 50 ; break ;
70
+ case eWeaponSlot::SHOTGUN: ammo = 35 ; break ;
71
+ case eWeaponSlot::SMG: ammo = 100 ; break ;
72
+ case eWeaponSlot::RIFLE: ammo = 50 ; break ;
73
+ case eWeaponSlot::SNIPER: ammo = 20 ; break ;
74
+ case eWeaponSlot::HEAVY: ammo = 10 ; break ;
75
+ case eWeaponSlot::THROWN: ammo = 10 ; break ;
76
+ case eWeaponSlot::SPECIAL: ammo = 500 ; break ;
77
+ default : break ;
78
+ }
79
+
80
+ if (weaponType == WEAPON_MINIGUN)
81
+ {
82
+ ammo = 250 ;
83
+ }
84
+
85
+ Command<eScriptCommands::COMMAND_GIVE_WEAPON_TO_CHAR> (player,
86
+ weaponType,
87
+ ammo);
88
+
89
+ CStreaming::SetModelIsDeletable (m);
90
+ }
91
+ };
92
+
93
+ // clang-format off
94
+ DEFINE_EFFECT (GivePlayerAWeapon, " effect_give_ak47" , GROUP_WEAPONS, WEAPON_AK47);
95
+ DEFINE_EFFECT (GivePlayerAWeapon, " effect_give_uzi" , GROUP_WEAPONS, WEAPON_MICRO_UZI);
96
+ DEFINE_EFFECT (GivePlayerAWeapon, " effect_give_sniper" , GROUP_WEAPONS, WEAPON_SNIPERRIFLE);
97
+ DEFINE_EFFECT (GivePlayerAWeapon, " effect_give_shotgun" , GROUP_WEAPONS, WEAPON_SPAS12);
98
+ DEFINE_EFFECT (GivePlayerAWeapon, " effect_give_rocket_launcher" , GROUP_WEAPONS, WEAPON_RLAUNCHER_HS);
99
+ DEFINE_EFFECT (GivePlayerAWeapon, " effect_give_pistol" , GROUP_WEAPONS, WEAPON_PISTOL_SILENCED);
100
+ DEFINE_EFFECT (GivePlayerAWeapon, " effect_give_minigun" , GROUP_WEAPONS, WEAPON_MINIGUN);
101
+ DEFINE_EFFECT (GivePlayerAWeapon, " effect_weapon_set_4" , GROUP_WEAPONS, WEAPON_MINIGUN);
102
+ DEFINE_EFFECT (GivePlayerAWeapon, " effect_give_grenades" , GROUP_WEAPONS, WEAPON_GRENADE);
103
+ DEFINE_EFFECT (GivePlayerAWeapon, " effect_give_chainsaw" , GROUP_WEAPONS, WEAPON_CHAINSAW);
104
+ DEFINE_EFFECT (GivePlayerAWeapon, " effect_get_parachute" , GROUP_WEAPONS, WEAPON_PARACHUTE);
105
+ // clang-format on
0 commit comments