mirror of
https://github.com/roflmuffin/CounterStrikeSharp.git
synced 2025-12-07 00:16:36 -08:00
Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0a32962f4a | ||
|
|
271705b377 | ||
|
|
cdcddbb5f3 | ||
|
|
91f51d0c5c | ||
|
|
e97f804294 | ||
|
|
4f805b18e2 | ||
|
|
e1f9b5635e | ||
|
|
59bff4f500 | ||
|
|
a2581d8e91 | ||
|
|
e7d190a6f7 | ||
|
|
5513d5710a | ||
|
|
e5c223699c | ||
|
|
fa37c222d9 | ||
|
|
3b633fafc7 | ||
|
|
765c56a38a | ||
|
|
204850fb55 | ||
|
|
bac31b9190 | ||
|
|
289f95a6b7 | ||
|
|
7b45a884d4 | ||
|
|
6ea6d0a22d |
10
.github/workflows/cmake-single-platform.yml
vendored
10
.github/workflows/cmake-single-platform.yml
vendored
@@ -196,6 +196,7 @@ jobs:
|
|||||||
(cd build/windows && zip -qq -r ../../counterstrikesharp-with-runtime-build-${{ needs.build_managed.outputs.buildnumber }}-windows-${{ env.GITHUB_SHA_SHORT }}.zip *)
|
(cd build/windows && zip -qq -r ../../counterstrikesharp-with-runtime-build-${{ needs.build_managed.outputs.buildnumber }}-windows-${{ env.GITHUB_SHA_SHORT }}.zip *)
|
||||||
|
|
||||||
- name: Release
|
- name: Release
|
||||||
|
id: release
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@v1
|
||||||
with:
|
with:
|
||||||
tag_name: v${{ needs.build_managed.outputs.buildnumber }}
|
tag_name: v${{ needs.build_managed.outputs.buildnumber }}
|
||||||
@@ -208,4 +209,11 @@ jobs:
|
|||||||
- name: Publish NuGet package
|
- name: Publish NuGet package
|
||||||
run: |
|
run: |
|
||||||
dotnet nuget push build/api/CounterStrikeSharp.API.1.0.${{ needs.build_managed.outputs.buildnumber }}.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
|
dotnet nuget push build/api/CounterStrikeSharp.API.1.0.${{ needs.build_managed.outputs.buildnumber }}.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
|
||||||
dotnet nuget push build/api/CounterStrikeSharp.API.1.0.${{ needs.build_managed.outputs.buildnumber }}.snupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
|
dotnet nuget push build/api/CounterStrikeSharp.API.1.0.${{ needs.build_managed.outputs.buildnumber }}.snupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
|
||||||
|
|
||||||
|
- name: Send Notification to Discord
|
||||||
|
env:
|
||||||
|
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
||||||
|
uses: Ilshidur/action-discord@0.3.2
|
||||||
|
with:
|
||||||
|
args: "A new release of CS# has been tagged (v${{ needs.build_managed.outputs.buildnumber }}) at ${{ steps.release.outputs.url }}"
|
||||||
1
CODEOWNERS
Normal file
1
CODEOWNERS
Normal file
@@ -0,0 +1 @@
|
|||||||
|
* @roflmuffin
|
||||||
@@ -74,6 +74,13 @@
|
|||||||
"linux": "\\x55\\x48\\x89\\xF2\\x48\\x89\\xE5\\x41\\x54\\x49\\x89\\xFC\\x48\\x8D\\x2A\\x2A\\x48\\x83\\x2A\\x2A\\x2A\\x8D\\x05\\x2A\\x2A\\x2A\\x00\\x48\\x8B\\x30\\x48\\x8B\\x06\\xFF\\x2A\\x2A\\x48\\x8B\\x45\\x2A\\x48\\x8D\\x2A\\x2A\\x4C\\x89\\x2A\\x48\\x89\\x45\\x2A\\x2A\\x68\\xFC"
|
"linux": "\\x55\\x48\\x89\\xF2\\x48\\x89\\xE5\\x41\\x54\\x49\\x89\\xFC\\x48\\x8D\\x2A\\x2A\\x48\\x83\\x2A\\x2A\\x2A\\x8D\\x05\\x2A\\x2A\\x2A\\x00\\x48\\x8B\\x30\\x48\\x8B\\x06\\xFF\\x2A\\x2A\\x48\\x8B\\x45\\x2A\\x48\\x8D\\x2A\\x2A\\x4C\\x89\\x2A\\x48\\x89\\x45\\x2A\\x2A\\x68\\xFC"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"CCSPlayer_WeaponServices_CanUse": {
|
||||||
|
"signatures": {
|
||||||
|
"library": "server",
|
||||||
|
"windows": "\\x48\\x89\\x5C\\x24\\x10\\x48\\x89\\x6C\\x24\\x18\\x56\\x57\\x41\\x56\\x48\\x83\\xEC\\x30\\x80\\xB9\\xA8\\x00\\x00\\x00\\x00",
|
||||||
|
"linux": "\\x48\\x85\\xF6\\x0F\\x84\\x2A\\x2A\\x2A\\x2A\\x55\\x31\\xC9\\x48\\x89\\xE5\\x41\\x55\\x49\\x89\\xFD"
|
||||||
|
}
|
||||||
|
},
|
||||||
"CCSPlayer_ItemServices_DropActivePlayerWeapon": {
|
"CCSPlayer_ItemServices_DropActivePlayerWeapon": {
|
||||||
"offsets": {
|
"offsets": {
|
||||||
"windows": 18,
|
"windows": 18,
|
||||||
@@ -82,7 +89,7 @@
|
|||||||
},
|
},
|
||||||
"CCSPlayer_ItemServices_RemoveWeapons": {
|
"CCSPlayer_ItemServices_RemoveWeapons": {
|
||||||
"offsets": {
|
"offsets": {
|
||||||
"windows": 21,
|
"windows": 19,
|
||||||
"linux": 20
|
"linux": 20
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -167,6 +174,20 @@
|
|||||||
"linux": "\\x55\\xBA\\xFF\\xFF\\xFF\\xFF\\x48\\x89\\xE5\\x41\\x57\\x41\\x56\\x41\\x55\\x49"
|
"linux": "\\x55\\xBA\\xFF\\xFF\\xFF\\xFF\\x48\\x89\\xE5\\x41\\x57\\x41\\x56\\x41\\x55\\x49"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"StateChanged": {
|
||||||
|
"signatures": {
|
||||||
|
"library": "server",
|
||||||
|
"windows": "\\x40\\x55\\x53\\x56\\x41\\x55\\x41\\x57\\x48\\x8D\\x6C\\x24\\xB0",
|
||||||
|
"linux": "\\x55\\x48\\x89\\xE5\\x41\\x57\\x41\\x56\\x41\\x55\\x41\\x54\\x53\\x89\\xD3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"NetworkStateChanged": {
|
||||||
|
"signatures": {
|
||||||
|
"library": "server",
|
||||||
|
"windows": "\\x4C\\x8B\\xC9\\x48\\x8B\\x09\\x48\\x85\\xC9\\x74\\x2A\\x48\\x8B\\x41\\x10",
|
||||||
|
"linux": "\\x4C\\x8B\\x07\\x4D\\x85\\xC0\\x74\\x2A\\x49\\x8B\\x40\\x10"
|
||||||
|
}
|
||||||
|
},
|
||||||
"GameEntitySystem": {
|
"GameEntitySystem": {
|
||||||
"offsets": {
|
"offsets": {
|
||||||
"windows": 88,
|
"windows": 88,
|
||||||
|
|||||||
@@ -27,9 +27,9 @@ public class AdminTests
|
|||||||
{
|
{
|
||||||
var adminData = AdminManager.GetPlayerAdminData((SteamID)76561197960265731);
|
var adminData = AdminManager.GetPlayerAdminData((SteamID)76561197960265731);
|
||||||
Assert.NotNull(adminData);
|
Assert.NotNull(adminData);
|
||||||
Assert.Equal(125u, adminData.Immunity); // Group immunity is 125, Admin immunity is 100
|
Assert.Equal(125u, AdminManager.GetPlayerImmunity((SteamID)76561197960265731)); // Group immunity is 125, Admin immunity is 100
|
||||||
AdminManager.SetPlayerImmunity((SteamID)76561197960265731, 150u);
|
AdminManager.SetPlayerImmunity((SteamID)76561197960265731, 150u);
|
||||||
Assert.Equal(150u, adminData.Immunity); // Group immunity is 125, Admin immunity is 100
|
Assert.Equal(150u, AdminManager.GetPlayerImmunity((SteamID)76561197960265731)); // Group immunity is 125, Admin immunity is 100
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|||||||
Binary file not shown.
BIN
managed/CounterStrikeSharp.API/ApiCompat/v151.dll
Normal file
BIN
managed/CounterStrikeSharp.API/ApiCompat/v151.dll
Normal file
Binary file not shown.
@@ -1074,6 +1074,18 @@ namespace CounterStrikeSharp.API.Core
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static bool IsSchemaFieldNetworked(string classname, string propname){
|
||||||
|
lock (ScriptContext.GlobalScriptContext.Lock) {
|
||||||
|
ScriptContext.GlobalScriptContext.Reset();
|
||||||
|
ScriptContext.GlobalScriptContext.Push(classname);
|
||||||
|
ScriptContext.GlobalScriptContext.Push(propname);
|
||||||
|
ScriptContext.GlobalScriptContext.SetIdentifier(0xFE413B0C);
|
||||||
|
ScriptContext.GlobalScriptContext.Invoke();
|
||||||
|
ScriptContext.GlobalScriptContext.CheckErrors();
|
||||||
|
return (bool)ScriptContext.GlobalScriptContext.GetResult(typeof(bool));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static T GetSchemaValueByName<T>(IntPtr instance, int returntype, string classname, string propname){
|
public static T GetSchemaValueByName<T>(IntPtr instance, int returntype, string classname, string propname){
|
||||||
lock (ScriptContext.GlobalScriptContext.Lock) {
|
lock (ScriptContext.GlobalScriptContext.Lock) {
|
||||||
ScriptContext.GlobalScriptContext.Reset();
|
ScriptContext.GlobalScriptContext.Reset();
|
||||||
|
|||||||
@@ -85,11 +85,12 @@ namespace CounterStrikeSharp.API.Core
|
|||||||
|
|
||||||
for (var i = 1; i <= 9; i++)
|
for (var i = 1; i <= 9; i++)
|
||||||
{
|
{
|
||||||
CommandUtils.AddStandaloneCommand("css_" + i, "Command Key Handler", (player, info) =>
|
CommandUtils.AddStandaloneCommand($"css_{i}", "Command Key Handler", (player, info) =>
|
||||||
{
|
{
|
||||||
if (player == null) return;
|
if (player == null) return;
|
||||||
var key = Convert.ToInt32(info.GetArg(0).Split("_")[1]);
|
var key = Convert.ToInt32(info.GetArg(0).Split("_")[1]);
|
||||||
ChatMenus.OnKeyPress(player, key);
|
|
||||||
|
MenuManager.OnKeyPress(player, key);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -151,7 +152,7 @@ namespace CounterStrikeSharp.API.Core
|
|||||||
case "start":
|
case "start":
|
||||||
case "load":
|
case "load":
|
||||||
{
|
{
|
||||||
if (info.ArgCount < 2)
|
if (info.ArgCount < 3)
|
||||||
{
|
{
|
||||||
info.ReplyToCommand(
|
info.ReplyToCommand(
|
||||||
"Valid usage: css_plugins start/load [relative plugin path || absolute plugin path] (e.g \"TestPlugin\", \"plugins/TestPlugin/TestPlugin.dll\")\n",
|
"Valid usage: css_plugins start/load [relative plugin path || absolute plugin path] (e.g \"TestPlugin\", \"plugins/TestPlugin/TestPlugin.dll\")\n",
|
||||||
@@ -182,6 +183,7 @@ namespace CounterStrikeSharp.API.Core
|
|||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
info.ReplyToCommand($"Could not load plugin \"{path}\")", true);
|
info.ReplyToCommand($"Could not load plugin \"{path}\")", true);
|
||||||
|
Logger.LogError(e, "Could not load plugin \"{Path}\"", path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -195,7 +197,7 @@ namespace CounterStrikeSharp.API.Core
|
|||||||
case "stop":
|
case "stop":
|
||||||
case "unload":
|
case "unload":
|
||||||
{
|
{
|
||||||
if (info.ArgCount < 2)
|
if (info.ArgCount < 3)
|
||||||
{
|
{
|
||||||
info.ReplyToCommand(
|
info.ReplyToCommand(
|
||||||
"Valid usage: css_plugins stop/unload [plugin name || #plugin id] (e.g \"TestPlugin\", \"1\")\n",
|
"Valid usage: css_plugins stop/unload [plugin name || #plugin id] (e.g \"TestPlugin\", \"1\")\n",
|
||||||
@@ -218,7 +220,7 @@ namespace CounterStrikeSharp.API.Core
|
|||||||
case "restart":
|
case "restart":
|
||||||
case "reload":
|
case "reload":
|
||||||
{
|
{
|
||||||
if (info.ArgCount < 2)
|
if (info.ArgCount < 3)
|
||||||
{
|
{
|
||||||
info.ReplyToCommand(
|
info.ReplyToCommand(
|
||||||
"Valid usage: css_plugins restart/reload [plugin name || #plugin id] (e.g \"TestPlugin\", \"#1\")\n",
|
"Valid usage: css_plugins restart/reload [plugin name || #plugin id] (e.g \"TestPlugin\", \"#1\")\n",
|
||||||
@@ -288,7 +290,7 @@ namespace CounterStrikeSharp.API.Core
|
|||||||
CommandUtils.AddStandaloneCommand("css", "Counter-Strike Sharp options.", OnCSSCommand);
|
CommandUtils.AddStandaloneCommand("css", "Counter-Strike Sharp options.", OnCSSCommand);
|
||||||
CommandUtils.AddStandaloneCommand("css_plugins", "Counter-Strike Sharp plugin options.",
|
CommandUtils.AddStandaloneCommand("css_plugins", "Counter-Strike Sharp plugin options.",
|
||||||
OnCSSPluginCommand);
|
OnCSSPluginCommand);
|
||||||
CommandUtils.AddStandaloneCommand("css_lang", "Set Counter-Strike Sharp language", OnLangCommand);
|
CommandUtils.AddStandaloneCommand("css_lang", "Set Counter-Strike Sharp language.", OnLangCommand);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -17,6 +17,8 @@ public partial class CCSPlayerController
|
|||||||
return NativeAPI.GetUseridFromIndex((int)this.Index);
|
return NativeAPI.GetUseridFromIndex((int)this.Index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public CsTeam Team => (CsTeam)this.TeamNum;
|
||||||
|
|
||||||
public IntPtr GiveNamedItem(string item)
|
public IntPtr GiveNamedItem(string item)
|
||||||
{
|
{
|
||||||
@@ -261,4 +263,4 @@ public partial class CCSPlayerController
|
|||||||
NativeAPI.SetClientVoiceFlags(Handle, (Byte)value);
|
NativeAPI.SetClientVoiceFlags(Handle, (Byte)value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<ApiCompatValidateAssemblies>true</ApiCompatValidateAssemblies>
|
<ApiCompatValidateAssemblies>true</ApiCompatValidateAssemblies>
|
||||||
<ApiCompatContractAssembly>.\ApiCompat\v133.dll</ApiCompatContractAssembly>
|
<ApiCompatContractAssembly>.\ApiCompat\v151.dll</ApiCompatContractAssembly>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Remove="Modules\Commands\CommandInfo" />
|
<None Remove="Modules\Commands\CommandInfo" />
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
|||||||
// This is here for cases where the server console is attempting to call commands.
|
// This is here for cases where the server console is attempting to call commands.
|
||||||
// The server console should have access to all commands, regardless of groups.
|
// The server console should have access to all commands, regardless of groups.
|
||||||
if (player == null) return true;
|
if (player == null) return true;
|
||||||
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot) { return false; }
|
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot || player.IsHLTV) { return false; }
|
||||||
|
|
||||||
var playerData = GetPlayerAdminData(player.AuthorizedSteamID);
|
var playerData = GetPlayerAdminData(player.AuthorizedSteamID);
|
||||||
if (playerData == null) return false;
|
if (playerData == null) return false;
|
||||||
@@ -136,20 +136,20 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
|||||||
return playerData.Groups.IsSupersetOf(playerGroups);
|
return playerData.Groups.IsSupersetOf(playerGroups);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Adds a player to a group.
|
/// Adds a player to a group. This does NOT modify the immunity of the player (see SetPlayerImmunity).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="player">Player controller.</param>
|
/// <param name="player">Player controller.</param>
|
||||||
/// <param name="groups">Groups to add the player to.</param>
|
/// <param name="groups">Groups to add the player to.</param>
|
||||||
public static void AddPlayerToGroup(CCSPlayerController? player, params string[] groups)
|
public static void AddPlayerToGroup(CCSPlayerController? player, params string[] groups)
|
||||||
{
|
{
|
||||||
if (player == null) return;
|
if (player == null) return;
|
||||||
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot) { return; }
|
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot || player.IsHLTV) { return; }
|
||||||
AddPlayerToGroup(player.AuthorizedSteamID, groups);
|
AddPlayerToGroup(player.AuthorizedSteamID, groups);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Adds a player to a group.
|
/// Adds a player to a group. This does NOT modify the immunity of the player (see SetPlayerImmunity).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="steamId">SteamID of the player.</param>
|
/// <param name="steamId">SteamID of the player.</param>
|
||||||
/// <param name="groups">Groups to add the player to.</param>
|
/// <param name="groups">Groups to add the player to.</param>
|
||||||
@@ -187,7 +187,7 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
|||||||
public static void RemovePlayerFromGroup(CCSPlayerController? player, bool removeInheritedFlags = true, params string[] groups)
|
public static void RemovePlayerFromGroup(CCSPlayerController? player, bool removeInheritedFlags = true, params string[] groups)
|
||||||
{
|
{
|
||||||
if (player == null) return;
|
if (player == null) return;
|
||||||
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot) { return; }
|
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot || player.IsHLTV) { return; }
|
||||||
RemovePlayerFromGroup(player.AuthorizedSteamID, true, groups);
|
RemovePlayerFromGroup(player.AuthorizedSteamID, true, groups);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -167,22 +167,43 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Grabs the admin data for a player that was loaded from "configs/admins.json".
|
/// Grabs the admin data for a player that was loaded from "configs/admins.json" and "configs/admins_groups.json".
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="steamId">SteamID object of the player.</param>
|
/// <param name="player">Player controller</param>
|
||||||
/// <returns>AdminData class if data found, null if not.</returns>
|
/// <returns>AdminData class if data found, null if not.</returns>
|
||||||
public static AdminData? GetPlayerAdminData(SteamID? steamId)
|
public static AdminData? GetPlayerAdminData(CCSPlayerController? player)
|
||||||
|
{
|
||||||
|
if (player == null) return null;
|
||||||
|
return GetPlayerAdminData(player.AuthorizedSteamID);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Grabs the admin data for a player that was loaded from "configs/admins.json" and "configs/admins_groups.json".
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="steamId">SteamID object of the player.</param>
|
||||||
|
/// <returns>AdminData class if data found, null if not.</returns>
|
||||||
|
public static AdminData? GetPlayerAdminData(SteamID? steamId)
|
||||||
{
|
{
|
||||||
if (steamId == null) return null;
|
if (steamId == null) return null;
|
||||||
return Admins.GetValueOrDefault(steamId);
|
return Admins.GetValueOrDefault(steamId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Removes a players admin data. This is not saved to "configs/admins.json"
|
/// Removes a players admin data. This is not saved to "configs/admins.json"
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="steamId">Steam ID remove admin data from.</param>
|
/// <param name="player">Player controller</param>
|
||||||
public static void RemovePlayerAdminData(SteamID? steamId)
|
public static void RemovePlayerAdminData(CCSPlayerController? player)
|
||||||
|
{
|
||||||
|
if (player == null) return;
|
||||||
|
RemovePlayerAdminData(player.AuthorizedSteamID);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Removes a players admin data. This is not saved to "configs/admins.json"
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="steamId">Steam ID remove admin data from.</param>
|
||||||
|
public static void RemovePlayerAdminData(SteamID? steamId)
|
||||||
{
|
{
|
||||||
if (steamId == null) return;
|
if (steamId == null) return;
|
||||||
Admins.Remove(steamId);
|
Admins.Remove(steamId);
|
||||||
@@ -201,7 +222,7 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
|||||||
// This is here for cases where the server console is attempting to call commands.
|
// This is here for cases where the server console is attempting to call commands.
|
||||||
// The server console should have access to all commands, regardless of permissions.
|
// The server console should have access to all commands, regardless of permissions.
|
||||||
if (player == null) return true;
|
if (player == null) return true;
|
||||||
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot) { return false; }
|
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot || player.IsHLTV) { return false; }
|
||||||
return PlayerHasPermissions(player.AuthorizedSteamID, flags);
|
return PlayerHasPermissions(player.AuthorizedSteamID, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -260,7 +281,7 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
|||||||
// This is here for cases where the server console is attempting to call commands.
|
// This is here for cases where the server console is attempting to call commands.
|
||||||
// The server console should have access to all commands, regardless of permissions.
|
// The server console should have access to all commands, regardless of permissions.
|
||||||
if (player == null) return true;
|
if (player == null) return true;
|
||||||
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot) { return false; }
|
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot || player.IsHLTV) { return false; }
|
||||||
var playerData = GetPlayerAdminData(player.AuthorizedSteamID);
|
var playerData = GetPlayerAdminData(player.AuthorizedSteamID);
|
||||||
return playerData?.CommandOverrides.ContainsKey(command) ?? false;
|
return playerData?.CommandOverrides.ContainsKey(command) ?? false;
|
||||||
}
|
}
|
||||||
@@ -290,7 +311,7 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
|||||||
// This is here for cases where the server console is attempting to call commands.
|
// This is here for cases where the server console is attempting to call commands.
|
||||||
// The server console should have access to all commands, regardless of permissions.
|
// The server console should have access to all commands, regardless of permissions.
|
||||||
if (player == null) return true;
|
if (player == null) return true;
|
||||||
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot) { return false; }
|
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot || player.IsHLTV) { return false; }
|
||||||
var playerData = GetPlayerAdminData(player.AuthorizedSteamID);
|
var playerData = GetPlayerAdminData(player.AuthorizedSteamID);
|
||||||
return playerData?.CommandOverrides.GetValueOrDefault(command) ?? false;
|
return playerData?.CommandOverrides.GetValueOrDefault(command) ?? false;
|
||||||
}
|
}
|
||||||
@@ -319,7 +340,7 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
|||||||
// This is here for cases where the server console is attempting to call commands.
|
// This is here for cases where the server console is attempting to call commands.
|
||||||
// The server console should have access to all commands, regardless of permissions.
|
// The server console should have access to all commands, regardless of permissions.
|
||||||
if (player == null) return;
|
if (player == null) return;
|
||||||
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot) { return; }
|
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot || player.IsHLTV) { return; }
|
||||||
SetPlayerCommandOverride(player.AuthorizedSteamID, command, state);
|
SetPlayerCommandOverride(player.AuthorizedSteamID, command, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -362,7 +383,7 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
|||||||
public static void AddPlayerPermissions(CCSPlayerController? player, params string[] flags)
|
public static void AddPlayerPermissions(CCSPlayerController? player, params string[] flags)
|
||||||
{
|
{
|
||||||
if (player == null) return;
|
if (player == null) return;
|
||||||
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot) return;
|
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot || player.IsHLTV) return;
|
||||||
AddPlayerPermissions(player.AuthorizedSteamID, flags);
|
AddPlayerPermissions(player.AuthorizedSteamID, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -400,7 +421,7 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
|||||||
public static void RemovePlayerPermissions(CCSPlayerController? player, params string[] flags)
|
public static void RemovePlayerPermissions(CCSPlayerController? player, params string[] flags)
|
||||||
{
|
{
|
||||||
if (player == null) return;
|
if (player == null) return;
|
||||||
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot) return;
|
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot || player.IsHLTV) return;
|
||||||
|
|
||||||
RemovePlayerPermissions(player.AuthorizedSteamID, flags);
|
RemovePlayerPermissions(player.AuthorizedSteamID, flags);
|
||||||
}
|
}
|
||||||
@@ -427,7 +448,7 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
|||||||
public static void ClearPlayerPermissions(CCSPlayerController? player)
|
public static void ClearPlayerPermissions(CCSPlayerController? player)
|
||||||
{
|
{
|
||||||
if (player == null) return;
|
if (player == null) return;
|
||||||
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot) return;
|
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot || player.IsHLTV) return;
|
||||||
|
|
||||||
ClearPlayerPermissions(player.AuthorizedSteamID);
|
ClearPlayerPermissions(player.AuthorizedSteamID);
|
||||||
}
|
}
|
||||||
@@ -457,7 +478,7 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
|||||||
public static void SetPlayerImmunity(CCSPlayerController? player, uint value)
|
public static void SetPlayerImmunity(CCSPlayerController? player, uint value)
|
||||||
{
|
{
|
||||||
if (player == null) return;
|
if (player == null) return;
|
||||||
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot) return;
|
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot || player.IsHLTV) return;
|
||||||
|
|
||||||
SetPlayerImmunity(player.AuthorizedSteamID, value);
|
SetPlayerImmunity(player.AuthorizedSteamID, value);
|
||||||
}
|
}
|
||||||
@@ -477,13 +498,44 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
|||||||
Admins[steamId] = data;
|
Admins[steamId] = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Checks to see if a player can target another player based on their immunity value.
|
/// Returns the immunity value for a player.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="caller">Caller of the command.</param>
|
/// <param name="player">Player controller.</param>
|
||||||
/// <param name="target">Target of the command.</param>
|
/// <returns> If an immunity value is present in "configs/admins_groups.json"
|
||||||
/// <returns></returns>
|
/// and in "configs/admins.json", the returned value will be the greater of the two.
|
||||||
public static bool CanPlayerTarget(CCSPlayerController? caller, CCSPlayerController? target)
|
/// If the value is overriden with SetPlayerImmunity, that value is returned instead.</returns>
|
||||||
|
public static uint GetPlayerImmunity(CCSPlayerController? player)
|
||||||
|
{
|
||||||
|
if (player == null) return 0;
|
||||||
|
if (!player.IsValid || player.Connected != PlayerConnectedState.PlayerConnected || player.IsBot || player.IsHLTV) return 0;
|
||||||
|
|
||||||
|
return GetPlayerImmunity(player.AuthorizedSteamID);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the immunity value for a player.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="steamId">Steam ID of the player.</param>
|
||||||
|
/// <returns> If an immunity value is present in "configs/admins_groups.json"
|
||||||
|
/// and in "configs/admins.json", the returned value will be the greater of the two.
|
||||||
|
/// If the value is overriden with SetPlayerImmunity, that value is returned instead.</returns>
|
||||||
|
public static uint GetPlayerImmunity(SteamID? steamId)
|
||||||
|
{
|
||||||
|
if (steamId == null) return 0;
|
||||||
|
var data = GetPlayerAdminData(steamId);
|
||||||
|
if (data == null) return 0;
|
||||||
|
|
||||||
|
return data.Immunity;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks to see if a player can target another player based on their immunity value.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="caller">Caller of the command.</param>
|
||||||
|
/// <param name="target">Target of the command.</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static bool CanPlayerTarget(CCSPlayerController? caller, CCSPlayerController? target)
|
||||||
{
|
{
|
||||||
// The server console should be able to target everyone.
|
// The server console should be able to target everyone.
|
||||||
if (caller == null) return true;
|
if (caller == null) return true;
|
||||||
|
|||||||
@@ -90,11 +90,11 @@ public class Target
|
|||||||
case TargetType.TeamSpec:
|
case TargetType.TeamSpec:
|
||||||
return player.TeamNum == (byte)CsTeam.Spectator;
|
return player.TeamNum == (byte)CsTeam.Spectator;
|
||||||
case TargetType.GroupAll:
|
case TargetType.GroupAll:
|
||||||
return true;
|
return !player.IsHLTV;
|
||||||
case TargetType.GroupBots:
|
case TargetType.GroupBots:
|
||||||
return player.IsBot;
|
return player.IsBot;
|
||||||
case TargetType.GroupHumans:
|
case TargetType.GroupHumans:
|
||||||
return !player.IsBot;
|
return !player.IsBot && !player.IsHLTV;
|
||||||
case TargetType.GroupAlive:
|
case TargetType.GroupAlive:
|
||||||
return player.PlayerPawn is { IsValid: true, Value.LifeState: (byte)LifeState_t.LIFE_ALIVE };
|
return player.PlayerPawn is { IsValid: true, Value.LifeState: (byte)LifeState_t.LIFE_ALIVE };
|
||||||
case TargetType.GroupDead:
|
case TargetType.GroupDead:
|
||||||
|
|||||||
@@ -1,110 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Text;
|
|
||||||
using CounterStrikeSharp.API.Core;
|
|
||||||
using CounterStrikeSharp.API.Modules.Listeners;
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Cvars
|
|
||||||
{
|
|
||||||
public class ConVar
|
|
||||||
{
|
|
||||||
public delegate void ConVarChangedCallback(ConVar convar, string oldValue, string newValue);
|
|
||||||
|
|
||||||
public IntPtr Handle { get; private set; }
|
|
||||||
|
|
||||||
internal ConVar(IntPtr handle)
|
|
||||||
{
|
|
||||||
Handle = handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ConVar(string name, string value, string description, ConVarFlags flags, bool hasMinValue, float minValue, bool hasMaxValue, float maxValue) :
|
|
||||||
this(NativeAPI.CreateConvar(name, value, description, (int)flags, hasMinValue, minValue, hasMaxValue, maxValue))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public ConVar(string name, string value, string description = null, ConVarFlags flags = ConVarFlags.None, float? minValue = null, float? maxValue = null) :
|
|
||||||
this(name, value, description, flags, minValue.HasValue, minValue?? 0, maxValue.HasValue, maxValue?? 0)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Name => NativeAPI.ConvarGetName(Handle);
|
|
||||||
|
|
||||||
public string StringValue
|
|
||||||
{
|
|
||||||
get { return NativeAPI.ConvarGetStringValue(Handle); }
|
|
||||||
set { NativeAPI.ConvarSetStringValue(Handle, value); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public float FloatValue
|
|
||||||
{
|
|
||||||
get { return Convert.ToSingle(NativeAPI.ConvarGetStringValue(Handle)); }
|
|
||||||
set { NativeAPI.ConvarSetStringValue(Handle, value.ToString("n2")); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public int IntValue
|
|
||||||
{
|
|
||||||
get { return Convert.ToInt32(NativeAPI.ConvarGetStringValue(Handle)); }
|
|
||||||
set { NativeAPI.ConvarSetStringValue(Handle, value.ToString()); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool BoolValue
|
|
||||||
{
|
|
||||||
get { return NativeAPI.ConvarGetStringValue(Handle) == "1"; }
|
|
||||||
set { NativeAPI.ConvarSetStringValue(Handle, value ? "1" : "0"); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public ConVarFlags Flags
|
|
||||||
{
|
|
||||||
get { return (ConVarFlags) NativeAPI.ConvarGetFlags(Handle); }
|
|
||||||
set { NativeAPI.ConvarSetFlags(Handle, (int)value); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Public
|
|
||||||
{
|
|
||||||
get { return Flags.HasFlag(ConVarFlags.Notify); }
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (value)
|
|
||||||
{
|
|
||||||
Flags |= ConVarFlags.Notify;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Flags &= ~ConVarFlags.Notify;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ConVar Find(string name)
|
|
||||||
{
|
|
||||||
var ptr = NativeAPI.FindConvar(name);
|
|
||||||
if (ptr == IntPtr.Zero) return null;
|
|
||||||
|
|
||||||
return new ConVar(ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Unregister()
|
|
||||||
{
|
|
||||||
NativeAPI.ConvarUnregister(Handle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Engine.Trace
|
|
||||||
{
|
|
||||||
public enum ContentMasks
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Engine.Trace
|
|
||||||
{
|
|
||||||
public enum RayType
|
|
||||||
{
|
|
||||||
EndPoint,
|
|
||||||
Infinite
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,166 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using CounterStrikeSharp.API.Core;
|
|
||||||
using CounterStrikeSharp.API.Modules.Entities;
|
|
||||||
using CounterStrikeSharp.API.Modules.Listeners;
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Engine.Trace
|
|
||||||
{
|
|
||||||
public class SimpleTraceFilter : NativeObject
|
|
||||||
{
|
|
||||||
public SimpleTraceFilter(IntPtr cPtr) : base(cPtr)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public SimpleTraceFilter(int indexToIgnore) : base(NativeAPI.NewSimpleTraceFilter(indexToIgnore))
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class TraceFilterProxy : NativeObject
|
|
||||||
{
|
|
||||||
private ITraceFilter _filter;
|
|
||||||
private FunctionReference.CallbackDelegate getTypeCallback;
|
|
||||||
private FunctionReference.CallbackDelegate shouldHitCallback;
|
|
||||||
|
|
||||||
public TraceFilterProxy(IntPtr cPtr) : base(cPtr)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public TraceFilterProxy(ITraceFilter filter) : base(NativeAPI.NewTraceFilterProxy())
|
|
||||||
{
|
|
||||||
_filter = filter;
|
|
||||||
|
|
||||||
/*
|
|
||||||
getTypeCallback = Utilities.SafeExecute(intPtr =>
|
|
||||||
{
|
|
||||||
var marshal = new CMarshalObject();
|
|
||||||
marshal.PushInt((int) _filter.GetTraceType());
|
|
||||||
return marshal.GetPointer();
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*shouldHitCallback = Utilities.SafeExecute(ptr =>
|
|
||||||
{
|
|
||||||
var marshal = new CMarshalObject(ptr, true);
|
|
||||||
var entity = marshal.GetValue<BaseEntity>();
|
|
||||||
var contentMask = marshal.GetInt();
|
|
||||||
|
|
||||||
var isValidEntity = _filter.ShouldHitEntity(entity, contentMask);
|
|
||||||
|
|
||||||
var response = new CMarshalObject();
|
|
||||||
response.PushInt(isValidEntity ? 1 : 0);
|
|
||||||
|
|
||||||
return response.GetPointer();
|
|
||||||
});*/
|
|
||||||
|
|
||||||
unsafe
|
|
||||||
{
|
|
||||||
getTypeCallback = (fxScriptContext* context) =>
|
|
||||||
{
|
|
||||||
var scriptContext = new ScriptContext(context);
|
|
||||||
|
|
||||||
scriptContext.Push(_filter.GetTraceType());
|
|
||||||
};
|
|
||||||
|
|
||||||
shouldHitCallback = (fxScriptContext* context) =>
|
|
||||||
{
|
|
||||||
var scriptContext = new ScriptContext(context);
|
|
||||||
|
|
||||||
var entity = new BaseEntity(scriptContext.GetArgument<int>(0));
|
|
||||||
var contentMask = scriptContext.GetArgument<int>(1);
|
|
||||||
|
|
||||||
var isValidEntity = _filter.ShouldHitEntity(entity, contentMask);
|
|
||||||
|
|
||||||
Console.WriteLine($"Returning {isValidEntity} to `ShouldHitEntity`");
|
|
||||||
|
|
||||||
scriptContext.SetResult(isValidEntity, context);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NativeAPI.TraceFilterProxySetTraceTypeCallback(Handle, Marshal.GetFunctionPointerForDelegate(getTypeCallback));
|
|
||||||
NativeAPI.TraceFilterProxySetShouldHitEntityCallback(Handle, Marshal.GetFunctionPointerForDelegate(shouldHitCallback));
|
|
||||||
/*NativeAPI.TraceFilterProxySetTraceTypeCallback(Handle, getTypeCallback);
|
|
||||||
NativePINVOKE.TraceFilterProxy_SetGetTraceTypeCallback(ptr, getTypeCallback.ToHandle());
|
|
||||||
NativePINVOKE.TraceFilterProxy_SetShouldHitEntityCallback(ptr, shouldHitCallback.ToHandle());*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum TraceType
|
|
||||||
{
|
|
||||||
Everything = 0,
|
|
||||||
WorldOnly, // NOTE: This does *not* test static props!!!
|
|
||||||
EntitiesOnly, // NOTE: This version will *not* test static props
|
|
||||||
EverythingFilterProps, // NOTE: This version will pass the IHandleEntity for props through the filter, unlike all other filters
|
|
||||||
};
|
|
||||||
|
|
||||||
public class CustomTraceFilter : TraceFilter
|
|
||||||
{
|
|
||||||
private Func<BaseEntity, bool> _filter;
|
|
||||||
|
|
||||||
public CustomTraceFilter(Func<BaseEntity, bool> filter)
|
|
||||||
{
|
|
||||||
_filter = filter;
|
|
||||||
}
|
|
||||||
public override bool ShouldHitEntity(BaseEntity entity, int contentMask)
|
|
||||||
{
|
|
||||||
return _filter.Invoke(entity);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override TraceType GetTraceType()
|
|
||||||
{
|
|
||||||
return TraceType.Everything;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ExclusionTraceFilter : TraceFilter
|
|
||||||
{
|
|
||||||
private int _indexToExclude;
|
|
||||||
|
|
||||||
public ExclusionTraceFilter(int indexToExclude)
|
|
||||||
{
|
|
||||||
this._indexToExclude = indexToExclude;
|
|
||||||
}
|
|
||||||
public override bool ShouldHitEntity(BaseEntity entity, int contentMask)
|
|
||||||
{
|
|
||||||
if (entity.Index == _indexToExclude) return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override TraceType GetTraceType()
|
|
||||||
{
|
|
||||||
return TraceType.Everything;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract class TraceFilter : ITraceFilter
|
|
||||||
{
|
|
||||||
public abstract bool ShouldHitEntity(BaseEntity entity, int contentMask);
|
|
||||||
public abstract TraceType GetTraceType();
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface ITraceFilter
|
|
||||||
{
|
|
||||||
bool ShouldHitEntity(BaseEntity entity, int contentMask);
|
|
||||||
TraceType GetTraceType();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using CounterStrikeSharp.API.Core;
|
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Engine.Trace
|
|
||||||
{
|
|
||||||
public class TraceEngine
|
|
||||||
{
|
|
||||||
public static IntPtr CreateRay(RayType rayType, Vector vec1, Vector vec2)
|
|
||||||
{
|
|
||||||
return NativeAPI.CreateRay1((int) rayType, vec1.Handle, vec2.Handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IntPtr CreateRay(Vector vec1, Vector vec2, Vector vec3, Vector vec4)
|
|
||||||
{
|
|
||||||
return NativeAPI.CreateRay2(vec1.Handle, vec2.Handle, vec3.Handle, vec4.Handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static TraceResult TraceRay(IntPtr ray, uint mask, ITraceFilter filter)
|
|
||||||
{
|
|
||||||
var tr = new TraceResult();
|
|
||||||
var proxy = new TraceFilterProxy(filter);
|
|
||||||
NativeAPI.TraceRay(ray, tr.Handle, proxy.Handle, mask);
|
|
||||||
return tr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using CounterStrikeSharp.API.Core;
|
|
||||||
using CounterStrikeSharp.API.Modules.Entities;
|
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Engine.Trace
|
|
||||||
{
|
|
||||||
public class TraceResult : NativeObject
|
|
||||||
{
|
|
||||||
public TraceResult(IntPtr cPtr) : base(cPtr)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public TraceResult() : base(NativeAPI.NewTraceResult())
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool DidHit()
|
|
||||||
{
|
|
||||||
// return NativeAPI.TraceDidHit(Handle);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BaseEntity Entity
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
var entity = new BaseEntity(NativeAPI.TraceResultEntity(Handle));
|
|
||||||
if (entity?.IsNetworked == true)
|
|
||||||
{
|
|
||||||
return entity;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*public TraceSurface Surface => NativePINVOKE.CGameTrace_surface_get(ptr).ToObject<TraceSurface>();
|
|
||||||
public int Hitbox => NativePINVOKE.CGameTrace_hitbox_get(ptr);
|
|
||||||
public int Hitgroup => NativePINVOKE.CGameTrace_hitgroup_get(ptr);
|
|
||||||
public float FractionLeftSolid => NativePINVOKE.CGameTrace_fractionleftsolid_get(ptr);
|
|
||||||
public int PhysicsBone => NativePINVOKE.CGameTrace_physicsbone_get(ptr);*/
|
|
||||||
|
|
||||||
/*public Vector StartPosition => NativePINVOKE.CBaseTrace_startpos_get(ptr).ToObject<Vector>();
|
|
||||||
public Vector EndPosition => NativePINVOKE.CBaseTrace_endpos_get(ptr).ToObject<Vector>();*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,449 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Drawing;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Numerics;
|
|
||||||
using CounterStrikeSharp.API.Core;
|
|
||||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
|
||||||
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Entities
|
|
||||||
{
|
|
||||||
public class BaseEntity : NativeObject
|
|
||||||
{
|
|
||||||
public BaseEntity(int index) : base(NativeAPI.BaseentityFromIndex(index))
|
|
||||||
{
|
|
||||||
_index = index;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BaseEntity(IntPtr pointer) : base(pointer)
|
|
||||||
{
|
|
||||||
_index = NativeAPI.IndexFromBaseentity(pointer);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string ToString()
|
|
||||||
{
|
|
||||||
return string.Format("{0}", Index);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Props
|
|
||||||
public int GetProp(PropType type, string name) => NativeAPI.EntityGetPropInt(Index, (int) type, name);
|
|
||||||
|
|
||||||
public T GetProp<T>(PropType type, string name) => (T) (NativeAPI.EntityGetPropInt(Index, (int) type, name) as object);
|
|
||||||
|
|
||||||
public void SetProp(PropType type, string name, int value) => NativeAPI.EntitySetPropInt(Index, (int)type, name, value);
|
|
||||||
|
|
||||||
public void SetProp<T>(PropType type, string name, T value) => NativeAPI.EntitySetPropInt(Index, (int)type, name, (int)(object)value);
|
|
||||||
|
|
||||||
public bool GetPropBool(PropType type, string name) => GetProp(type, name) == 1;
|
|
||||||
|
|
||||||
public void SetPropBool(PropType type, string name, bool value) => SetProp(type, name, value ? 1 : 0);
|
|
||||||
|
|
||||||
public float GetPropFloat(PropType type, string name) => NativeAPI.EntityGetPropFloat(Index, (int) type, name);
|
|
||||||
|
|
||||||
public void SetPropFloat(PropType type, string name, float value) => NativeAPI.EntitySetPropFloat(Index, (int)type, name, value);
|
|
||||||
|
|
||||||
public Vector GetPropVector(PropType type, string name) => new(NativeAPI.EntityGetPropVector(Index, (int) type, name));
|
|
||||||
|
|
||||||
public void SetPropVector(PropType type, string name, Vector vector) => NativeAPI.EntitySetPropVector(Index, (int) type, name, vector.Handle);
|
|
||||||
|
|
||||||
public string GetPropString(PropType type, string name) => NativeAPI.EntityGetPropString(Index, (int)type, name);
|
|
||||||
|
|
||||||
public void SetPropString(PropType type, string name, string value) => NativeAPI.EntitySetPropString(Index, (int)type, name, value);
|
|
||||||
|
|
||||||
public BaseEntity GetPropEnt(PropType type, string name)
|
|
||||||
{
|
|
||||||
var returnVal = NativeAPI.EntityGetPropEnt(Index, (int) type, name);
|
|
||||||
if (returnVal < 0) return null;
|
|
||||||
return BaseEntity.FromIndex(returnVal);
|
|
||||||
}
|
|
||||||
|
|
||||||
public BaseEntity GetPropEntByOffset(int offset)
|
|
||||||
{
|
|
||||||
var returnVal = NativeAPI.EntityGetPropEntByOffset(Index, offset);
|
|
||||||
if (returnVal < 0) return null;
|
|
||||||
return BaseEntity.FromIndex(returnVal);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetPropEnt(PropType type, string name, int index) => NativeAPI.EntitySetPropEnt(Index, (int) type, name, index);
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region KeyValues
|
|
||||||
public string GetKeyValue(string name) => NativeAPI.EntityGetKeyvalue(Index, name);
|
|
||||||
|
|
||||||
public Vector GetKeyValueVector(string name)
|
|
||||||
{
|
|
||||||
var values = GetKeyValue(name).Split(new []{" "}, StringSplitOptions.None).Select(float.Parse).ToArray();
|
|
||||||
return new Vector(values[0], values[1], values[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public float GetKeyValueFloat(string name)
|
|
||||||
{
|
|
||||||
return Convert.ToSingle(GetKeyValue(name));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetKeyValue(string name, string value) => NativeAPI.EntitySetKeyvalue(Index, name, value);
|
|
||||||
|
|
||||||
public void SetKeyValueFloat(string name, float value) => SetKeyValue(name, value.ToString());
|
|
||||||
|
|
||||||
public void SetKeyValueVector(string name, Vector vec)
|
|
||||||
{
|
|
||||||
string strValue = $"{vec.X} {vec.Y} {vec.Z}";
|
|
||||||
NativeAPI.EntitySetKeyvalue(Index, name, strValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
public bool IsPlayer => NativeAPI.EntityIsPlayer(Index);
|
|
||||||
public bool IsWeapon => NativeAPI.EntityIsWeapon(Index);
|
|
||||||
|
|
||||||
public bool IsNetworked => NativeAPI.EntityIsNetworked(Index);
|
|
||||||
public bool IsValid => NativeAPI.EntityIsValid(Index);
|
|
||||||
|
|
||||||
/*public bool IsPlayer => NativePINVOKE.CBaseEntityWrapper_IsPlayer(ptr);
|
|
||||||
public bool IsWeapon => NativePINVOKE.CBaseEntityWrapper_IsWeapon(ptr);
|
|
||||||
public bool IsMoving => NativePINVOKE.CBaseEntityWrapper_IsMoving(ptr);*/
|
|
||||||
|
|
||||||
|
|
||||||
public Vector Origin
|
|
||||||
{
|
|
||||||
get => GetKeyValueVector("origin");
|
|
||||||
set => SetKeyValueVector("origin", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public Vector Maxs
|
|
||||||
{
|
|
||||||
get => GetPropVector(PropType.Send, "m_Collision.m_vecMaxs");
|
|
||||||
set => SetPropVector(PropType.Send, "m_Collision.m_vecMaxs", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Vector Mins
|
|
||||||
{
|
|
||||||
get => GetPropVector(PropType.Send, "m_Collision.m_vecMins");
|
|
||||||
set => SetPropVector(PropType.Send, "m_Collision.m_vecMins", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int EntityFlags
|
|
||||||
{
|
|
||||||
get => GetProp(PropType.Data, "m_iEFlags");
|
|
||||||
set => SetProp(PropType.Data, "m_iEFlags", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public SolidType SolidType
|
|
||||||
{
|
|
||||||
get => (SolidType)GetProp(PropType.Send, "m_Collision.m_nSolidType");
|
|
||||||
set => SetProp(PropType.Send, "m_Collision.m_nSolidType", (int)value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public SolidFlags SolidFlags
|
|
||||||
{
|
|
||||||
get => GetProp<SolidFlags>(PropType.Send, "m_Collision.m_usSolidFlags");
|
|
||||||
set => SetProp(PropType.Send, "m_Collision.m_usSolidFlags", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public CollisionGroup CollisionGroup
|
|
||||||
{
|
|
||||||
get => GetProp<CollisionGroup>(PropType.Send, "m_CollisionGroup");
|
|
||||||
set => SetProp(PropType.Send, "m_CollisionGroup", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: ENTITY RENDER COLOR
|
|
||||||
public Color Color
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
int offset = NativeAPI.FindDatamapInfo(Index, "m_clrRender");
|
|
||||||
|
|
||||||
int r = NativeAPI.EntityGetProp(Index, offset + 0, 8);
|
|
||||||
int g = NativeAPI.EntityGetProp(Index, offset + 1, 8);
|
|
||||||
int b = NativeAPI.EntityGetProp(Index, offset + 2, 8);
|
|
||||||
int a = NativeAPI.EntityGetProp(Index, offset + 3, 8);
|
|
||||||
return Color.FromArgb(a, r, g, b);
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
int offset = NativeAPI.FindDatamapInfo(Index, "m_clrRender");
|
|
||||||
|
|
||||||
NativeAPI.EntitySetProp(Index, offset + 0, 8, value.R);
|
|
||||||
NativeAPI.EntitySetProp(Index, offset + 1, 8, value.G);
|
|
||||||
NativeAPI.EntitySetProp(Index, offset + 2, 8, value.B);
|
|
||||||
NativeAPI.EntitySetProp(Index, offset + 3, 8, value.A);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public float Elasticity
|
|
||||||
{
|
|
||||||
get => GetPropFloat(PropType.Send, "m_flElasticity");
|
|
||||||
set => SetPropFloat(PropType.Send, "m_flElasticity", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public BaseEntity GroundEntity
|
|
||||||
{
|
|
||||||
get => GetPropEnt(PropType.Data, "m_hGroundEntity");
|
|
||||||
set => SetPropEnt(PropType.Data, "m_hGroundEntity", value.Index);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Team Team
|
|
||||||
{
|
|
||||||
get => GetProp<Team>(PropType.Send, "m_iTeamNum");
|
|
||||||
set => SetProp(PropType.Send, "m_iTeamNum", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public RenderFx RenderFx
|
|
||||||
{
|
|
||||||
get => (RenderFx)GetProp(PropType.Send, "m_nRenderFX");
|
|
||||||
set => SetProp(PropType.Send, "m_nRenderFX", (int)value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public RenderMode RenderMode
|
|
||||||
{
|
|
||||||
get => (RenderMode)GetProp(PropType.Send, "m_nRenderMode");
|
|
||||||
set => SetProp(PropType.Send, "m_nRenderMode", (int)value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public MoveType MoveType
|
|
||||||
{
|
|
||||||
get => (MoveType)GetProp(PropType.Send, "movetype");
|
|
||||||
set => SetProp(PropType.Send, "movetype", (int)value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public new IntPtr Handle => NativeAPI.BaseentityFromIndex(Index);
|
|
||||||
|
|
||||||
public int ParentHandle
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
return GetProp(PropType.Data, "m_pParent");
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
set => SetProp(PropType.Data, "m_pParent", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Vector Angles
|
|
||||||
{
|
|
||||||
get => GetKeyValueVector("angles");
|
|
||||||
set => SetKeyValueVector("angles", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public string TargetName
|
|
||||||
{
|
|
||||||
get => GetKeyValue("targetname");
|
|
||||||
set => SetKeyValue("targetname", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Entity Owner Handle
|
|
||||||
|
|
||||||
public Vector AngVelocity
|
|
||||||
{
|
|
||||||
get => GetPropVector(PropType.Data, "m_vecAngVelocity");
|
|
||||||
set => SetPropVector(PropType.Data, "m_vecAngVelocity", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Vector BaseVelocity
|
|
||||||
{
|
|
||||||
get => GetPropVector(PropType.Data, "m_vecBaseVelocity");
|
|
||||||
set => SetPropVector(PropType.Data, "m_vecBaseVelocity", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public string DamageFilter
|
|
||||||
{
|
|
||||||
get => GetKeyValue("damagefilter");
|
|
||||||
set => SetKeyValue("damagefilter", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int Effects
|
|
||||||
{
|
|
||||||
get => GetProp(PropType.Data, "m_fEffects");
|
|
||||||
set => SetProp(PropType.Data, "m_fEffects", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public float Friction
|
|
||||||
{
|
|
||||||
get => GetPropFloat(PropType.Data, "m_flFriction");
|
|
||||||
set => SetPropFloat(PropType.Data, "m_flFriction", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public string GlobalName
|
|
||||||
{
|
|
||||||
get => GetKeyValue("globalname");
|
|
||||||
set => SetKeyValue("globalname", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public float Gravity
|
|
||||||
{
|
|
||||||
get => GetPropFloat(PropType.Data, "m_flGravity");
|
|
||||||
set => SetPropFloat(PropType.Data, "m_flGravity", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int HammerId
|
|
||||||
{
|
|
||||||
get => GetProp(PropType.Data, "m_iHammerID");
|
|
||||||
set => SetProp(PropType.Data, "m_iHammerID", value);
|
|
||||||
}
|
|
||||||
public int Health
|
|
||||||
{
|
|
||||||
get => GetProp(PropType.Data, "m_iHealth");
|
|
||||||
set => SetProp(PropType.Data, "m_iHealth", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public float LocalTime
|
|
||||||
{
|
|
||||||
get => GetPropFloat(PropType.Data, "m_flLocalTime");
|
|
||||||
set => SetPropFloat(PropType.Data, "m_flLocalTime", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int MaxHealth
|
|
||||||
{
|
|
||||||
get => GetProp(PropType.Data, "m_iMaxHealth");
|
|
||||||
set => SetProp(PropType.Data, "m_iMaxHealth", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public string ParentName
|
|
||||||
{
|
|
||||||
get => GetKeyValue("parentname");
|
|
||||||
set => SetKeyValue("parentname", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public float ShadowCastDistance
|
|
||||||
{
|
|
||||||
get => GetPropFloat(PropType.Send, "m_flShadowCastDistance");
|
|
||||||
set => SetPropFloat(PropType.Send, "m_flShadowCastDistance", value);
|
|
||||||
}
|
|
||||||
public int SpawnFlags
|
|
||||||
{
|
|
||||||
get => GetProp(PropType.Data, "m_spawnflags");
|
|
||||||
set => SetProp(PropType.Data, "m_spawnflags", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public float Speed
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
return GetPropFloat(PropType.Data, "m_flLaggedMovementValue");
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
return GetKeyValueFloat("speed");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
set
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
SetPropFloat(PropType.Data, "m_flLaggedMovementValue", value);
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
SetKeyValueFloat("speed", value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Target
|
|
||||||
{
|
|
||||||
get => GetKeyValue("target");
|
|
||||||
set => SetKeyValue("target", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Vector Velocity
|
|
||||||
{
|
|
||||||
get => GetPropVector(PropType.Data, "m_vecVelocity");
|
|
||||||
set => SetPropVector(PropType.Data, "m_vecVelocity", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int WaterLevel
|
|
||||||
{
|
|
||||||
get => GetProp(PropType.Data, "m_nWaterLevel");
|
|
||||||
set => SetProp(PropType.Data, "m_nWaterLevel", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Vector Rotation
|
|
||||||
{
|
|
||||||
get => GetPropVector(PropType.Data, "m_angRotation");
|
|
||||||
set => SetPropVector(PropType.Data, "m_angRotation", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
private int? _index;
|
|
||||||
public int Index
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return _index.Value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public string ClassName => NativeAPI.EntityGetClassname(Index);
|
|
||||||
|
|
||||||
public Vector AbsVelocity
|
|
||||||
{
|
|
||||||
get => GetPropVector(PropType.Data, "m_vecAbsVelocity");
|
|
||||||
set => SetPropVector(PropType.Data, "m_vecAbsVelocity", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Vector AbsOrigin
|
|
||||||
{
|
|
||||||
get => GetPropVector(PropType.Data, "m_vecAbsOrigin");
|
|
||||||
set => SetPropVector(PropType.Data, "m_vecAbsOrigin", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Spawn() => NativeAPI.EntitySpawn(Index);
|
|
||||||
|
|
||||||
public void AcceptInput(string name) => NativeAPI.AcceptInput(Index, name);
|
|
||||||
|
|
||||||
public static BaseEntity Create(string className)
|
|
||||||
{
|
|
||||||
var index = NativeAPI.EntityCreateByClassname(className);
|
|
||||||
if (index < 0) return null;
|
|
||||||
return new BaseEntity(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static BaseEntity FromIndex(int index)
|
|
||||||
{
|
|
||||||
if (index < 0) return null;
|
|
||||||
var entity = new BaseEntity(index);
|
|
||||||
if (!entity.IsValid) return null;
|
|
||||||
return entity;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static BaseEntity FindByClassname(int startIndex, string className)
|
|
||||||
{
|
|
||||||
var index = NativeAPI.EntityFindByClassname(startIndex, className);
|
|
||||||
if (index < 0) return null;
|
|
||||||
return new BaseEntity(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static BaseEntity FindByNetClass(int startIndex, string className)
|
|
||||||
{
|
|
||||||
var index = NativeAPI.EntityFindByNetclass(startIndex, className);
|
|
||||||
if (index < 0) return null;
|
|
||||||
return new BaseEntity(index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Entities.Constants
|
|
||||||
{
|
|
||||||
public enum DamageType
|
|
||||||
{
|
|
||||||
DMG_GENERIC = 0, // generic damage was done
|
|
||||||
DMG_CRUSH = (1 << 0), // crushed by falling or moving object.
|
|
||||||
// = NOTE: It's assumed crush damage is occurring as a result of physics collision, so no extra physics force is generated by crush damage.
|
|
||||||
DMG_BULLET = (1 << 1), // shot
|
|
||||||
DMG_SLASH = (1 << 2), // cut, clawed, stabbed
|
|
||||||
DMG_BURN = (1 << 3), // heat burned
|
|
||||||
DMG_VEHICLE = (1 << 4), // hit by a vehicle
|
|
||||||
DMG_FALL = (1 << 5), // fell too far
|
|
||||||
DMG_BLAST = (1 << 6), // explosive blast damage
|
|
||||||
DMG_CLUB = (1 << 7), // crowbar, punch, headbutt
|
|
||||||
DMG_SHOCK = (1 << 8), // electric shock
|
|
||||||
DMG_SONIC = (1 << 9), // sound pulse shockwave
|
|
||||||
DMG_ENERGYBEAM = (1 << 10), // laser or other high energy beam
|
|
||||||
DMG_PREVENT_PHYSICS_FORCE = (1 << 11), // Prevent a physics force
|
|
||||||
DMG_NEVERGIB = (1 << 12), // with this bit OR'd in, no damage type will be able to gib victims upon death
|
|
||||||
DMG_ALWAYSGIB = (1 << 13), // with this bit OR'd in, any damage type can be made to gib victims upon death.
|
|
||||||
DMG_DROWN = (1 << 14), // Drowning
|
|
||||||
|
|
||||||
DMG_PARALYZE = (1 << 15), // slows affected creature down
|
|
||||||
DMG_NERVEGAS = (1 << 16), // nerve toxins, very bad
|
|
||||||
DMG_POISON = (1 << 17), // blood poisoning - heals over time like drowning damage
|
|
||||||
DMG_RADIATION = (1 << 18), // radiation exposure
|
|
||||||
DMG_DROWNRECOVER = (1 << 19), // drowning recovery
|
|
||||||
DMG_ACID = (1 << 20), // toxic chemicals or acid burns
|
|
||||||
DMG_SLOWBURN = (1 << 21), // in an oven
|
|
||||||
|
|
||||||
DMG_REMOVENORAGDOLL = (1 << 22), // with this bit OR'd in, no ragdoll will be created, and the target will be quietly removed.
|
|
||||||
// = use this to kill an entity that you've already got a server-side ragdoll for
|
|
||||||
|
|
||||||
DMG_PHYSGUN = (1 << 23), // Hit by manipulator. Usually doesn't do any damage.
|
|
||||||
DMG_PLASMA = (1 << 24), // Shot by Cremator
|
|
||||||
DMG_AIRBOAT = (1 << 25), // Hit by the airboat's gun
|
|
||||||
|
|
||||||
DMG_DISSOLVE = (1 << 26), // Dissolving!
|
|
||||||
DMG_BLAST_SURFACE = (1 << 27), // A blast on the surface of water that cannot harm things underwater
|
|
||||||
DMG_DIRECT = (1 << 28),
|
|
||||||
DMG_BUCKSHOT = (1 << 29), // not quite a bullet. Little, rounder, different.
|
|
||||||
DMG_HEADSHOT = (1 << 30)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Entities.Constants
|
|
||||||
{
|
|
||||||
[Flags]
|
|
||||||
public enum EntityFlags
|
|
||||||
{
|
|
||||||
Onground = (1 << 0), // At rest / on the ground
|
|
||||||
Ducking = (1 << 1), // Player flag -- Player is fully crouched
|
|
||||||
Waterjump = (1 << 3), // player jumping out of water
|
|
||||||
Ontrain = (1 << 4), // Player is _controlling_ a train, so movement commands should be ignored on client during prediction.
|
|
||||||
Inrain = (1 << 5), // Indicates the entity is standing in rain
|
|
||||||
Frozen = (1 << 6), // Player is frozen for 3rd person camera
|
|
||||||
Atcontrols = (1 << 7), // Player can't move, but keeps key inputs for controlling another entity
|
|
||||||
Client = (1 << 8), // Is a player
|
|
||||||
Fakeclient = (1 << 9), // Fake client, simulated server side; don't send network messages to them
|
|
||||||
Inwater = (1 << 10), // In water
|
|
||||||
Fly = (1 << 11), // Changes the SV_Movestep() behavior to not need to be on ground
|
|
||||||
Swim = (1 << 12), // Changes the SV_Movestep() behavior to not need to be on ground (but stay in water)
|
|
||||||
Conveyor = (1 << 13),
|
|
||||||
Npc = (1 << 14),
|
|
||||||
Godmode = (1 << 15),
|
|
||||||
Notarget = (1 << 16),
|
|
||||||
Aimtarget = (1 << 17), // set if the crosshair needs to aim onto the entity
|
|
||||||
Partialground = (1 << 18), // not all corners are valid
|
|
||||||
Staticprop = (1 << 19), // Eetsa static prop!
|
|
||||||
Graphed = (1 << 20), // worldgraph has this ent listed as something that blocks a connection
|
|
||||||
Grenade = (1 << 21),
|
|
||||||
Stepmovement = (1 << 22), // Changes the SV_Movestep() behavior to not do any processing
|
|
||||||
Donttouch = (1 << 23), // Doesn't generate touch functions, generates Untouch() for anything it was touching when this flag was set
|
|
||||||
Basevelocity = (1 << 24), // Base velocity has been applied this frame (used to convert base velocity into momentum)
|
|
||||||
Worldbrush = (1 << 25), // Not moveable/removeable brush entity (really part of the world, but represented as an entity for transparency or something)
|
|
||||||
Object = (1 << 26), // Terrible name. This is an object that NPCs should see. Missiles, for example.
|
|
||||||
Killme = (1 << 27), // This entity is marked for death -- will be freed by game DLL
|
|
||||||
Onfire = (1 << 28), // You know...
|
|
||||||
Dissolving = (1 << 29), // We're dissolving!
|
|
||||||
Transragdoll = (1 << 30), // In the process of turning into a client side ragdoll.
|
|
||||||
UnblockableByPlayer = (1 << 31) // pusher that can't be blocked by the player
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Entities.Constants
|
|
||||||
{
|
|
||||||
public enum HitGroup
|
|
||||||
{
|
|
||||||
HITGROUP_GENERIC = 0,
|
|
||||||
HITGROUP_HEAD = 1,
|
|
||||||
HITGROUP_CHEST = 2,
|
|
||||||
HITGROUP_STOMACH = 3,
|
|
||||||
HITGROUP_LEFTARM = 4,
|
|
||||||
HITGROUP_RIGHTARM = 5,
|
|
||||||
HITGROUP_LEFTLEG = 6,
|
|
||||||
HITGROUP_RIGHTLEG = 7,
|
|
||||||
HITGROUP_GEAR = 10,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Entities.Constants
|
|
||||||
{
|
|
||||||
public enum LifeState
|
|
||||||
{
|
|
||||||
LIFE_ALIVE = 0, // alive
|
|
||||||
LIFE_DYING, // playing death animation or still falling off of a ledge waiting to hit ground
|
|
||||||
LIFE_DEAD, // dead. lying still.
|
|
||||||
LIFE_RESPAWNABLE,
|
|
||||||
LIFE_DISCARDBODY,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Entities.Constants
|
|
||||||
{
|
|
||||||
public enum MoveType
|
|
||||||
{
|
|
||||||
MOVETYPE_NONE = 0, // never moves
|
|
||||||
MOVETYPE_ISOMETRIC, // For players -- in TF2 commander view, etc.
|
|
||||||
MOVETYPE_WALK, // Player only - moving on the ground
|
|
||||||
MOVETYPE_STEP, // gravity, special edge handling -- monsters use this
|
|
||||||
MOVETYPE_FLY, // No gravity, but still collides with stuff
|
|
||||||
MOVETYPE_FLYGRAVITY, // flies through the air + is affected by gravity
|
|
||||||
MOVETYPE_VPHYSICS, // uses VPHYSICS for simulation
|
|
||||||
MOVETYPE_PUSH, // no clip to world, push and crush
|
|
||||||
MOVETYPE_NOCLIP, // No gravity, no collisions, still do velocity/avelocity
|
|
||||||
MOVETYPE_LADDER, // Used by players only when going onto a ladder
|
|
||||||
MOVETYPE_OBSERVER, // Observer movement, depends on player's observer mode
|
|
||||||
MOVETYPE_CUSTOM, // Allows the entity to describe its own physics
|
|
||||||
|
|
||||||
// should always be defined as the last item in the list
|
|
||||||
MOVETYPE_LAST = MOVETYPE_CUSTOM,
|
|
||||||
|
|
||||||
MOVETYPE_MAX_BITS = 4
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Entities.Constants
|
|
||||||
{
|
|
||||||
public enum ObserverMode
|
|
||||||
{
|
|
||||||
OBS_MODE_NONE = 0, // not in spectator mode
|
|
||||||
OBS_MODE_DEATHCAM, // special mode for death cam animation
|
|
||||||
OBS_MODE_FREEZECAM, // zooms to a target, and freeze-frames on them
|
|
||||||
OBS_MODE_FIXED, // view from a fixed camera position
|
|
||||||
OBS_MODE_IN_EYE, // follow a player in first person view
|
|
||||||
OBS_MODE_CHASE, // follow a player in third person view
|
|
||||||
OBS_MODE_ROAMING, // free roaming
|
|
||||||
|
|
||||||
NUM_OBSERVER_MODES,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Entities.Constants
|
|
||||||
{
|
|
||||||
enum PLAYER_ANIM
|
|
||||||
{
|
|
||||||
PLAYER_IDLE,
|
|
||||||
PLAYER_WALK,
|
|
||||||
PLAYER_JUMP,
|
|
||||||
PLAYER_SUPERJUMP,
|
|
||||||
PLAYER_DIE,
|
|
||||||
PLAYER_ATTACK1,
|
|
||||||
PLAYER_IN_VEHICLE,
|
|
||||||
|
|
||||||
// TF Player animations
|
|
||||||
PLAYER_RELOAD,
|
|
||||||
PLAYER_START_AIMING,
|
|
||||||
PLAYER_LEAVE_AIMING,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Entities.Constants
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Property types for entity
|
|
||||||
/// </summary>
|
|
||||||
public enum PropType
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Property is networked
|
|
||||||
/// </summary>
|
|
||||||
Send,
|
|
||||||
/// <summary>
|
|
||||||
/// Property is a save data field
|
|
||||||
/// </summary>
|
|
||||||
Data
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Entities.Constants
|
|
||||||
{
|
|
||||||
public enum RenderFx
|
|
||||||
{
|
|
||||||
RENDERFX_NONE = 0,
|
|
||||||
RENDERFX_PULSE_SLOW,
|
|
||||||
RENDERFX_PULSE_FAST,
|
|
||||||
RENDERFX_PULSE_SLOW_WIDE,
|
|
||||||
RENDERFX_PULSE_FAST_WIDE,
|
|
||||||
RENDERFX_FADE_SLOW,
|
|
||||||
RENDERFX_FADE_FAST,
|
|
||||||
RENDERFX_SOLID_SLOW,
|
|
||||||
RENDERFX_SOLID_FAST,
|
|
||||||
RENDERFX_STROBE_SLOW,
|
|
||||||
RENDERFX_STROBE_FAST,
|
|
||||||
RENDERFX_STROBE_FASTER,
|
|
||||||
RENDERFX_FLICKER_SLOW,
|
|
||||||
RENDERFX_FLICKER_FAST,
|
|
||||||
RENDERFX_NO_DISSIPATION,
|
|
||||||
RENDERFX_DISTORT, /**< Distort/scale/translate flicker */
|
|
||||||
RENDERFX_HOLOGRAM, /**< kRenderFxDistort + distance fade */
|
|
||||||
RENDERFX_EXPLODE, /**< Scale up really big! */
|
|
||||||
RENDERFX_GLOWSHELL, /**< Glowing Shell */
|
|
||||||
RENDERFX_CLAMP_MIN_SCALE, /**< Keep this sprite from getting very small (SPRITES only!) */
|
|
||||||
RENDERFX_ENV_RAIN, /**< for environmental rendermode, make rain */
|
|
||||||
RENDERFX_ENV_SNOW, /**< " " " , make snow */
|
|
||||||
RENDERFX_SPOTLIGHT, /**< TEST CODE for experimental spotlight */
|
|
||||||
RENDERFX_RAGDOLL, /**< HACKHACK: TEST CODE for signalling death of a ragdoll character */
|
|
||||||
RENDERFX_PULSE_FAST_WIDER,
|
|
||||||
RENDERFX_MAX
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Entities.Constants
|
|
||||||
{
|
|
||||||
public enum RenderMode
|
|
||||||
{
|
|
||||||
RENDER_NORMAL, /**< src */
|
|
||||||
RENDER_TRANSCOLOR, /**< c*a+dest*(1-a) */
|
|
||||||
RENDER_TRANSTEXTURE, /**< src*a+dest*(1-a) */
|
|
||||||
RENDER_GLOW, /**< src*a+dest -- No Z buffer checks -- Fixed size in screen space */
|
|
||||||
RENDER_TRANSALPHA, /**< src*srca+dest*(1-srca) */
|
|
||||||
RENDER_TRANSADD, /**< src*a+dest */
|
|
||||||
RENDER_ENVIRONMENTAL, /**< not drawn, used for environmental effects */
|
|
||||||
RENDER_TRANSADDFRAMEBLEND, /**< use a fractional frame value to blend between animation frames */
|
|
||||||
RENDER_TRANSALPHAADD, /**< src + dest*(1-a) */
|
|
||||||
RENDER_WORLDGLOW, /**< Same as kRenderGlow but not fixed size in screen space */
|
|
||||||
RENDER_NONE /**< Don't render. */
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Entities.Constants
|
|
||||||
{
|
|
||||||
[Flags]
|
|
||||||
public enum SolidFlags
|
|
||||||
{
|
|
||||||
FSOLID_CUSTOMRAYTEST = 0x0001, // Ignore solid type + always call into the entity for ray tests
|
|
||||||
FSOLID_CUSTOMBOXTEST = 0x0002, // Ignore solid type + always call into the entity for swept box tests
|
|
||||||
FSOLID_NOT_SOLID = 0x0004, // Are we currently not solid?
|
|
||||||
FSOLID_TRIGGER = 0x0008, // This is something may be collideable but fires touch functions
|
|
||||||
// even when it's not collideable (when the FSOLID_NOT_SOLID flag is set)
|
|
||||||
FSOLID_NOT_STANDABLE = 0x0010, // You can't stand on this
|
|
||||||
FSOLID_VOLUME_CONTENTS = 0x0020, // Contains volumetric contents (like water)
|
|
||||||
FSOLID_FORCE_WORLD_ALIGNED = 0x0040, // Forces the collision rep to be world-aligned even if it's SOLID_BSP or SOLID_VPHYSICS
|
|
||||||
FSOLID_USE_TRIGGER_BOUNDS = 0x0080, // Uses a special trigger bounds separate from the normal OBB
|
|
||||||
FSOLID_ROOT_PARENT_ALIGNED = 0x0100, // Collisions are defined in root parent's local coordinate space
|
|
||||||
FSOLID_TRIGGER_TOUCH_DEBRIS = 0x0200, // This trigger will touch debris objects
|
|
||||||
FSOLID_TRIGGER_TOUCH_PLAYER = 0x0400, // This trigger will touch only players
|
|
||||||
FSOLID_NOT_MOVEABLE = 0x0800, // Assume this object will not move
|
|
||||||
|
|
||||||
FSOLID_MAX_BITS = 12
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Entities.Constants
|
|
||||||
{
|
|
||||||
public enum SolidType
|
|
||||||
{
|
|
||||||
SOLID_NONE = 0, // no solid model
|
|
||||||
SOLID_BSP = 1, // a BSP tree
|
|
||||||
SOLID_BBOX = 2, // an AABB
|
|
||||||
SOLID_OBB = 3, // an OBB (not implemented yet)
|
|
||||||
SOLID_OBB_YAW = 4, // an OBB, constrained so that it can only yaw
|
|
||||||
SOLID_CUSTOM = 5, // Always call into the entity for tests
|
|
||||||
SOLID_VPHYSICS = 6, // solid vphysics object, get vcollide from the model and collide with that
|
|
||||||
SOLID_LAST,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Entities.Constants
|
|
||||||
{
|
|
||||||
public enum Team
|
|
||||||
{
|
|
||||||
TEAM_ANY = -1,
|
|
||||||
TEAM_INVALID = 1,
|
|
||||||
TEAM_UNASSIGNED = 0,
|
|
||||||
TEAM_SPECTATOR = 1,
|
|
||||||
TEAM_TERRORIST = 2,
|
|
||||||
TEAM_CT = 3,
|
|
||||||
TEAM_MAXCOUNT = 4,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Players.Constants
|
|
||||||
{
|
|
||||||
public enum NetFlow
|
|
||||||
{
|
|
||||||
FLOW_OUTGOING=0,
|
|
||||||
FLOW_INCOMING=1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,150 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Security.Cryptography;
|
|
||||||
using CounterStrikeSharp.API.Core;
|
|
||||||
using CounterStrikeSharp.API.Modules.Entities;
|
|
||||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Players
|
|
||||||
{
|
|
||||||
public class Player : BaseEntity
|
|
||||||
{
|
|
||||||
public Player(IntPtr pointer) : base(pointer)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public new static Player FromIndex(int index)
|
|
||||||
{
|
|
||||||
var playerBaseEntity = BaseEntity.FromIndex(index);
|
|
||||||
if (playerBaseEntity != null && !NativeAPI.ClientIsInGame(index)) return null;
|
|
||||||
if (playerBaseEntity == null) return null;
|
|
||||||
return new Player(playerBaseEntity.Handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
private PlayerInfo _playerInfo;
|
|
||||||
|
|
||||||
public PlayerInfo PlayerInfo => _playerInfo ??= new PlayerInfo(NativeAPI.PlayerinfoFromIndex(Index));
|
|
||||||
public bool IsAlive => LifeState == (int)Entities.Constants.LifeState.LIFE_ALIVE;
|
|
||||||
|
|
||||||
public ObserverMode ObserverMode
|
|
||||||
{
|
|
||||||
get => (ObserverMode)GetProp(PropType.Send, "m_iObserverMode");
|
|
||||||
set => SetProp(PropType.Send, "m_iObserverMode", (int)value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public PlayerButtons Buttons => (PlayerButtons)GetProp(PropType.Data, "m_nButtons");
|
|
||||||
public IEnumerable<PlayerButtons> SelectedButtons => Buttons.FlagsToList();
|
|
||||||
|
|
||||||
public string Name
|
|
||||||
{
|
|
||||||
get => PlayerInfo.Name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Player ObserverTarget
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
var targetIndex= GetPropEnt(PropType.Send, "m_hObserverTarget")?.Index;
|
|
||||||
return targetIndex != null ? Player.FromIndex(targetIndex.Value) : null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public bool IsScoped
|
|
||||||
{
|
|
||||||
get => GetPropBool(PropType.Send, "m_bIsScoped");
|
|
||||||
set => SetPropBool(PropType.Send, "m_bIsScoped", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public EntityFlags Flags
|
|
||||||
{
|
|
||||||
get => (EntityFlags)GetProp(PropType.Data, "m_fFlags");
|
|
||||||
set => SetProp(PropType.Data, "m_fFlags", (int)value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int LifeState
|
|
||||||
{
|
|
||||||
get => GetProp(PropType.Send, "m_lifeState");
|
|
||||||
set => SetProp(PropType.Send, "m_lifeState", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Vector ViewOffset
|
|
||||||
{
|
|
||||||
get => GetPropVector(PropType.Data, "m_vecViewOffset");
|
|
||||||
set => SetPropVector(PropType.Data, "m_vecViewOffset", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Vector EyeLocation => Origin + ViewOffset;
|
|
||||||
|
|
||||||
public Angle EyeAngle
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var x = GetPropFloat(PropType.Send, "m_angEyeAngles[0]");
|
|
||||||
var y = GetPropFloat(PropType.Send, "m_angEyeAngles[1]");
|
|
||||||
return new Angle(x, y, 0);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Server.PrintToConsole($"Error when retrieving eye angles: {e.Message}, {e.StackTrace}");
|
|
||||||
return new Angle();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Vector ViewVector
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
double yaw = (Math.PI / 180) * EyeAngle.Y;
|
|
||||||
double pitch = (Math.PI / 180) * EyeAngle.X;
|
|
||||||
|
|
||||||
var sy = Math.Sin(yaw);
|
|
||||||
var cy = Math.Cos(yaw);
|
|
||||||
|
|
||||||
var sp = Math.Sin(pitch);
|
|
||||||
var cp = Math.Cos(pitch);
|
|
||||||
|
|
||||||
return new Vector((float)(cp * cy), (float)(cp * sy), (float)-sp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsFakeClient => NativeAPI.IsFakeClient(Index);
|
|
||||||
|
|
||||||
public BaseEntity ActiveWeapon
|
|
||||||
{
|
|
||||||
get => GetPropEnt(PropType.Data, "m_hActiveWeapon");
|
|
||||||
set => SetPropEnt(PropType.Data, "m_hActiveWeapon", value.Index);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Player FromUserId(int userid)
|
|
||||||
{
|
|
||||||
var index = NativeAPI.IndexFromUserid(userid);
|
|
||||||
if (index <= 0) return null;
|
|
||||||
return FromIndex(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void PrintToChat(string message) => NativeAPI.PrintToChat(Index, message);
|
|
||||||
public void PrintToHint(string message) => NativeAPI.PrintToHint(Index, message);
|
|
||||||
public void PrintToCenter(string message) => NativeAPI.PrintToCenter(Index, message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using CounterStrikeSharp.API.Core;
|
|
||||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Players
|
|
||||||
{
|
|
||||||
public class PlayerInfo : NativeObject
|
|
||||||
{
|
|
||||||
internal PlayerInfo(IntPtr cHandle) : base(cHandle)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Name => NativeAPI.PlayerinfoGetName(Handle);
|
|
||||||
|
|
||||||
public int UserId => NativeAPI.PlayerinfoGetUserid(Handle);
|
|
||||||
public string SteamId => NativeAPI.PlayerinfoGetSteamid(Handle);
|
|
||||||
|
|
||||||
public Team Team
|
|
||||||
{
|
|
||||||
get => (Team)NativeAPI.PlayerinfoGetTeam(Handle);
|
|
||||||
set => NativeAPI.PlayerinfoSetTeam(Handle, (int) value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int Kills => NativeAPI.PlayerinfoGetKills(Handle);
|
|
||||||
public int Deaths => NativeAPI.PlayerinfoGetKills(Handle);
|
|
||||||
|
|
||||||
public bool IsConnected => NativeAPI.PlayerinfoIsConnected(Handle);
|
|
||||||
|
|
||||||
public int Armor => NativeAPI.PlayerinfoGetArmor(Handle);
|
|
||||||
public bool IsHLTV => NativeAPI.PlayerinfoIsHltv(Handle);
|
|
||||||
public bool IsPlayer => NativeAPI.PlayerinfoIsPlayer(Handle);
|
|
||||||
public bool IsFakeClient => NativeAPI.PlayerinfoIsFakeclient(Handle);
|
|
||||||
public bool IsDead => NativeAPI.PlayerinfoIsDead(Handle);
|
|
||||||
public bool IsInAVehicle => NativeAPI.PlayerinfoIsInVehicle(Handle);
|
|
||||||
public bool IsObserver => NativeAPI.PlayerinfoIsObserver(Handle);
|
|
||||||
/*public Angle Origin => NativePINVOKE.IPlayerInfo_GetAbsOrigin(Handle).ToObject<Angle>();
|
|
||||||
public Angle Angles => NativePINVOKE.IPlayerInfo_GetAbsAngles(Handle).ToObject<Angle>();
|
|
||||||
public Angle MinSize => NativePINVOKE.IPlayerInfo_GetPlayerMins(Handle).ToObject<Angle>();
|
|
||||||
public Angle MaxSize => NativePINVOKE.IPlayerInfo_GetPlayerMaxs(Handle).ToObject<Angle>();*/
|
|
||||||
public string WeaponName => NativeAPI.PlayerinfoGetWeaponName(Handle);
|
|
||||||
public string ModelName => NativeAPI.PlayerinfoGetModelName(Handle);
|
|
||||||
public int Health => NativeAPI.PlayerinfoGetHealth(Handle);
|
|
||||||
public int MaxHealth => NativeAPI.PlayerinfoGetMaxHealth(Handle);
|
|
||||||
//public CBotCmd LastUserCommand => NativePINVOKE.IPlayerInfo_GetLastUserCommand(Handle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Sound.Constants
|
|
||||||
{
|
|
||||||
public static class SoundAttenuation
|
|
||||||
{
|
|
||||||
public const float ATTN_NONE = 0.0f;
|
|
||||||
public const float ATTN_NORM = 0.8f;
|
|
||||||
public const float ATTN_IDLE = 2.0f;
|
|
||||||
public const float ATTN_STATIC = 1.25f;
|
|
||||||
public const float ATTN_RICOCHET = 1.5f;
|
|
||||||
public const float ATTN_GUNFIRE = 0.27f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Sound.Constants
|
|
||||||
{
|
|
||||||
public enum SoundChannel
|
|
||||||
{
|
|
||||||
CHAN_REPLACE = -1,
|
|
||||||
CHAN_AUTO = 0,
|
|
||||||
CHAN_WEAPON = 1,
|
|
||||||
CHAN_VOICE = 2,
|
|
||||||
CHAN_ITEM = 3,
|
|
||||||
CHAN_BODY = 4,
|
|
||||||
CHAN_STREAM = 5, // allocate stream channel from the static or dynamic area
|
|
||||||
CHAN_STATIC = 6, // allocate channel from the static area
|
|
||||||
CHAN_VOICE_BASE = 7, // allocate channel for network voice data
|
|
||||||
CHAN_USER_BASE = 135
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Sound.Constants
|
|
||||||
{
|
|
||||||
[Flags]
|
|
||||||
public enum SoundFlags
|
|
||||||
{
|
|
||||||
SND_NOFLAGS = 0, // to keep the compiler happy
|
|
||||||
SND_CHANGE_VOL = (1<<0), // change sound vol
|
|
||||||
SND_CHANGE_PITCH = (1<<1), // change sound pitch
|
|
||||||
SND_STOP = (1<<2), // stop the sound
|
|
||||||
SND_SPAWNING = (1<<3), // we're spawning, used in some cases for ambients
|
|
||||||
// not sent over net, only a param between dll and server.
|
|
||||||
SND_DELAY = (1<<4), // sound has an initial delay
|
|
||||||
SND_STOP_LOOPING = (1<<5), // stop all looping sounds on the entity.
|
|
||||||
SND_SPEAKER = (1<<6), // being played again by a microphone through a speaker
|
|
||||||
|
|
||||||
SND_SHOULDPAUSE = (1<<7), // this sound should be paused if the game is paused
|
|
||||||
SND_IGNORE_PHONEMES = (1<<8),
|
|
||||||
SND_IGNORE_NAME = (1<<9), // used to change all sounds emitted by an entity, regardless of scriptname
|
|
||||||
SND_IS_SCRIPTHANDLE = (1<<10), // server has passed the actual SoundEntry instead of wave filename
|
|
||||||
|
|
||||||
SND_UPDATE_DELAY_FOR_CHOREO = (1<<11), // True if we have to update snd_delay_for_choreo with the IO latency.
|
|
||||||
SND_GENERATE_GUID = (1<<12),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Sound.Constants
|
|
||||||
{
|
|
||||||
public enum SoundLevel
|
|
||||||
{
|
|
||||||
SNDLVL_NONE = 0,
|
|
||||||
|
|
||||||
SNDLVL_20dB = 20, // rustling leaves
|
|
||||||
SNDLVL_25dB = 25, // whispering
|
|
||||||
SNDLVL_30dB = 30, // library
|
|
||||||
SNDLVL_35dB = 35,
|
|
||||||
SNDLVL_40dB = 40,
|
|
||||||
SNDLVL_45dB = 45, // refrigerator
|
|
||||||
|
|
||||||
SNDLVL_50dB = 50, // 3.9 // average home
|
|
||||||
SNDLVL_55dB = 55, // 3.0
|
|
||||||
|
|
||||||
SNDLVL_IDLE = 60, // 2.0
|
|
||||||
SNDLVL_60dB = 60, // 2.0 // normal conversation, clothes dryer
|
|
||||||
|
|
||||||
SNDLVL_65dB = 65, // 1.5 // washing machine, dishwasher
|
|
||||||
SNDLVL_STATIC = 66, // 1.25
|
|
||||||
|
|
||||||
SNDLVL_70dB = 70, // 1.0 // car, vacuum cleaner, mixer, electric sewing machine
|
|
||||||
|
|
||||||
SNDLVL_NORM = 75,
|
|
||||||
SNDLVL_75dB = 75, // 0.8 // busy traffic
|
|
||||||
|
|
||||||
SNDLVL_80dB = 80, // 0.7 // mini-bike, alarm clock, noisy restaurant, office tabulator, outboard motor, passing snowmobile
|
|
||||||
SNDLVL_TALKING = 80, // 0.7
|
|
||||||
SNDLVL_85dB = 85, // 0.6 // average factory, electric shaver
|
|
||||||
SNDLVL_90dB = 90, // 0.5 // screaming child, passing motorcycle, convertible ride on frw
|
|
||||||
SNDLVL_95dB = 95,
|
|
||||||
SNDLVL_100dB = 100, // 0.4 // subway train, diesel truck, woodworking shop, pneumatic drill, boiler shop, jackhammer
|
|
||||||
SNDLVL_105dB = 105, // helicopter, power mower
|
|
||||||
SNDLVL_110dB = 110, // snowmobile drvrs seat, inboard motorboat, sandblasting
|
|
||||||
SNDLVL_120dB = 120, // auto horn, propeller aircraft
|
|
||||||
SNDLVL_130dB = 130, // air raid siren
|
|
||||||
|
|
||||||
SNDLVL_GUNFIRE = 140, // 0.27 // THRESHOLD OF PAIN, gunshot, jet engine
|
|
||||||
SNDLVL_140dB = 140, // 0.2
|
|
||||||
|
|
||||||
SNDLVL_150dB = 150, // 0.2
|
|
||||||
|
|
||||||
SNDLVL_180dB = 180, // rocket launching
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Sound.Constants
|
|
||||||
{
|
|
||||||
public static class SoundPitch
|
|
||||||
{
|
|
||||||
public const int PITCH_NORM = 100;
|
|
||||||
public const int PITCH_LOW = 95;
|
|
||||||
public const int PITCH_HIGH = 120;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Sound.Constants
|
|
||||||
{
|
|
||||||
public static class SoundSource
|
|
||||||
{
|
|
||||||
public const int SOUND_FROM_PLAYER = -2;
|
|
||||||
public const int SOUND_FROM_LOCAL_PLAYER = -1;
|
|
||||||
public const int SOUND_FROM_WORLD = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of CounterStrikeSharp.
|
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using CounterStrikeSharp.API.Core;
|
|
||||||
using CounterStrikeSharp.API.Modules.Players;
|
|
||||||
using CounterStrikeSharp.API.Modules.Sound.Constants;
|
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Sound
|
|
||||||
{
|
|
||||||
public static class Sound
|
|
||||||
{
|
|
||||||
public static bool PrecacheSound(string sound) => NativeAPI.PrecacheSound(sound, true);
|
|
||||||
|
|
||||||
public static bool IsSoundPrecached(string sound) => NativeAPI.IsSoundPrecached(sound);
|
|
||||||
|
|
||||||
public static float GetSoundDuration(string sound) => NativeAPI.GetSoundDuration(sound);
|
|
||||||
|
|
||||||
public static void EmitSound(int client,
|
|
||||||
string sound,
|
|
||||||
int entity = SoundSource.SOUND_FROM_PLAYER,
|
|
||||||
SoundChannel channel = SoundChannel.CHAN_AUTO,
|
|
||||||
SoundLevel level = SoundLevel.SNDLVL_NORM,
|
|
||||||
float attenuation = SoundAttenuation.ATTN_NORM,
|
|
||||||
SoundFlags flags = SoundFlags.SND_NOFLAGS,
|
|
||||||
float volume = 1.0f,
|
|
||||||
int pitch = SoundPitch.PITCH_NORM,
|
|
||||||
Vector origin = null,
|
|
||||||
Vector direction = null)
|
|
||||||
{
|
|
||||||
NativeAPI.EmitSound(client, entity, (int) channel, sound, volume, attenuation, (int) flags,
|
|
||||||
pitch, origin?.Handle ?? IntPtr.Zero, direction?.Handle ?? IntPtr.Zero);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void EmitSoundToAll(string sound,
|
|
||||||
int entity = SoundSource.SOUND_FROM_PLAYER,
|
|
||||||
SoundChannel channel = SoundChannel.CHAN_AUTO,
|
|
||||||
SoundLevel level = SoundLevel.SNDLVL_NORM,
|
|
||||||
float attenuation = SoundAttenuation.ATTN_NORM,
|
|
||||||
SoundFlags flags = SoundFlags.SND_NOFLAGS,
|
|
||||||
float volume = 1.0f,
|
|
||||||
int pitch = SoundPitch.PITCH_NORM,
|
|
||||||
Vector origin = null,
|
|
||||||
Vector direction = null)
|
|
||||||
{
|
|
||||||
for (int i = 1; i < 65; i++)
|
|
||||||
{
|
|
||||||
var client = Player.FromIndex(i);
|
|
||||||
if (client?.IsValid == true)
|
|
||||||
{
|
|
||||||
Sound.EmitSound(i, sound, entity, channel, level, attenuation, flags, volume, pitch, origin,
|
|
||||||
direction);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/*
|
/*
|
||||||
* This file is part of CounterStrikeSharp.
|
* This file is part of CounterStrikeSharp.
|
||||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -36,9 +36,12 @@ namespace CounterStrikeSharp.API.Modules.Entities.Constants
|
|||||||
TerroristsSurrender = 0x11u, // this also triggers match cancelled
|
TerroristsSurrender = 0x11u, // this also triggers match cancelled
|
||||||
CTsSurrender = 0x12u, // this also triggers match cancelled
|
CTsSurrender = 0x12u, // this also triggers match cancelled
|
||||||
|
|
||||||
TerroristsPlanned = 0x13u,
|
TerroristsPlanted = 0x13u,
|
||||||
CTsReachedHostage = 0x14u,
|
CTsReachedHostage = 0x14u,
|
||||||
SurvivalWin = 0x15u,
|
SurvivalWin = 0x15u,
|
||||||
SurvivalDraw = 0x16u
|
SurvivalDraw = 0x16u,
|
||||||
|
|
||||||
|
[Obsolete("Use RoundEndReason.TerroristsPlanted instead.")]
|
||||||
|
TerroristsPlanned = 0x13u
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,6 +69,11 @@ public class Schema
|
|||||||
|
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static bool IsSchemaFieldNetworked(string className, string propertyName)
|
||||||
|
{
|
||||||
|
return NativeAPI.IsSchemaFieldNetworked(className, propertyName);
|
||||||
|
}
|
||||||
|
|
||||||
public static T GetSchemaValue<T>(IntPtr handle, string className, string propertyName)
|
public static T GetSchemaValue<T>(IntPtr handle, string className, string propertyName)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -68,6 +68,9 @@ public static class VirtualFunctions
|
|||||||
public static MemoryFunctionVoid<CEntityInstance, CTakeDamageInfo> CBaseEntity_TakeDamageOldFunc = new (GameData.GetSignature("CBaseEntity_TakeDamageOld"));
|
public static MemoryFunctionVoid<CEntityInstance, CTakeDamageInfo> CBaseEntity_TakeDamageOldFunc = new (GameData.GetSignature("CBaseEntity_TakeDamageOld"));
|
||||||
public static Action<CEntityInstance, CTakeDamageInfo> CBaseEntity_TakeDamageOld = CBaseEntity_TakeDamageOldFunc.Invoke;
|
public static Action<CEntityInstance, CTakeDamageInfo> CBaseEntity_TakeDamageOld = CBaseEntity_TakeDamageOldFunc.Invoke;
|
||||||
|
|
||||||
|
public static MemoryFunctionWithReturn<CCSPlayer_WeaponServices, CBasePlayerWeapon, bool> CCSPlayer_WeaponServices_CanUseFunc = new(GameData.GetSignature("CCSPlayer_WeaponServices_CanUse"));
|
||||||
|
public static Func<CCSPlayer_WeaponServices, CBasePlayerWeapon, bool> CCSPlayer_WeaponServices_CanUse = CCSPlayer_WeaponServices_CanUseFunc.Invoke;
|
||||||
|
|
||||||
public static MemoryFunctionVoid<CCSPlayerPawnBase> CCSPlayerPawnBase_PostThinkFunc = new (GameData.GetSignature("CCSPlayerPawnBase_PostThink"));
|
public static MemoryFunctionVoid<CCSPlayerPawnBase> CCSPlayerPawnBase_PostThinkFunc = new (GameData.GetSignature("CCSPlayerPawnBase_PostThink"));
|
||||||
public static Action<CCSPlayerPawnBase> CCSPlayerPawnBase_PostThink = CCSPlayerPawnBase_PostThinkFunc.Invoke;
|
public static Action<CCSPlayerPawnBase> CCSPlayerPawnBase_PostThink = CCSPlayerPawnBase_PostThinkFunc.Invoke;
|
||||||
|
|
||||||
@@ -83,4 +86,12 @@ public static class VirtualFunctions
|
|||||||
|
|
||||||
public static MemoryFunctionVoid<IntPtr, string, IntPtr, IntPtr, string, int> AcceptInputFunc = new(GameData.GetSignature("CEntityInstance_AcceptInput"));
|
public static MemoryFunctionVoid<IntPtr, string, IntPtr, IntPtr, string, int> AcceptInputFunc = new(GameData.GetSignature("CEntityInstance_AcceptInput"));
|
||||||
public static Action<IntPtr, string, IntPtr, IntPtr, string, int> AcceptInput = AcceptInputFunc.Invoke;
|
public static Action<IntPtr, string, IntPtr, IntPtr, string, int> AcceptInput = AcceptInputFunc.Invoke;
|
||||||
|
|
||||||
|
public static MemoryFunctionVoid<IntPtr, IntPtr, int, short, short> StateChangedFunc =
|
||||||
|
new(GameData.GetSignature("StateChanged"));
|
||||||
|
public static Action<IntPtr, IntPtr, int, short, short> StateChanged = StateChangedFunc.Invoke;
|
||||||
|
|
||||||
|
public static MemoryFunctionVoid<IntPtr, int, long> NetworkStateChangedFunc = new("NetworkStateChanged");
|
||||||
|
public static Action<IntPtr, int, long> NetworkStateChanged = NetworkStateChangedFunc.Invoke;
|
||||||
|
|
||||||
}
|
}
|
||||||
139
managed/CounterStrikeSharp.API/Modules/Menu/BaseMenu.cs
Normal file
139
managed/CounterStrikeSharp.API/Modules/Menu/BaseMenu.cs
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of CounterStrikeSharp.
|
||||||
|
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace CounterStrikeSharp.API.Modules.Menu
|
||||||
|
{
|
||||||
|
public abstract class BaseMenu : IMenu
|
||||||
|
{
|
||||||
|
public string Title { get; set; }
|
||||||
|
public List<ChatMenuOption> MenuOptions { get; } = new();
|
||||||
|
|
||||||
|
protected BaseMenu(string title)
|
||||||
|
{
|
||||||
|
Title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual ChatMenuOption AddMenuOption(string display, Action<CCSPlayerController, ChatMenuOption> onSelect, bool disabled = false)
|
||||||
|
{
|
||||||
|
var option = new ChatMenuOption(display, disabled, onSelect);
|
||||||
|
MenuOptions.Add(option);
|
||||||
|
return option;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This must be called ChatMenuOption to maintain backwards compatibility with the old API
|
||||||
|
public class ChatMenuOption
|
||||||
|
{
|
||||||
|
public string Text { get; set; }
|
||||||
|
public bool Disabled { get; set; }
|
||||||
|
public Action<CCSPlayerController, ChatMenuOption> OnSelect { get; set; }
|
||||||
|
|
||||||
|
public ChatMenuOption(string display, bool disabled, Action<CCSPlayerController, ChatMenuOption> onSelect)
|
||||||
|
{
|
||||||
|
Text = display;
|
||||||
|
Disabled = disabled;
|
||||||
|
OnSelect = onSelect;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract class BaseMenuInstance : IMenuInstance
|
||||||
|
{
|
||||||
|
public virtual int NumPerPage => 6;
|
||||||
|
public Stack<int> PrevPageOffsets { get; } = new();
|
||||||
|
public IMenu Menu { get; }
|
||||||
|
public CCSPlayerController Player { get; }
|
||||||
|
|
||||||
|
public int Page { get; set; }
|
||||||
|
public int CurrentOffset { get; set; }
|
||||||
|
|
||||||
|
protected BaseMenuInstance(CCSPlayerController player, IMenu menu)
|
||||||
|
{
|
||||||
|
Menu = menu;
|
||||||
|
Player = player;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected bool HasPrevButton => Page > 0;
|
||||||
|
protected bool HasNextButton => CurrentOffset + NumPerPage < Menu.MenuOptions.Count;
|
||||||
|
protected int MenuItemsPerPage => NumPerPage + 2 - (HasNextButton ? 1 : 0) - (HasPrevButton ? 1 : 0);
|
||||||
|
|
||||||
|
public virtual void Display()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnKeyPress(CCSPlayerController player, int key)
|
||||||
|
{
|
||||||
|
if (player.Handle != Player.Handle) return;
|
||||||
|
|
||||||
|
if (key == 8 && HasNextButton)
|
||||||
|
{
|
||||||
|
NextPage();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key == 7 && HasPrevButton)
|
||||||
|
{
|
||||||
|
PrevPage();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key == 9)
|
||||||
|
{
|
||||||
|
Reset();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var desiredValue = key;
|
||||||
|
|
||||||
|
var menuItemIndex = CurrentOffset + desiredValue - 1;
|
||||||
|
|
||||||
|
if (menuItemIndex >= 0 && menuItemIndex < Menu.MenuOptions.Count)
|
||||||
|
{
|
||||||
|
var menuOption = Menu.MenuOptions[menuItemIndex];
|
||||||
|
|
||||||
|
if (!menuOption.Disabled)
|
||||||
|
{
|
||||||
|
menuOption.OnSelect(Player, menuOption);
|
||||||
|
Reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Reset()
|
||||||
|
{
|
||||||
|
CurrentOffset = 0;
|
||||||
|
Page = 0;
|
||||||
|
PrevPageOffsets.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void NextPage()
|
||||||
|
{
|
||||||
|
PrevPageOffsets.Push(CurrentOffset);
|
||||||
|
CurrentOffset += MenuItemsPerPage;
|
||||||
|
Page++;
|
||||||
|
Display();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PrevPage()
|
||||||
|
{
|
||||||
|
Page--;
|
||||||
|
CurrentOffset = PrevPageOffsets.Pop();
|
||||||
|
Display();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
126
managed/CounterStrikeSharp.API/Modules/Menu/CenterHtmlMenu.cs
Normal file
126
managed/CounterStrikeSharp.API/Modules/Menu/CenterHtmlMenu.cs
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of CounterStrikeSharp.
|
||||||
|
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.Text;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
|
namespace CounterStrikeSharp.API.Modules.Menu
|
||||||
|
{
|
||||||
|
public class CenterHtmlMenu : BaseMenu
|
||||||
|
{
|
||||||
|
public CenterHtmlMenu(string title) : base(ModifyTitle(title))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override ChatMenuOption AddMenuOption(string display, Action<CCSPlayerController, ChatMenuOption> onSelect, bool disabled = false)
|
||||||
|
{
|
||||||
|
var option = new ChatMenuOption(ModifyOptionDisplay(display), disabled, onSelect);
|
||||||
|
MenuOptions.Add(option);
|
||||||
|
return option;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string ModifyTitle(string title)
|
||||||
|
{
|
||||||
|
if (title.Length > 32)
|
||||||
|
{
|
||||||
|
Application.Instance.Logger.LogWarning("Title should not be longer than 32 characters for a CenterHtmlMenu");
|
||||||
|
return title[..32];
|
||||||
|
}
|
||||||
|
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string ModifyOptionDisplay(string display)
|
||||||
|
{
|
||||||
|
if (display.Length > 26)
|
||||||
|
{
|
||||||
|
Application.Instance.Logger.LogWarning("Display should not be longer than 26 characters for a CenterHtmlMenu item");
|
||||||
|
return display[..26];
|
||||||
|
}
|
||||||
|
|
||||||
|
return display;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CenterHtmlMenuInstance : BaseMenuInstance
|
||||||
|
{
|
||||||
|
private readonly BasePlugin _plugin;
|
||||||
|
public override int NumPerPage => 5; // one less than the actual number of items per page to avoid truncated options
|
||||||
|
|
||||||
|
public CenterHtmlMenuInstance(BasePlugin plugin, CCSPlayerController player, IMenu menu) : base(player, menu)
|
||||||
|
{
|
||||||
|
_plugin = plugin;
|
||||||
|
RemoveOnTickListener();
|
||||||
|
plugin.RegisterListener<Core.Listeners.OnTick>(Display);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Display()
|
||||||
|
{
|
||||||
|
if (MenuManager.GetActiveMenu(Player) != this)
|
||||||
|
{
|
||||||
|
Reset();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var builder = new StringBuilder();
|
||||||
|
builder.Append($"<b><font color='yellow'>{Menu.Title}</font></b>");
|
||||||
|
builder.AppendLine("<br>");
|
||||||
|
|
||||||
|
var keyOffset = 1;
|
||||||
|
|
||||||
|
for (var i = CurrentOffset; i < Math.Min(CurrentOffset + MenuItemsPerPage, Menu.MenuOptions.Count); i++)
|
||||||
|
{
|
||||||
|
var option = Menu.MenuOptions[i];
|
||||||
|
string color = option.Disabled ? "grey" : "green";
|
||||||
|
builder.Append($"<font color='{color}'>!{keyOffset++}</font> {option.Text}");
|
||||||
|
builder.AppendLine("<br>");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (HasPrevButton)
|
||||||
|
{
|
||||||
|
builder.AppendFormat("<font color='yellow'>!7</font> <- Prev");
|
||||||
|
builder.AppendLine("<br>");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (HasNextButton)
|
||||||
|
{
|
||||||
|
builder.AppendFormat("<font color='yellow'>!8</font> -> Next");
|
||||||
|
builder.AppendLine("<br>");
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.AppendFormat("<font color='red'>!9</font> -> Close");
|
||||||
|
builder.AppendLine("<br>");
|
||||||
|
|
||||||
|
var currentPageText = builder.ToString();
|
||||||
|
Player.PrintToCenterHtml(currentPageText);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Reset()
|
||||||
|
{
|
||||||
|
base.Reset();
|
||||||
|
RemoveOnTickListener();
|
||||||
|
|
||||||
|
// Send a blank message to clear the menu
|
||||||
|
Player.PrintToCenterHtml(" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RemoveOnTickListener()
|
||||||
|
{
|
||||||
|
var onTick = new Core.Listeners.OnTick(Display);
|
||||||
|
_plugin.RemoveListener("OnTick", onTick);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,164 +1,77 @@
|
|||||||
using System;
|
/*
|
||||||
using System.Collections.Generic;
|
* This file is part of CounterStrikeSharp.
|
||||||
using System.Runtime.InteropServices;
|
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
||||||
using System.Text;
|
* it under the terms of the GNU General Public License as published by
|
||||||
using CounterStrikeSharp.API;
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
using CounterStrikeSharp.API.Core;
|
* (at your option) any later version.
|
||||||
using CounterStrikeSharp.API.Modules.Entities;
|
*
|
||||||
|
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
||||||
|
*/
|
||||||
|
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API.Modules.Menu;
|
namespace CounterStrikeSharp.API.Modules.Menu
|
||||||
|
|
||||||
public class ChatMenuOption
|
|
||||||
{
|
{
|
||||||
public ChatMenuOption(string text, bool disabled, Action<CCSPlayerController, ChatMenuOption> onSelect)
|
public class ChatMenu: BaseMenu
|
||||||
{
|
{
|
||||||
Text = text;
|
public ChatMenu(string title) : base(title)
|
||||||
Disabled = disabled;
|
{
|
||||||
OnSelect = onSelect;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Action<CCSPlayerController, ChatMenuOption> OnSelect { get; set; }
|
public class ChatMenuInstance : BaseMenuInstance
|
||||||
|
|
||||||
public string Text { get; set; }
|
|
||||||
public bool Disabled { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ChatMenu
|
|
||||||
{
|
|
||||||
public string Title { get; set; }
|
|
||||||
public List<ChatMenuOption> MenuOptions { get; } = new();
|
|
||||||
|
|
||||||
public ChatMenu(string title)
|
|
||||||
{
|
{
|
||||||
Title = title;
|
public ChatMenuInstance(CCSPlayerController player, ChatMenu menu) : base(player, menu)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Display()
|
||||||
|
{
|
||||||
|
Player.PrintToChat(Menu.Title);
|
||||||
|
Player.PrintToChat("---");
|
||||||
|
|
||||||
|
var keyOffset = 1;
|
||||||
|
|
||||||
|
for (var i = CurrentOffset;
|
||||||
|
i < Math.Min(CurrentOffset + MenuItemsPerPage, Menu.MenuOptions.Count);
|
||||||
|
i++)
|
||||||
|
{
|
||||||
|
var option = Menu.MenuOptions[i];
|
||||||
|
|
||||||
|
Player.PrintToChat(
|
||||||
|
$" {(option.Disabled ? ChatColors.Grey : ChatColors.Green)} !{keyOffset++} {ChatColors.Default}{option.Text}");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (HasPrevButton)
|
||||||
|
{
|
||||||
|
Player.PrintToChat($" {ChatColors.Yellow}!7 {ChatColors.Default}-> Prev");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (HasNextButton)
|
||||||
|
{
|
||||||
|
Player.PrintToChat($" {ChatColors.Yellow}!8 {ChatColors.Default}-> Next");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ChatMenuOption AddMenuOption(string display, Action<CCSPlayerController, ChatMenuOption> onSelect, bool disabled = false)
|
public static class ChatMenus
|
||||||
{
|
{
|
||||||
var option = new ChatMenuOption(display, disabled, onSelect);
|
[Obsolete("Use MenuManager.OpenChatMenu instead")]
|
||||||
MenuOptions.Add(option);
|
public static void OpenMenu(CCSPlayerController player, ChatMenu menu)
|
||||||
return option;
|
{
|
||||||
|
MenuManager.OpenChatMenu(player, menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Obsolete("Use MenuManager.OnKeyPress instead")]
|
||||||
|
public static void OnKeyPress(CCSPlayerController player, int key)
|
||||||
|
{
|
||||||
|
MenuManager.OnKeyPress(player, key);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ChatMenuInstance
|
|
||||||
{
|
|
||||||
// Six items seems to be able to fit all options in the chat bot without having to open it
|
|
||||||
readonly int _numPerPage = 6;
|
|
||||||
private readonly Stack<int> _prevPageOffsets = new();
|
|
||||||
private readonly ChatMenu _menu;
|
|
||||||
|
|
||||||
int _page = 0;
|
|
||||||
int _currentOffset = 0;
|
|
||||||
private CCSPlayerController _player;
|
|
||||||
|
|
||||||
public ChatMenuInstance(CCSPlayerController player, ChatMenu menu)
|
|
||||||
{
|
|
||||||
_menu = menu;
|
|
||||||
_player = player;
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool HasPrevButton => _page > 0;
|
|
||||||
private bool HasNextButton => (_currentOffset + _numPerPage) < _menu.MenuOptions.Count;
|
|
||||||
private int MenuItemsPerPage => _numPerPage + 2 - (HasNextButton ? 1 : 0) - (HasPrevButton ? 1 : 0);
|
|
||||||
|
|
||||||
public void Display()
|
|
||||||
{
|
|
||||||
_player.PrintToChat(_menu.Title);
|
|
||||||
_player.PrintToChat("---");
|
|
||||||
|
|
||||||
int keyOffset = 1;
|
|
||||||
|
|
||||||
if (HasPrevButton)
|
|
||||||
{
|
|
||||||
_player.PrintToChat($" {ChatColors.Yellow}[!1] {ChatColors.Default}-> Prev");
|
|
||||||
keyOffset++;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = _currentOffset;
|
|
||||||
i < Math.Min(_currentOffset + MenuItemsPerPage, _menu.MenuOptions.Count);
|
|
||||||
i++)
|
|
||||||
{
|
|
||||||
var option = _menu.MenuOptions[i];
|
|
||||||
|
|
||||||
_player.PrintToChat(
|
|
||||||
$" {(option.Disabled ? ChatColors.Grey : ChatColors.Green)} [!{keyOffset++}] {ChatColors.Default}{option.Text}");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (HasNextButton)
|
|
||||||
{
|
|
||||||
_player.PrintToChat($" {ChatColors.Yellow}[!8] {ChatColors.Default}-> Next");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void OnKeyPress(CCSPlayerController player, int key)
|
|
||||||
{
|
|
||||||
if (_player == null || player.Handle != _player.Handle) return;
|
|
||||||
|
|
||||||
if (key == 8 && HasNextButton)
|
|
||||||
{
|
|
||||||
NextPage();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (key == 1 && HasPrevButton)
|
|
||||||
{
|
|
||||||
PrevPage();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var desiredValue = key;
|
|
||||||
if (HasPrevButton) desiredValue = key - 1;
|
|
||||||
|
|
||||||
var menuItemIndex = _currentOffset + desiredValue - 1;
|
|
||||||
var menuOption = _menu.MenuOptions[menuItemIndex];
|
|
||||||
|
|
||||||
if (!menuOption.Disabled)
|
|
||||||
{
|
|
||||||
menuOption.OnSelect(_player, menuOption);
|
|
||||||
Reset();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Reset()
|
|
||||||
{
|
|
||||||
_currentOffset = 0;
|
|
||||||
_page = 0;
|
|
||||||
_prevPageOffsets.Clear();
|
|
||||||
_player = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void NextPage()
|
|
||||||
{
|
|
||||||
_prevPageOffsets.Push(_currentOffset);
|
|
||||||
_currentOffset += MenuItemsPerPage;
|
|
||||||
_page++;
|
|
||||||
Display();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void PrevPage()
|
|
||||||
{
|
|
||||||
_page--;
|
|
||||||
_currentOffset = _prevPageOffsets.Pop();
|
|
||||||
Display();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class ChatMenus
|
|
||||||
{
|
|
||||||
private static readonly Dictionary<IntPtr, ChatMenuInstance> ActiveMenus = new();
|
|
||||||
|
|
||||||
public static void OpenMenu(CCSPlayerController player, ChatMenu menu)
|
|
||||||
{
|
|
||||||
ActiveMenus[player.Handle] = new ChatMenuInstance(player, menu);
|
|
||||||
ActiveMenus[player.Handle].Display();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void OnKeyPress(CCSPlayerController player, int key)
|
|
||||||
{
|
|
||||||
if (!ActiveMenus.ContainsKey(player.Handle)) return;
|
|
||||||
|
|
||||||
ActiveMenus[player.Handle].OnKeyPress(player, key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
60
managed/CounterStrikeSharp.API/Modules/Menu/ConsoleMenu.cs
Normal file
60
managed/CounterStrikeSharp.API/Modules/Menu/ConsoleMenu.cs
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of CounterStrikeSharp.
|
||||||
|
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace CounterStrikeSharp.API.Modules.Menu
|
||||||
|
{
|
||||||
|
public class ConsoleMenu : BaseMenu
|
||||||
|
{
|
||||||
|
public ConsoleMenu(string title) : base(title)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ConsoleMenuInstance : BaseMenuInstance
|
||||||
|
{
|
||||||
|
public ConsoleMenuInstance(CCSPlayerController player, IMenu menu) : base(player, menu)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Display()
|
||||||
|
{
|
||||||
|
Player.PrintToConsole(Menu.Title);
|
||||||
|
Player.PrintToConsole("---");
|
||||||
|
|
||||||
|
var keyOffset = 1;
|
||||||
|
|
||||||
|
for (var i = CurrentOffset;
|
||||||
|
i < Math.Min(CurrentOffset + MenuItemsPerPage, Menu.MenuOptions.Count);
|
||||||
|
i++)
|
||||||
|
{
|
||||||
|
var option = Menu.MenuOptions[i];
|
||||||
|
|
||||||
|
Player.PrintToConsole(
|
||||||
|
$" {(option.Disabled ? "[Enabled]" : "[Disabled] - ")} !{keyOffset++} {option.Text}");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (HasPrevButton)
|
||||||
|
{
|
||||||
|
Player.PrintToConsole($"!7 -> Prev");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (HasNextButton)
|
||||||
|
{
|
||||||
|
Player.PrintToConsole($"!8 -> Next");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
44
managed/CounterStrikeSharp.API/Modules/Menu/IMenu.cs
Normal file
44
managed/CounterStrikeSharp.API/Modules/Menu/IMenu.cs
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of CounterStrikeSharp.
|
||||||
|
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace CounterStrikeSharp.API.Modules.Menu
|
||||||
|
{
|
||||||
|
public interface IMenu
|
||||||
|
{
|
||||||
|
public string Title { get; set; }
|
||||||
|
public List<ChatMenuOption> MenuOptions { get; }
|
||||||
|
|
||||||
|
public ChatMenuOption AddMenuOption(string display, Action<CCSPlayerController, ChatMenuOption> onSelect, bool disabled = false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IMenuInstance
|
||||||
|
{
|
||||||
|
protected IMenu Menu { get; }
|
||||||
|
protected CCSPlayerController? Player { get; }
|
||||||
|
protected int Page { get; }
|
||||||
|
protected int CurrentOffset { get; }
|
||||||
|
protected int NumPerPage { get; }
|
||||||
|
protected Stack<int> PrevPageOffsets { get; }
|
||||||
|
|
||||||
|
public void NextPage();
|
||||||
|
public void PrevPage();
|
||||||
|
public void Reset();
|
||||||
|
public void Display();
|
||||||
|
public void OnKeyPress(CCSPlayerController player, int key);
|
||||||
|
}
|
||||||
|
}
|
||||||
76
managed/CounterStrikeSharp.API/Modules/Menu/MenuManager.cs
Normal file
76
managed/CounterStrikeSharp.API/Modules/Menu/MenuManager.cs
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of CounterStrikeSharp.
|
||||||
|
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* CounterStrikeSharp is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with CounterStrikeSharp. If not, see <https://www.gnu.org/licenses/>. *
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace CounterStrikeSharp.API.Modules.Menu;
|
||||||
|
|
||||||
|
public static class MenuManager
|
||||||
|
{
|
||||||
|
private static readonly Dictionary<IntPtr, IMenuInstance> ActiveMenus = new();
|
||||||
|
|
||||||
|
public static Dictionary<IntPtr, IMenuInstance> GetActiveMenus()
|
||||||
|
{
|
||||||
|
return ActiveMenus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IMenuInstance? GetActiveMenu(CCSPlayerController player)
|
||||||
|
{
|
||||||
|
return !ActiveMenus.TryGetValue(player.Handle, out var value) ? null : value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ResetMenus(CCSPlayerController player)
|
||||||
|
{
|
||||||
|
if (ActiveMenus.TryGetValue(player.Handle, out var activeMenu))
|
||||||
|
{
|
||||||
|
activeMenu.Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
ActiveMenus.Remove(player.Handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void OpenChatMenu(CCSPlayerController player, ChatMenu menu)
|
||||||
|
{
|
||||||
|
ResetMenus(player);
|
||||||
|
|
||||||
|
ActiveMenus[player.Handle] = new ChatMenuInstance(player, menu);
|
||||||
|
ActiveMenus[player.Handle].Display();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void OpenCenterHtmlMenu(BasePlugin plugin, CCSPlayerController player, CenterHtmlMenu menu)
|
||||||
|
{
|
||||||
|
ResetMenus(player);
|
||||||
|
|
||||||
|
ActiveMenus[player.Handle] = new CenterHtmlMenuInstance(plugin, player, menu);
|
||||||
|
ActiveMenus[player.Handle].Display();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void OpenConsoleMenu(CCSPlayerController player, ConsoleMenu menu)
|
||||||
|
{
|
||||||
|
ResetMenus(player);
|
||||||
|
|
||||||
|
ActiveMenus[player.Handle] = new ConsoleMenuInstance(player, menu);
|
||||||
|
ActiveMenus[player.Handle].Display();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void OnKeyPress(CCSPlayerController player, int key)
|
||||||
|
{
|
||||||
|
if (ActiveMenus.TryGetValue(player.Handle, out var activeMenu))
|
||||||
|
{
|
||||||
|
activeMenu.OnKeyPress(player, key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,7 +20,7 @@ public class ChatColors
|
|||||||
{
|
{
|
||||||
public static char Default = '\x01';
|
public static char Default = '\x01';
|
||||||
public static char White = '\x01';
|
public static char White = '\x01';
|
||||||
public static char Darkred = '\x02';
|
public static char DarkRed = '\x02';
|
||||||
public static char Green = '\x04';
|
public static char Green = '\x04';
|
||||||
public static char LightYellow = '\x09';
|
public static char LightYellow = '\x09';
|
||||||
public static char LightBlue = '\x0B';
|
public static char LightBlue = '\x0B';
|
||||||
@@ -39,4 +39,7 @@ public class ChatColors
|
|||||||
public static char Magenta = '\x0E';
|
public static char Magenta = '\x0E';
|
||||||
public static char LightRed = '\x0F';
|
public static char LightRed = '\x0F';
|
||||||
public static char Orange = '\x10';
|
public static char Orange = '\x10';
|
||||||
}
|
|
||||||
|
[Obsolete("Use ChatColors.DarkRed instead.")]
|
||||||
|
public static char Darkred = '\x02';
|
||||||
|
}
|
||||||
|
|||||||
@@ -21,8 +21,10 @@ using System.Linq;
|
|||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using CounterStrikeSharp.API.Core.Logging;
|
||||||
using CounterStrikeSharp.API.Modules.Commands.Targeting;
|
using CounterStrikeSharp.API.Modules.Commands.Targeting;
|
||||||
using CounterStrikeSharp.API.Modules.Entities;
|
using CounterStrikeSharp.API.Modules.Entities;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
namespace CounterStrikeSharp.API
|
namespace CounterStrikeSharp.API
|
||||||
{
|
{
|
||||||
@@ -196,5 +198,38 @@ namespace CounterStrikeSharp.API
|
|||||||
|
|
||||||
return (T)Activator.CreateInstance(typeof(T), pointerTo)!;
|
return (T)Activator.CreateInstance(typeof(T), pointerTo)!;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static int FindSchemaChain(string className) => Schema.GetSchemaOffset(className, "__m_pChainEntity");
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Marks a field as changed for network transmission.
|
||||||
|
/// Not all schema fields are network enabled, so please check the schema before using this.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="entity">Entity to update</param>
|
||||||
|
/// <param name="className" example="CBaseEntity">Schema field class name</param>
|
||||||
|
/// <param name="fieldName" example="m_iHealth">Schema field name</param>
|
||||||
|
/// <param name="extraOffset">Any additional offset to the schema field</param>
|
||||||
|
public static void SetStateChanged(CBaseEntity entity, string className, string fieldName, int extraOffset = 0)
|
||||||
|
{
|
||||||
|
if (!Schema.IsSchemaFieldNetworked(className, fieldName))
|
||||||
|
{
|
||||||
|
Application.Instance.Logger.LogWarning("Field {ClassName}:{FieldName} is not networked, but SetStateChanged was called on it.", className, fieldName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int offset = Schema.GetSchemaOffset(className, fieldName);
|
||||||
|
int chainOffset = FindSchemaChain(className);
|
||||||
|
|
||||||
|
if (chainOffset != 0)
|
||||||
|
{
|
||||||
|
VirtualFunctions.NetworkStateChanged(entity.Handle + chainOffset, offset + extraOffset, 0xFFFFFFFF);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
VirtualFunctions.StateChanged(entity.NetworkTransmitComponent.Handle, entity.Handle, offset + extraOffset, -1, -1);
|
||||||
|
|
||||||
|
entity.LastNetworkChange = Server.CurrentTime;
|
||||||
|
entity.IsSteadyState.Clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -247,11 +247,13 @@ namespace TestPlugin
|
|||||||
// Set player to random colour
|
// Set player to random colour
|
||||||
player.PlayerPawn.Value.Render = Color.FromArgb(Random.Shared.Next(0, 255),
|
player.PlayerPawn.Value.Render = Color.FromArgb(Random.Shared.Next(0, 255),
|
||||||
Random.Shared.Next(0, 255), Random.Shared.Next(0, 255));
|
Random.Shared.Next(0, 255), Random.Shared.Next(0, 255));
|
||||||
|
Utilities.SetStateChanged(player.PlayerPawn.Value, "CBaseModelEntity", "m_clrRender");
|
||||||
|
|
||||||
activeWeapon.ReserveAmmo[0] = 250;
|
activeWeapon.ReserveAmmo[0] = 250;
|
||||||
activeWeapon.Clip1 = 250;
|
activeWeapon.Clip1 = 250;
|
||||||
|
|
||||||
pawn.Health += 5;
|
pawn.Health += 5;
|
||||||
|
Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iHealth");
|
||||||
|
|
||||||
return HookResult.Continue;
|
return HookResult.Continue;
|
||||||
});
|
});
|
||||||
@@ -329,7 +331,7 @@ namespace TestPlugin
|
|||||||
|
|
||||||
private void SetupMenus()
|
private void SetupMenus()
|
||||||
{
|
{
|
||||||
// Chat Menu Example
|
// [Legacy] Chat Menu Example
|
||||||
var largeMenu = new ChatMenu("Test Menu");
|
var largeMenu = new ChatMenu("Test Menu");
|
||||||
for (int i = 1; i < 26; i++)
|
for (int i = 1; i < 26; i++)
|
||||||
{
|
{
|
||||||
@@ -511,6 +513,19 @@ namespace TestPlugin
|
|||||||
entity.AcceptInput("Break");
|
entity.AcceptInput("Break");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[ConsoleCommand("css_fov", "Sets the player's FOV")]
|
||||||
|
[CommandHelper(minArgs: 1, usage: "[fov]")]
|
||||||
|
public void OnFovCommand(CCSPlayerController? player, CommandInfo command)
|
||||||
|
{
|
||||||
|
if (player == null) return;
|
||||||
|
if (!player.PlayerPawn.IsValid) return;
|
||||||
|
|
||||||
|
if (!Int32.TryParse(command.GetArg(1), out var desiredFov)) return;
|
||||||
|
|
||||||
|
player.DesiredFOV = (uint)desiredFov;
|
||||||
|
Utilities.SetStateChanged(player, "CBasePlayerController", "m_iDesiredFOV");
|
||||||
|
}
|
||||||
|
|
||||||
[ConsoleCommand("cssharp_attribute", "This is a custom attribute event")]
|
[ConsoleCommand("cssharp_attribute", "This is a custom attribute event")]
|
||||||
public void OnCommand(CCSPlayerController? player, CommandInfo command)
|
public void OnCommand(CCSPlayerController? player, CommandInfo command)
|
||||||
|
|||||||
@@ -115,7 +115,6 @@ SchemaKey schema::GetOffset(const char* className,
|
|||||||
SchemaKeyValueMap_t* tableMap = schemaTableMap[tableMapIndex];
|
SchemaKeyValueMap_t* tableMap = schemaTableMap[tableMapIndex];
|
||||||
int16_t memberIndex = tableMap->Find(memberKey);
|
int16_t memberIndex = tableMap->Find(memberKey);
|
||||||
if (!tableMap->IsValidIndex(memberIndex)) {
|
if (!tableMap->IsValidIndex(memberIndex)) {
|
||||||
Warning("schema::GetOffset(): '%s' was not found in '%s'!\n", memberName, className);
|
|
||||||
return {0, 0};
|
return {0, 0};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,6 +42,18 @@ int16 GetSchemaOffset(ScriptContext& script_context)
|
|||||||
return m_key.offset;
|
return m_key.offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsSchemaFieldNetworked(ScriptContext& script_context)
|
||||||
|
{
|
||||||
|
auto className = script_context.GetArgument<const char*>(0);
|
||||||
|
auto memberName = script_context.GetArgument<const char*>(1);
|
||||||
|
auto classKey = hash_32_fnv1a_const(className);
|
||||||
|
auto memberKey = hash_32_fnv1a_const(memberName);
|
||||||
|
|
||||||
|
const auto m_key = schema::GetOffset(className, classKey, memberName, memberKey);
|
||||||
|
|
||||||
|
return m_key.networked;
|
||||||
|
}
|
||||||
|
|
||||||
int GetSchemaClassSize(ScriptContext& script_context)
|
int GetSchemaClassSize(ScriptContext& script_context)
|
||||||
{
|
{
|
||||||
auto className = script_context.GetArgument<const char*>(0);
|
auto className = script_context.GetArgument<const char*>(0);
|
||||||
@@ -150,19 +162,6 @@ void SetSchemaValueByName(ScriptContext& script_context)
|
|||||||
auto memberKey = hash_32_fnv1a_const(memberName);
|
auto memberKey = hash_32_fnv1a_const(memberName);
|
||||||
|
|
||||||
const auto m_key = schema::GetOffset(className, classKey, memberName, memberKey);
|
const auto m_key = schema::GetOffset(className, classKey, memberName, memberKey);
|
||||||
const auto m_chain = schema::FindChainOffset(className);
|
|
||||||
|
|
||||||
|
|
||||||
// todo network updates
|
|
||||||
// if (m_chain != 0 && m_key.networked) {
|
|
||||||
// addresses::NetworkStateChanged((uintptr_t)(instancePointer) + m_chain, m_key.offset,
|
|
||||||
// 0xFFFFFFFF);
|
|
||||||
// } else if (m_key.networked) { /* WIP: Works fine for most props, but inlined classes in
|
|
||||||
// the
|
|
||||||
// middle of a class will need to have their this pointer
|
|
||||||
// corrected by the offset .*/
|
|
||||||
// CALL_VIRTUAL(void, 1, instancePointer, m_key.offset, 0xFFFFFFFF, 0xFFFF);
|
|
||||||
// }
|
|
||||||
|
|
||||||
switch (dataType) {
|
switch (dataType) {
|
||||||
case DATA_TYPE_BOOL:
|
case DATA_TYPE_BOOL:
|
||||||
@@ -239,6 +238,7 @@ void SetSchemaValueByName(ScriptContext& script_context)
|
|||||||
|
|
||||||
REGISTER_NATIVES(schema, {
|
REGISTER_NATIVES(schema, {
|
||||||
ScriptEngine::RegisterNativeHandler("GET_SCHEMA_OFFSET", GetSchemaOffset);
|
ScriptEngine::RegisterNativeHandler("GET_SCHEMA_OFFSET", GetSchemaOffset);
|
||||||
|
ScriptEngine::RegisterNativeHandler("IS_SCHEMA_FIELD_NETWORKED", IsSchemaFieldNetworked);
|
||||||
ScriptEngine::RegisterNativeHandler("GET_SCHEMA_VALUE_BY_NAME", GetSchemaValueByName);
|
ScriptEngine::RegisterNativeHandler("GET_SCHEMA_VALUE_BY_NAME", GetSchemaValueByName);
|
||||||
ScriptEngine::RegisterNativeHandler("SET_SCHEMA_VALUE_BY_NAME", SetSchemaValueByName);
|
ScriptEngine::RegisterNativeHandler("SET_SCHEMA_VALUE_BY_NAME", SetSchemaValueByName);
|
||||||
ScriptEngine::RegisterNativeHandler("GET_SCHEMA_CLASS_SIZE", GetSchemaClassSize);
|
ScriptEngine::RegisterNativeHandler("GET_SCHEMA_CLASS_SIZE", GetSchemaClassSize);
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
GET_SCHEMA_OFFSET: className:string, propName:string -> short
|
GET_SCHEMA_OFFSET: className:string, propName:string -> short
|
||||||
|
IS_SCHEMA_FIELD_NETWORKED: className:string, propName:string -> bool
|
||||||
GET_SCHEMA_VALUE_BY_NAME: instance:pointer, returnType:int, className:string, propName:string -> any
|
GET_SCHEMA_VALUE_BY_NAME: instance:pointer, returnType:int, className:string, propName:string -> any
|
||||||
SET_SCHEMA_VALUE_BY_NAME: instance:pointer, returnType:int, className:string, propName:string, value:any -> void
|
SET_SCHEMA_VALUE_BY_NAME: instance:pointer, returnType:int, className:string, propName:string, value:any -> void
|
||||||
GET_SCHEMA_CLASS_SIZE: className:string -> int
|
GET_SCHEMA_CLASS_SIZE: className:string -> int
|
||||||
Reference in New Issue
Block a user