mirror of
https://github.com/roflmuffin/CounterStrikeSharp.git
synced 2025-12-07 16:36:35 -08:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8d1891a3a8 | ||
|
|
6bc43444f7 | ||
|
|
f0c7869f4a | ||
|
|
3e38ed3c77 |
@@ -139,6 +139,20 @@
|
||||
"linux": "\\x55\\x48\\x89\\xE5\\x41\\x57\\x41\\x56\\x41\\x55\\x41\\x54\\x49\\x89\\xFC\\x53\\x48\\x83\\xEC\\x38\\x4C\\x8D\\x2D\\x2A\\x2A\\x2A\\x2A\\x49\\x8B\\x7D\\x00\\x48\\x85\\xFF\\x0F\\x84\\x2A\\x2A\\x2A\\x2A"
|
||||
}
|
||||
},
|
||||
"CBaseTrigger_StartTouch": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "\\x41\\x56\\x41\\x57\\x48\\x83\\xEC\\x58\\x48\\x8B\\x01",
|
||||
"linux": "\\x55\\x48\\x89\\xE5\\x41\\x56\\x49\\x89\\xF6\\x41\\x55\\x49\\x89\\xFD\\x41\\x54\\x53\\xBB"
|
||||
}
|
||||
},
|
||||
"CBaseTrigger_EndTouch": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "\\x40\\x53\\x57\\x41\\x55\\x48\\x83\\xEC\\x40",
|
||||
"linux": "\\x55\\xBA\\xFF\\xFF\\xFF\\xFF\\x48\\x89\\xE5\\x41\\x57\\x41\\x56\\x41\\x55\\x49"
|
||||
}
|
||||
},
|
||||
"GameEntitySystem": {
|
||||
"offsets": {
|
||||
"windows": 88,
|
||||
|
||||
@@ -17,8 +17,13 @@ The first parameter type must be a subclass of the `GameEvent` class. The names
|
||||
[GameEventHandler]
|
||||
public HookResult OnPlayerConnect(EventPlayerConnect @event, GameEventInfo info)
|
||||
{
|
||||
// Userid will give you a reference to a CCSPlayerController class
|
||||
// Userid will give you a reference to a CCSPlayerController class.
|
||||
// Before accessing any of its fields, you must first check if the Userid
|
||||
// handle is actually valid, otherwise you may run into runtime exceptions.
|
||||
// See the documentation section on Referencing Players for details.
|
||||
if (@event.Userid.IsValid) {
|
||||
Logger.LogInformation("Player {Name} has connected!", @event.Userid.PlayerName);
|
||||
}
|
||||
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
|
||||
@@ -24,6 +25,17 @@ public partial class CCSPlayerController
|
||||
return VirtualFunctions.GiveNamedItem(PlayerPawn.Value.ItemServices.Handle, item, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
public IntPtr GiveNamedItem(CsItem item)
|
||||
{
|
||||
string? itemString = EnumUtils.GetEnumMemberAttributeValue(item);
|
||||
if (string.IsNullOrWhiteSpace(itemString))
|
||||
{
|
||||
return IntPtr.Zero;
|
||||
}
|
||||
|
||||
return this.GiveNamedItem(itemString);
|
||||
}
|
||||
|
||||
public void PrintToConsole(string message)
|
||||
{
|
||||
NativeAPI.PrintToConsole((int)EntityIndex.Value.Value, $"{message}\n\0");
|
||||
|
||||
@@ -0,0 +1,241 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CounterStrikeSharp.API.Modules.Entities.Constants
|
||||
{
|
||||
public enum CsItem
|
||||
{
|
||||
//-----------------------------------------
|
||||
//EQUIPMENT
|
||||
//-----------------------------------------
|
||||
[EnumMember(Value = "item_kevlar")]
|
||||
Kevlar = 000,
|
||||
|
||||
[EnumMember(Value = "item_assaultsuit")]
|
||||
AssaultSuit = 001,
|
||||
KevlarHelmet = AssaultSuit,
|
||||
|
||||
[EnumMember(Value = "weapon_taser")]
|
||||
Taser = 002,
|
||||
Zeus = Taser,
|
||||
|
||||
[EnumMember(Value = "weapon_snowball")]
|
||||
Snowball = 003,
|
||||
|
||||
[EnumMember(Value = "weapon_shield")]
|
||||
Shield = 004,
|
||||
|
||||
[EnumMember(Value = "weapon_c4")]
|
||||
C4 = 005,
|
||||
Bomb = C4,
|
||||
|
||||
[EnumMember(Value = "weapon_healthshot")]
|
||||
Healthshot = 006,
|
||||
|
||||
[EnumMember(Value = "weapon_breachcharge")]
|
||||
BreachCharge = 007,
|
||||
|
||||
[EnumMember(Value = "weapon_tablet")]
|
||||
Tablet = 008,
|
||||
|
||||
[EnumMember(Value = "weapon_bumpmine")]
|
||||
Bumpmine = 009,
|
||||
|
||||
//-----------------------------------------
|
||||
//GRENADES
|
||||
//-----------------------------------------
|
||||
[EnumMember(Value = "weapon_smokegrenade")]
|
||||
Smoke = 100,
|
||||
SmokeGrenade = Smoke,
|
||||
|
||||
[EnumMember(Value = "weapon_flashbang")]
|
||||
Flashbang = 101,
|
||||
FlashbangGrenade = Flashbang,
|
||||
|
||||
[EnumMember(Value = "weapon_hegrenade")]
|
||||
HighExplosive = 102,
|
||||
HE = HighExplosive,
|
||||
HighExplosiveGrenade = HighExplosive,
|
||||
HEGrenade = HighExplosive,
|
||||
|
||||
[EnumMember(Value = "weapon_molotov")]
|
||||
Molotov = 103,
|
||||
|
||||
[EnumMember(Value = "weapon_incgrenade")]
|
||||
Incendiary = 104,
|
||||
IncGrenade = Incendiary,
|
||||
IncendiaryGrenade = Incendiary,
|
||||
|
||||
[EnumMember(Value = "weapon_decoy")]
|
||||
Decoy = 105,
|
||||
DecoyGrenade = Decoy,
|
||||
|
||||
//XRay-Grenade
|
||||
[EnumMember(Value = "weapon_tagrenade")]
|
||||
TacticalAwareness = 106,
|
||||
TAGrenade = TacticalAwareness,
|
||||
XRayGrenade = TacticalAwareness,
|
||||
|
||||
//Dangerzone: Better HighExplosive
|
||||
[EnumMember(Value = "weapon_frag")]
|
||||
Frag = 107,
|
||||
FragGrenade = Frag,
|
||||
|
||||
//Dangerzone: Better Molotov
|
||||
[EnumMember(Value = "weapon_firebomb")]
|
||||
Firebomb = 108,
|
||||
|
||||
//Dangerzone: Decoy but Footsteps instead of gun sounds
|
||||
[EnumMember(Value = "weapon_diversion")]
|
||||
Diversion = 109,
|
||||
|
||||
//-----------------------------------------
|
||||
//PISTOLS
|
||||
//-----------------------------------------
|
||||
[EnumMember(Value = "weapon_deagle")]
|
||||
Deagle = 200,
|
||||
DesertEagle = Deagle,
|
||||
|
||||
[EnumMember(Value = "weapon_glock")]
|
||||
Glock = 201,
|
||||
Glock18 = Glock,
|
||||
|
||||
[EnumMember(Value = "weapon_usp_silencer")]
|
||||
USPS = 202,
|
||||
USP = USPS,
|
||||
|
||||
[EnumMember(Value = "weapon_hkp2000")]
|
||||
HKP2000 = 203,
|
||||
P2000 = HKP2000,
|
||||
P2K = HKP2000,
|
||||
|
||||
[EnumMember(Value = "weapon_elite")]
|
||||
Elite = 204,
|
||||
DualBerettas = Elite,
|
||||
Dualies = Elite,
|
||||
|
||||
[EnumMember(Value = "weapon_tec9")]
|
||||
Tec9 = 205,
|
||||
|
||||
[EnumMember(Value = "weapon_p250")]
|
||||
P250 = 206,
|
||||
|
||||
[EnumMember(Value = "weapon_cz75a")]
|
||||
CZ = 207,
|
||||
CZ75 = CZ,
|
||||
|
||||
[EnumMember(Value = "weapon_fiveseven")]
|
||||
FiveSeven = 208,
|
||||
|
||||
[EnumMember(Value = "weapon_revolver")]
|
||||
Revolver = 209,
|
||||
R8 = Revolver,
|
||||
|
||||
//-----------------------------------------
|
||||
//MID-TIER
|
||||
//-----------------------------------------
|
||||
[EnumMember(Value = "weapon_mac10")]
|
||||
Mac10 = 300,
|
||||
|
||||
[EnumMember(Value = "weapon_mp9")]
|
||||
MP9 = 301,
|
||||
|
||||
[EnumMember(Value = "weapon_mp7")]
|
||||
MP7 = 302,
|
||||
|
||||
[EnumMember(Value = "weapon_p90")]
|
||||
P90 = 303,
|
||||
|
||||
[EnumMember(Value = "weapon_mp5sd")]
|
||||
MP5SD = 304,
|
||||
MP5 = MP5SD,
|
||||
|
||||
[EnumMember(Value = "weapon_bizon")]
|
||||
Bizon = 305,
|
||||
PPBizon = Bizon,
|
||||
|
||||
[EnumMember(Value = "weapon_ump45")]
|
||||
UMP45 = 306,
|
||||
UMP = UMP45,
|
||||
|
||||
[EnumMember(Value = "weapon_xm1014")]
|
||||
XM1014 = 307,
|
||||
|
||||
[EnumMember(Value = "weapon_nova")]
|
||||
Nova = 308,
|
||||
|
||||
[EnumMember(Value = "weapon_mag7")]
|
||||
MAG7 = 309,
|
||||
|
||||
[EnumMember(Value = "weapon_sawedoff")]
|
||||
SawedOff = 310,
|
||||
|
||||
[EnumMember(Value = "weapon_m249")]
|
||||
M249 = 311,
|
||||
|
||||
[EnumMember(Value = "weapon_negev")]
|
||||
Negev = 312,
|
||||
|
||||
//-----------------------------------------
|
||||
//RIFLES
|
||||
//-----------------------------------------
|
||||
[EnumMember(Value = "weapon_ak47")]
|
||||
AK47 = 400,
|
||||
|
||||
[EnumMember(Value = "weapon_m4a1_silencer")]
|
||||
M4A1S = 401,
|
||||
SilencedM4 = M4A1S,
|
||||
|
||||
[EnumMember(Value = "weapon_m4a1")]
|
||||
M4A1 = 402,
|
||||
M4A4 = M4A1,
|
||||
|
||||
[EnumMember(Value = "weapon_galilar")]
|
||||
GalilAR = 403,
|
||||
Galil = GalilAR,
|
||||
|
||||
[EnumMember(Value = "weapon_famas")]
|
||||
Famas = 404,
|
||||
|
||||
[EnumMember(Value = "weapon_sg556")]
|
||||
SG556 = 405,
|
||||
SG553 = SG556,
|
||||
Krieg = SG556,
|
||||
|
||||
[EnumMember(Value = "weapon_awp")]
|
||||
AWP = 406,
|
||||
|
||||
[EnumMember(Value = "weapon_aug")]
|
||||
AUG = 407,
|
||||
|
||||
[EnumMember(Value = "weapon_ssg08")]
|
||||
SSG08 = 408,
|
||||
Scout = SSG08,
|
||||
|
||||
[EnumMember(Value = "weapon_scar20")]
|
||||
SCAR20 = 409,
|
||||
AutoSniperCT = SCAR20,
|
||||
|
||||
[EnumMember(Value = "weapon_g3sg1")]
|
||||
G3SG1 = 410,
|
||||
AutoSniperT = G3SG1,
|
||||
|
||||
//-----------------------------------------
|
||||
//KNIFE
|
||||
//-----------------------------------------
|
||||
[EnumMember(Value = "weapon_knife_t")]
|
||||
DefaultKnifeT = 500,
|
||||
KnifeT = DefaultKnifeT,
|
||||
|
||||
[EnumMember(Value = "weapon_knife")]
|
||||
DefaultKnifeCT = 501,
|
||||
KnifeCT = DefaultKnifeCT,
|
||||
Knife = DefaultKnifeCT,
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -70,4 +70,10 @@ public static class VirtualFunctions
|
||||
|
||||
public static MemoryFunctionVoid<CCSPlayerPawnBase> CCSPlayerPawnBase_PostThinkFunc = new (GameData.GetSignature("CCSPlayerPawnBase_PostThink"));
|
||||
public static Action<CCSPlayerPawnBase> CCSPlayerPawnBase_PostThink = CCSPlayerPawnBase_PostThinkFunc.Invoke;
|
||||
|
||||
public static MemoryFunctionVoid<CBaseTrigger, CBaseEntity> CBaseTrigger_StartTouchFunc = new (GameData.GetSignature("CBaseTrigger_StartTouch"));
|
||||
public static Action<CBaseTrigger, CBaseEntity> CBaseTrigger_StartTouch = CBaseTrigger_StartTouchFunc.Invoke;
|
||||
|
||||
public static MemoryFunctionVoid<CBaseTrigger, CBaseEntity> CBaseTrigger_EndTouchFunc = new (GameData.GetSignature("CBaseTrigger_EndTouch"));
|
||||
public static Action<CBaseTrigger, CBaseEntity> CBaseTrigger_EndTouch = CBaseTrigger_EndTouchFunc.Invoke;
|
||||
}
|
||||
36
managed/CounterStrikeSharp.API/Modules/Utils/EnumUtils.cs
Normal file
36
managed/CounterStrikeSharp.API/Modules/Utils/EnumUtils.cs
Normal file
@@ -0,0 +1,36 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
|
||||
namespace CounterStrikeSharp.API.Modules.Utils
|
||||
{
|
||||
public static class EnumUtils
|
||||
{
|
||||
public static string? GetEnumMemberAttributeValue<T>(T enumValue)
|
||||
{
|
||||
var enumType = typeof(T);
|
||||
|
||||
if(!enumType.IsEnum || enumValue == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var enumString = enumValue.ToString();
|
||||
|
||||
if(string.IsNullOrWhiteSpace(enumString))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var memberInfo = enumType.GetMember(enumString);
|
||||
var enumMemberAttribute = memberInfo.FirstOrDefault()?.GetCustomAttributes(false).OfType<EnumMemberAttribute>().FirstOrDefault();
|
||||
if (enumMemberAttribute != null)
|
||||
{
|
||||
return enumMemberAttribute.Value;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -26,6 +26,7 @@ using CounterStrikeSharp.API.Core.Attributes.Registration;
|
||||
using CounterStrikeSharp.API.Modules.Commands;
|
||||
using CounterStrikeSharp.API.Modules.Cvars;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
||||
using CounterStrikeSharp.API.Modules.Events;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Menu;
|
||||
@@ -104,6 +105,26 @@ namespace TestPlugin
|
||||
var result = virtualFunc() - 8;
|
||||
Logger.LogInformation("Result of virtual func call is {Pointer:X}", result);
|
||||
|
||||
VirtualFunctions.CBaseTrigger_StartTouchFunc.Hook(h =>
|
||||
{
|
||||
var trigger = h.GetParam<CBaseTrigger>(0);
|
||||
var entity = h.GetParam<CBaseEntity>(1);
|
||||
|
||||
Logger.LogInformation("Trigger {Trigger} touched by {Entity}", trigger.DesignerName, entity.DesignerName);
|
||||
|
||||
return HookResult.Continue;
|
||||
}, HookMode.Post);
|
||||
|
||||
VirtualFunctions.CBaseTrigger_EndTouchFunc.Hook(h =>
|
||||
{
|
||||
var trigger = h.GetParam<CBaseTrigger>(0);
|
||||
var entity = h.GetParam<CBaseEntity>(1);
|
||||
|
||||
Logger.LogInformation("Trigger left {Trigger} by {Entity}", trigger.DesignerName, entity.DesignerName);
|
||||
|
||||
return HookResult.Continue;
|
||||
}, HookMode.Post);
|
||||
|
||||
VirtualFunctions.UTIL_RemoveFunc.Hook(hook =>
|
||||
{
|
||||
var entityInstance = hook.GetParam<CEntityInstance>(0);
|
||||
@@ -448,6 +469,30 @@ namespace TestPlugin
|
||||
player.GiveNamedItem(command.ArgByIndex(1));
|
||||
}
|
||||
|
||||
[ConsoleCommand("css_giveenum", "giveenum")]
|
||||
public void OnCommandGiveEnum(CCSPlayerController? player, CommandInfo command)
|
||||
{
|
||||
if (player == null) return;
|
||||
if (!player.IsValid) return;
|
||||
|
||||
player.GiveNamedItem(CsItem.M4A1);
|
||||
player.GiveNamedItem(CsItem.HEGrenade);
|
||||
player.GiveNamedItem(CsItem.Kevlar);
|
||||
player.GiveNamedItem(CsItem.Tec9);
|
||||
}
|
||||
|
||||
[ConsoleCommand("css_give", "give")]
|
||||
public void OnCommandGiveItems(CCSPlayerController? player, CommandInfo command)
|
||||
{
|
||||
if (player == null) return;
|
||||
if (!player.IsValid) return;
|
||||
|
||||
player.GiveNamedItem("weapon_m4a1");
|
||||
player.GiveNamedItem("weapon_hegrenade");
|
||||
player.GiveNamedItem("item_kevlar");
|
||||
player.GiveNamedItem("weapon_tec9");
|
||||
}
|
||||
|
||||
private HookResult GenericEventHandler<T>(T @event, GameEventInfo info) where T : GameEvent
|
||||
{
|
||||
Logger.LogInformation("Event found {Pointer:X}, event name: {EventName}, dont broadcast: {DontBroadcast}",
|
||||
|
||||
Reference in New Issue
Block a user