mirror of
https://github.com/roflmuffin/CounterStrikeSharp.git
synced 2025-12-06 08:03:12 -08:00
Compare commits
24 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4f805b18e2 | ||
|
|
e1f9b5635e | ||
|
|
59bff4f500 | ||
|
|
a2581d8e91 | ||
|
|
e7d190a6f7 | ||
|
|
5513d5710a | ||
|
|
e5c223699c | ||
|
|
fa37c222d9 | ||
|
|
3b633fafc7 | ||
|
|
765c56a38a | ||
|
|
204850fb55 | ||
|
|
bac31b9190 | ||
|
|
289f95a6b7 | ||
|
|
7b45a884d4 | ||
|
|
6ea6d0a22d | ||
|
|
12523455c0 | ||
|
|
db63fdc00c | ||
|
|
57747f2e1c | ||
|
|
66b5f77a2d | ||
|
|
8dbcb6d531 | ||
|
|
2f0d34b271 | ||
|
|
2a59544fbc | ||
|
|
f80f2ae949 | ||
|
|
f68a0abc61 |
15
.github/workflows/discord-notify.yml
vendored
Normal file
15
.github/workflows/discord-notify.yml
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
name: Notify Discord on Release
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
notify:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Send Notification to Discord
|
||||
uses: Ilshidur/action-discord@2.4.0
|
||||
with:
|
||||
args: "A new release of CS# has been tagged! View it here: ${{ github.event.release.html_url }}"
|
||||
webhook: ${{ secrets.DISCORD_WEBHOOK }}
|
||||
@@ -18,6 +18,7 @@ SET(SOURCE_FILES
|
||||
src/mm_plugin.h
|
||||
libraries/hl2sdk-cs2/tier1/convar.cpp
|
||||
libraries/hl2sdk-cs2/tier1/generichash.cpp
|
||||
libraries/hl2sdk-cs2/entity2/entityidentity.cpp
|
||||
libraries/hl2sdk-cs2/entity2/entitysystem.cpp
|
||||
libraries/dotnet/hostfxr.h
|
||||
libraries/dotnet/coreclr_delegates.h
|
||||
|
||||
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"
|
||||
}
|
||||
},
|
||||
"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": {
|
||||
"offsets": {
|
||||
"windows": 18,
|
||||
@@ -82,7 +89,7 @@
|
||||
},
|
||||
"CCSPlayer_ItemServices_RemoveWeapons": {
|
||||
"offsets": {
|
||||
"windows": 21,
|
||||
"windows": 19,
|
||||
"linux": 20
|
||||
}
|
||||
},
|
||||
@@ -113,6 +120,13 @@
|
||||
"linux": "\\x48\\x85\\xFF\\x74\\x4B\\x55\\x48\\x89\\xE5\\x41\\x56"
|
||||
}
|
||||
},
|
||||
"CEntityInstance_AcceptInput": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
"windows": "\\x48\\x89\\x5C\\x24\\x10\\x48\\x89\\x74\\x24\\x18\\x57\\x48\\x83\\xEC\\x40\\x49\\x8B\\xF0",
|
||||
"linux": "\\x55\\x48\\x89\\xE5\\x41\\x57\\x49\\x89\\xFF\\x41\\x56\\x48\\x8D\\x7D\\xC0"
|
||||
}
|
||||
},
|
||||
"LegacyGameEventListener": {
|
||||
"signatures": {
|
||||
"library": "server",
|
||||
@@ -160,6 +174,20 @@
|
||||
"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": {
|
||||
"offsets": {
|
||||
"windows": 88,
|
||||
|
||||
@@ -20,7 +20,7 @@ If you're more of a visual person, here is a <a href="https://www.youtube.com/wa
|
||||
3. Create a new line underneath `Game_LowViolence csgo_lv` and add `Game csgo/addons/metamod`.
|
||||
4. Restart your game server.
|
||||
|
||||
Your `gameinfo.gi` should look like <a href="images/gameinfogi-example.png" target="_blank">this</a>. Type `meta list` in your server console to see if Metamod is loaded.
|
||||
Your `gameinfo.gi` should look like <a href="../../images/gameinfogi-example.png" target="_blank">this</a>. Type `meta list` in your server console to see if Metamod is loaded.
|
||||
|
||||
## Installing CounterStrikeSharp
|
||||
|
||||
|
||||
Submodule libraries/hl2sdk-cs2 updated: 9363452257...2f9dd2e61a
@@ -14,8 +14,11 @@ set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING
|
||||
# TODO: Use C++20 instead.
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
|
||||
Set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
||||
Set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
|
||||
if (LINUX)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
|
||||
endif()
|
||||
|
||||
set(CMAKE_STATIC_LIBRARY_PREFIX "")
|
||||
|
||||
set(SOURCESDK_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libraries/hl2sdk-cs2)
|
||||
@@ -51,8 +54,4 @@ include_directories(
|
||||
libraries
|
||||
)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/metamod/configure_metamod.cmake)
|
||||
|
||||
if (LINUX)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
||||
endif()
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/metamod/configure_metamod.cmake)
|
||||
@@ -27,9 +27,9 @@ public class AdminTests
|
||||
{
|
||||
var adminData = AdminManager.GetPlayerAdminData((SteamID)76561197960265731);
|
||||
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);
|
||||
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]
|
||||
|
||||
BIN
managed/CounterStrikeSharp.API/ApiCompat/v151.dll
Normal file
BIN
managed/CounterStrikeSharp.API/ApiCompat/v151.dll
Normal file
Binary file not shown.
@@ -312,6 +312,16 @@ namespace CounterStrikeSharp.API.Core
|
||||
}
|
||||
}
|
||||
|
||||
public static int GetMaxClients(){
|
||||
lock (ScriptContext.GlobalScriptContext.Lock) {
|
||||
ScriptContext.GlobalScriptContext.Reset();
|
||||
ScriptContext.GlobalScriptContext.SetIdentifier(0x5DF2E20D);
|
||||
ScriptContext.GlobalScriptContext.Invoke();
|
||||
ScriptContext.GlobalScriptContext.CheckErrors();
|
||||
return (int)ScriptContext.GlobalScriptContext.GetResult(typeof(int));
|
||||
}
|
||||
}
|
||||
|
||||
public static void IssueServerCommand(string command){
|
||||
lock (ScriptContext.GlobalScriptContext.Lock) {
|
||||
ScriptContext.GlobalScriptContext.Reset();
|
||||
@@ -1064,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){
|
||||
lock (ScriptContext.GlobalScriptContext.Lock) {
|
||||
ScriptContext.GlobalScriptContext.Reset();
|
||||
|
||||
@@ -85,11 +85,12 @@ namespace CounterStrikeSharp.API.Core
|
||||
|
||||
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;
|
||||
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 "load":
|
||||
{
|
||||
if (info.ArgCount < 2)
|
||||
if (info.ArgCount < 3)
|
||||
{
|
||||
info.ReplyToCommand(
|
||||
"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)
|
||||
{
|
||||
info.ReplyToCommand($"Could not load plugin \"{path}\")", true);
|
||||
Logger.LogError(e, "Could not load plugin \"{Path}\"", path);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -195,7 +197,7 @@ namespace CounterStrikeSharp.API.Core
|
||||
case "stop":
|
||||
case "unload":
|
||||
{
|
||||
if (info.ArgCount < 2)
|
||||
if (info.ArgCount < 3)
|
||||
{
|
||||
info.ReplyToCommand(
|
||||
"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 "reload":
|
||||
{
|
||||
if (info.ArgCount < 2)
|
||||
if (info.ArgCount < 3)
|
||||
{
|
||||
info.ReplyToCommand(
|
||||
"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_plugins", "Counter-Strike Sharp plugin options.",
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
public CsTeam Team => (CsTeam)this.TeamNum;
|
||||
|
||||
public IntPtr GiveNamedItem(string item)
|
||||
{
|
||||
@@ -261,4 +263,4 @@ public partial class CCSPlayerController
|
||||
NativeAPI.SetClientVoiceFlags(Handle, (Byte)value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,6 +58,24 @@ public partial class CEntityInstance : IEquatable<CEntityInstance>
|
||||
{
|
||||
return !Equals(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calls a named input method on an entity.
|
||||
/// <example>
|
||||
/// <code>
|
||||
/// entity.AcceptInput("Break");
|
||||
/// </code>
|
||||
/// </example>
|
||||
/// </summary>
|
||||
/// <param name="inputName">Input action name</param>
|
||||
/// <param name="activator">Entity which initiated the action, <see langword="null"/> for no entity</param>
|
||||
/// <param name="caller">Entity that is sending the event, <see langword="null"/> for no entity</param>
|
||||
/// <param name="value">String variant value to send with the event</param>
|
||||
/// <param name="outputId">Unknown, defaults to 0</param>
|
||||
public void AcceptInput(string inputName, CEntityInstance? activator = null, CEntityInstance? caller = null, string value = "", int outputId = 0)
|
||||
{
|
||||
VirtualFunctions.AcceptInput(Handle, inputName, activator?.Handle ?? IntPtr.Zero, caller?.Handle ?? IntPtr.Zero, value, 0);
|
||||
}
|
||||
}
|
||||
|
||||
public partial class CEntityIdentity
|
||||
|
||||
@@ -4,9 +4,8 @@
|
||||
<EnableDynamicLoading>true</EnableDynamicLoading>
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
<EnablePackageValidation>true</EnablePackageValidation>
|
||||
<NoWarn>$(NoWarn);CS1591</NoWarn>
|
||||
<NoWarn>$(NoWarn);CS1591;CP0003</NoWarn>
|
||||
<Nullable>enable</Nullable>
|
||||
|
||||
<Authors>Roflmuffin</Authors>
|
||||
<Description>Official server side runtime assembly for CounterStrikeSharp</Description>
|
||||
<PackageProjectUrl>http://docs.cssharp.dev/</PackageProjectUrl>
|
||||
@@ -16,6 +15,10 @@
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ApiCompatValidateAssemblies>true</ApiCompatValidateAssemblies>
|
||||
<ApiCompatContractAssembly>.\ApiCompat\v151.dll</ApiCompatContractAssembly>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<None Remove="Modules\Commands\CommandInfo" />
|
||||
<None Remove="Modules\Disabled\**" />
|
||||
@@ -23,6 +26,7 @@
|
||||
<ItemGroup>
|
||||
<PackageReference Include="McMaster.NETCore.Plugins" Version="1.4.0" />
|
||||
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
|
||||
<PackageReference Include="Microsoft.DotNet.ApiCompat.Task" Version="7.0.404" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="7.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="7.0.3" />
|
||||
|
||||
@@ -95,7 +95,7 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
||||
// 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.
|
||||
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);
|
||||
if (playerData == null) return false;
|
||||
@@ -136,20 +136,20 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
||||
return playerData.Groups.IsSupersetOf(playerGroups);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a player to a group.
|
||||
/// </summary>
|
||||
/// <param name="player">Player controller.</param>
|
||||
/// <param name="groups">Groups to add the player to.</param>
|
||||
public static void AddPlayerToGroup(CCSPlayerController? player, params string[] groups)
|
||||
/// <summary>
|
||||
/// Adds a player to a group. This does NOT modify the immunity of the player (see SetPlayerImmunity).
|
||||
/// </summary>
|
||||
/// <param name="player">Player controller.</param>
|
||||
/// <param name="groups">Groups to add the player to.</param>
|
||||
public static void AddPlayerToGroup(CCSPlayerController? player, params string[] groups)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
/// <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>
|
||||
/// <param name="steamId">SteamID of the player.</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)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -167,22 +167,43 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Grabs the admin data for a player that was loaded from "configs/admins.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)
|
||||
/// <summary>
|
||||
/// Grabs the admin data for a player that was loaded from "configs/admins.json" and "configs/admins_groups.json".
|
||||
/// </summary>
|
||||
/// <param name="player">Player controller</param>
|
||||
/// <returns>AdminData class if data found, null if not.</returns>
|
||||
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;
|
||||
return Admins.GetValueOrDefault(steamId);
|
||||
}
|
||||
|
||||
/// <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)
|
||||
/// <summary>
|
||||
/// Removes a players admin data. This is not saved to "configs/admins.json"
|
||||
/// </summary>
|
||||
/// <param name="player">Player controller</param>
|
||||
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;
|
||||
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.
|
||||
// The server console should have access to all commands, regardless of permissions.
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -260,7 +281,7 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
||||
// 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.
|
||||
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);
|
||||
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.
|
||||
// The server console should have access to all commands, regardless of permissions.
|
||||
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);
|
||||
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.
|
||||
// The server console should have access to all commands, regardless of permissions.
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -362,7 +383,7 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
||||
public static void AddPlayerPermissions(CCSPlayerController? player, params string[] flags)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -400,7 +421,7 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
||||
public static void RemovePlayerPermissions(CCSPlayerController? player, params string[] flags)
|
||||
{
|
||||
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);
|
||||
}
|
||||
@@ -427,7 +448,7 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
||||
public static void ClearPlayerPermissions(CCSPlayerController? player)
|
||||
{
|
||||
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);
|
||||
}
|
||||
@@ -457,7 +478,7 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
||||
public static void SetPlayerImmunity(CCSPlayerController? player, uint value)
|
||||
{
|
||||
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);
|
||||
}
|
||||
@@ -477,13 +498,44 @@ namespace CounterStrikeSharp.API.Modules.Admin
|
||||
Admins[steamId] = data;
|
||||
}
|
||||
|
||||
/// <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)
|
||||
/// <summary>
|
||||
/// Returns the immunity value for a player.
|
||||
/// </summary>
|
||||
/// <param name="player">Player controller.</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(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.
|
||||
if (caller == null) return true;
|
||||
|
||||
@@ -90,11 +90,11 @@ public class Target
|
||||
case TargetType.TeamSpec:
|
||||
return player.TeamNum == (byte)CsTeam.Spectator;
|
||||
case TargetType.GroupAll:
|
||||
return true;
|
||||
return !player.IsHLTV;
|
||||
case TargetType.GroupBots:
|
||||
return player.IsBot;
|
||||
case TargetType.GroupHumans:
|
||||
return !player.IsBot;
|
||||
return !player.IsBot && !player.IsHLTV;
|
||||
case TargetType.GroupAlive:
|
||||
return player.PlayerPawn is { IsValid: true, Value.LifeState: (byte)LifeState_t.LIFE_ALIVE };
|
||||
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.
|
||||
* CounterStrikeSharp is free software: you can redistribute it and/or modify
|
||||
* 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
|
||||
CTsSurrender = 0x12u, // this also triggers match cancelled
|
||||
|
||||
TerroristsPlanned = 0x13u,
|
||||
TerroristsPlanted = 0x13u,
|
||||
CTsReachedHostage = 0x14u,
|
||||
SurvivalWin = 0x15u,
|
||||
SurvivalDraw = 0x16u
|
||||
SurvivalDraw = 0x16u,
|
||||
|
||||
[Obsolete("Use RoundEndReason.TerroristsPlanted instead.")]
|
||||
TerroristsPlanned = 0x13u
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,8 +76,7 @@ namespace CounterStrikeSharp.API.Modules.Events
|
||||
SetInt(name, i);
|
||||
break;
|
||||
case var _ when value is CCSPlayerController player:
|
||||
// When I was testing this, the code seems to expect a slot, even though it is called index
|
||||
SetEntityIndex(name, (int)player.Index - 1);
|
||||
NativeAPI.SetEventPlayerController(Handle, name, player.Handle);
|
||||
break;
|
||||
case var _ when value is string s:
|
||||
SetString(name, s);
|
||||
|
||||
@@ -69,6 +69,11 @@ public class Schema
|
||||
|
||||
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)
|
||||
{
|
||||
|
||||
@@ -68,6 +68,9 @@ public static class VirtualFunctions
|
||||
public static MemoryFunctionVoid<CEntityInstance, CTakeDamageInfo> CBaseEntity_TakeDamageOldFunc = new (GameData.GetSignature("CBaseEntity_TakeDamageOld"));
|
||||
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 Action<CCSPlayerPawnBase> CCSPlayerPawnBase_PostThink = CCSPlayerPawnBase_PostThinkFunc.Invoke;
|
||||
|
||||
@@ -80,4 +83,15 @@ public static class VirtualFunctions
|
||||
public static MemoryFunctionVoid<IntPtr, IntPtr> RemovePlayerItemFunc =
|
||||
new(GameData.GetSignature("CBasePlayerPawn_RemovePlayerItem"));
|
||||
public static Action<IntPtr, IntPtr> RemovePlayerItemVirtual = RemovePlayerItemFunc.Invoke;
|
||||
|
||||
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 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;
|
||||
|
||||
}
|
||||
140
managed/CounterStrikeSharp.API/Modules/Menu/BaseMenu.cs
Normal file
140
managed/CounterStrikeSharp.API/Modules/Menu/BaseMenu.cs
Normal file
@@ -0,0 +1,140 @@
|
||||
/*
|
||||
* 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 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 == 1 && HasPrevButton)
|
||||
{
|
||||
PrevPage();
|
||||
return;
|
||||
}
|
||||
|
||||
if (key == 9)
|
||||
{
|
||||
Reset();
|
||||
return;
|
||||
}
|
||||
|
||||
var desiredValue = key;
|
||||
if (HasPrevButton) desiredValue = key - 1;
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
125
managed/CounterStrikeSharp.API/Modules/Menu/CenterHtmlMenu.cs
Normal file
125
managed/CounterStrikeSharp.API/Modules/Menu/CenterHtmlMenu.cs
Normal file
@@ -0,0 +1,125 @@
|
||||
/*
|
||||
* 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 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;
|
||||
|
||||
if (HasPrevButton)
|
||||
{
|
||||
builder.AppendFormat("<font color='green'>!1</font> -> Prev");
|
||||
builder.AppendLine("<br>");
|
||||
keyOffset++;
|
||||
}
|
||||
|
||||
for (var i = CurrentOffset; i < Math.Min(CurrentOffset + MenuItemsPerPage, Menu.MenuOptions.Count); i++)
|
||||
{
|
||||
var option = Menu.MenuOptions[i];
|
||||
builder.Append($"<font color='green'>!{keyOffset++}</font> {option.Text}");
|
||||
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,78 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
/*
|
||||
* 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 CounterStrikeSharp.API.Modules.Utils;
|
||||
|
||||
namespace CounterStrikeSharp.API.Modules.Menu;
|
||||
|
||||
public class ChatMenuOption
|
||||
namespace CounterStrikeSharp.API.Modules.Menu
|
||||
{
|
||||
public ChatMenuOption(string text, bool disabled, Action<CCSPlayerController, ChatMenuOption> onSelect)
|
||||
public class ChatMenu: BaseMenu
|
||||
{
|
||||
Text = text;
|
||||
Disabled = disabled;
|
||||
OnSelect = onSelect;
|
||||
public ChatMenu(string title) : base(title)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
public Action<CCSPlayerController, ChatMenuOption> OnSelect { get; set; }
|
||||
|
||||
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)
|
||||
public class ChatMenuInstance : BaseMenuInstance
|
||||
{
|
||||
Title = title;
|
||||
public ChatMenuInstance(CCSPlayerController player, ChatMenu menu) : base(player, menu)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Display()
|
||||
{
|
||||
Player.PrintToChat(Menu.Title);
|
||||
Player.PrintToChat("---");
|
||||
|
||||
var keyOffset = 1;
|
||||
|
||||
if (HasPrevButton)
|
||||
{
|
||||
Player.PrintToChat($" {ChatColors.Yellow}!1 {ChatColors.Default}-> Prev");
|
||||
keyOffset++;
|
||||
}
|
||||
|
||||
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 (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);
|
||||
MenuOptions.Add(option);
|
||||
return option;
|
||||
[Obsolete("Use MenuManager.OpenChatMenu instead")]
|
||||
public static void OpenMenu(CCSPlayerController player, ChatMenu menu)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
61
managed/CounterStrikeSharp.API/Modules/Menu/ConsoleMenu.cs
Normal file
61
managed/CounterStrikeSharp.API/Modules/Menu/ConsoleMenu.cs
Normal file
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* 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;
|
||||
|
||||
if (HasPrevButton)
|
||||
{
|
||||
Player.PrintToConsole($"!1 -> Prev");
|
||||
keyOffset++;
|
||||
}
|
||||
|
||||
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 (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 White = '\x01';
|
||||
public static char Darkred = '\x02';
|
||||
public static char DarkRed = '\x02';
|
||||
public static char Green = '\x04';
|
||||
public static char LightYellow = '\x09';
|
||||
public static char LightBlue = '\x0B';
|
||||
@@ -39,4 +39,7 @@ public class ChatColors
|
||||
public static char Magenta = '\x0E';
|
||||
public static char LightRed = '\x0F';
|
||||
public static char Orange = '\x10';
|
||||
}
|
||||
|
||||
[Obsolete("Use ChatColors.DarkRed instead.")]
|
||||
public static char Darkred = '\x02';
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ namespace CounterStrikeSharp.API
|
||||
|
||||
public static string GameDirectory => NativeAPI.GetGameDirectory();
|
||||
|
||||
public static int MaxPlayers => NativeAPI.GetCommandParamValue("-maxplayers", DataType.DATA_TYPE_INT, 64);
|
||||
public static int MaxPlayers => NativeAPI.GetMaxClients();
|
||||
|
||||
public static bool IsMapValid(string mapName) => NativeAPI.IsMapValid(mapName);
|
||||
|
||||
|
||||
@@ -21,8 +21,10 @@ using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using CounterStrikeSharp.API.Core.Logging;
|
||||
using CounterStrikeSharp.API.Modules.Commands.Targeting;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace CounterStrikeSharp.API
|
||||
{
|
||||
@@ -115,7 +117,7 @@ namespace CounterStrikeSharp.API
|
||||
var pEntity = new CEntityIdentity(EntitySystem.FirstActiveEntity);
|
||||
for (; pEntity != null && pEntity.Handle != IntPtr.Zero; pEntity = pEntity.Next)
|
||||
{
|
||||
if (!pEntity.DesignerName.Contains(designerName)) continue;
|
||||
if (pEntity.DesignerName == null || !pEntity.DesignerName.Contains(designerName)) continue;
|
||||
yield return new PointerTo<T>(pEntity.Handle).Value;
|
||||
}
|
||||
}
|
||||
@@ -136,9 +138,9 @@ namespace CounterStrikeSharp.API
|
||||
{
|
||||
List<CCSPlayerController> players = new();
|
||||
|
||||
for (int i = 1; i <= Server.MaxPlayers; i++)
|
||||
for (int i = 0; i < Server.MaxPlayers; i++)
|
||||
{
|
||||
var controller = GetPlayerFromIndex(i);
|
||||
var controller = GetPlayerFromSlot(i);
|
||||
|
||||
if (!controller.IsValid || controller.UserId == -1)
|
||||
continue;
|
||||
@@ -196,5 +198,38 @@ namespace CounterStrikeSharp.API
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -83,8 +83,6 @@ namespace TestPlugin
|
||||
Logger.LogInformation(
|
||||
$"Test Plugin has been loaded, and the hot reload flag was {hotReload}, path is {ModulePath}");
|
||||
|
||||
Logger.LogWarning($"Max Players: {Server.MaxPlayers}");
|
||||
|
||||
VirtualFunctions.SwitchTeamFunc.Hook(hook =>
|
||||
{
|
||||
Logger.LogInformation("Switch team func called");
|
||||
@@ -249,11 +247,13 @@ namespace TestPlugin
|
||||
// Set player to random colour
|
||||
player.PlayerPawn.Value.Render = Color.FromArgb(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.Clip1 = 250;
|
||||
|
||||
pawn.Health += 5;
|
||||
Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iHealth");
|
||||
|
||||
return HookResult.Continue;
|
||||
});
|
||||
@@ -331,7 +331,7 @@ namespace TestPlugin
|
||||
|
||||
private void SetupMenus()
|
||||
{
|
||||
// Chat Menu Example
|
||||
// [Legacy] Chat Menu Example
|
||||
var largeMenu = new ChatMenu("Test Menu");
|
||||
for (int i = 1; i < 26; i++)
|
||||
{
|
||||
@@ -503,6 +503,30 @@ namespace TestPlugin
|
||||
player.Respawn();
|
||||
}
|
||||
|
||||
[ConsoleCommand("css_break", "Breaks the breakable entities")]
|
||||
public void OnBreakCommand(CCSPlayerController? player, CommandInfo command)
|
||||
{
|
||||
var entities = Utilities.FindAllEntitiesByDesignerName<CBreakable>("prop_dynamic")
|
||||
.Concat(Utilities.FindAllEntitiesByDesignerName<CBreakable>("func_breakable"));
|
||||
foreach (var entity in entities)
|
||||
{
|
||||
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")]
|
||||
public void OnCommand(CCSPlayerController? player, CommandInfo command)
|
||||
{
|
||||
|
||||
@@ -115,7 +115,6 @@ SchemaKey schema::GetOffset(const char* className,
|
||||
SchemaKeyValueMap_t* tableMap = schemaTableMap[tableMapIndex];
|
||||
int16_t memberIndex = tableMap->Find(memberKey);
|
||||
if (!tableMap->IsValidIndex(memberIndex)) {
|
||||
Warning("schema::GetOffset(): '%s' was not found in '%s'!\n", memberName, className);
|
||||
return {0, 0};
|
||||
}
|
||||
|
||||
|
||||
@@ -25,9 +25,6 @@
|
||||
#include "entitysystem.h"
|
||||
#include "scripting/callback_manager.h"
|
||||
|
||||
// variant.h depends on ivscript.h, lets not include the whole thing
|
||||
DECLARE_POINTER_HANDLE(HSCRIPT);
|
||||
|
||||
#include <variant.h>
|
||||
|
||||
namespace counterstrikesharp {
|
||||
|
||||
@@ -31,9 +31,13 @@
|
||||
#include "entity2/entitysystem.h"
|
||||
#include "interfaces/cs2_interfaces.h"
|
||||
|
||||
|
||||
counterstrikesharp::GlobalClass* counterstrikesharp::GlobalClass::head = nullptr;
|
||||
|
||||
CGameEntitySystem *GameEntitySystem()
|
||||
{
|
||||
return counterstrikesharp::globals::entitySystem;
|
||||
}
|
||||
|
||||
// TODO: Workaround for windows, we __MUST__ have COUNTERSTRIKESHARP_API to handle it.
|
||||
// like on windows it should be `extern "C" __declspec(dllexport)`, on linux it should be anything else.
|
||||
DLL_EXPORT void InvokeNative(counterstrikesharp::fxNativeContext& context)
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include "core/memory.h"
|
||||
#include "core/log.h"
|
||||
#include "core/function.h"
|
||||
#include "core/managers/player_manager.h"
|
||||
#include "core/managers/server_manager.h"
|
||||
// clang-format on
|
||||
|
||||
@@ -74,6 +75,17 @@ float GetGameFrameTime(ScriptContext& script_context)
|
||||
|
||||
double GetEngineTime(ScriptContext& script_context) { return Plat_FloatTime(); }
|
||||
|
||||
int GetMaxClients(ScriptContext& script_context)
|
||||
{
|
||||
auto globalVars = globals::getGlobalVars();
|
||||
if (globalVars == nullptr) {
|
||||
script_context.ThrowNativeError("Global Variables not initialized yet.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return globalVars->maxClients;
|
||||
}
|
||||
|
||||
void ServerCommand(ScriptContext& script_context)
|
||||
{
|
||||
auto command = script_context.GetArgument<const char*>(0);
|
||||
@@ -294,6 +306,7 @@ REGISTER_NATIVES(engine, {
|
||||
ScriptEngine::RegisterNativeHandler("GET_CURRENT_TIME", GetCurrentTime);
|
||||
ScriptEngine::RegisterNativeHandler("GET_GAMEFRAME_TIME", GetGameFrameTime);
|
||||
ScriptEngine::RegisterNativeHandler("GET_ENGINE_TIME", GetEngineTime);
|
||||
ScriptEngine::RegisterNativeHandler("GET_MAX_CLIENTS", GetMaxClients);
|
||||
ScriptEngine::RegisterNativeHandler("ISSUE_SERVER_COMMAND", ServerCommand);
|
||||
ScriptEngine::RegisterNativeHandler("PRECACHE_MODEL", PrecacheModel);
|
||||
ScriptEngine::RegisterNativeHandler("PRECACHE_SOUND", PrecacheSound);
|
||||
|
||||
@@ -6,6 +6,7 @@ GET_CURRENT_TIME: -> float
|
||||
GET_TICK_COUNT: -> int
|
||||
GET_GAME_FRAME_TIME: -> float
|
||||
GET_ENGINE_TIME: -> double
|
||||
GET_MAX_CLIENTS: -> int
|
||||
ISSUE_SERVER_COMMAND: command:string -> void
|
||||
PRECACHE_MODEL: name:string -> void
|
||||
PRECACHE_SOUND: name:string, preload:bool -> bool
|
||||
|
||||
@@ -42,6 +42,18 @@ int16 GetSchemaOffset(ScriptContext& script_context)
|
||||
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)
|
||||
{
|
||||
auto className = script_context.GetArgument<const char*>(0);
|
||||
@@ -150,19 +162,6 @@ void SetSchemaValueByName(ScriptContext& script_context)
|
||||
auto memberKey = hash_32_fnv1a_const(memberName);
|
||||
|
||||
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) {
|
||||
case DATA_TYPE_BOOL:
|
||||
@@ -239,6 +238,7 @@ void SetSchemaValueByName(ScriptContext& script_context)
|
||||
|
||||
REGISTER_NATIVES(schema, {
|
||||
ScriptEngine::RegisterNativeHandler("GET_SCHEMA_OFFSET", GetSchemaOffset);
|
||||
ScriptEngine::RegisterNativeHandler("IS_SCHEMA_FIELD_NETWORKED", IsSchemaFieldNetworked);
|
||||
ScriptEngine::RegisterNativeHandler("GET_SCHEMA_VALUE_BY_NAME", GetSchemaValueByName);
|
||||
ScriptEngine::RegisterNativeHandler("SET_SCHEMA_VALUE_BY_NAME", SetSchemaValueByName);
|
||||
ScriptEngine::RegisterNativeHandler("GET_SCHEMA_CLASS_SIZE", GetSchemaClassSize);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
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
|
||||
SET_SCHEMA_VALUE_BY_NAME: instance:pointer, returnType:int, className:string, propName:string, value:any -> void
|
||||
GET_SCHEMA_CLASS_SIZE: className:string -> int
|
||||
Reference in New Issue
Block a user