v1.1.0
This commit is contained in:
parent
6b8988ade4
commit
26cb787b57
125 changed files with 9157 additions and 1940 deletions
|
|
@ -1,6 +1,9 @@
|
|||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using jRandomSkills.src.player;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System.Reflection;
|
||||
using static jRandomSkills.jRandomSkills;
|
||||
|
||||
namespace jRandomSkills
|
||||
|
|
@ -29,16 +32,30 @@ namespace jRandomSkills
|
|||
return defaultConfig;
|
||||
}
|
||||
|
||||
string json = File.ReadAllText(configPath);
|
||||
var config = new ConfigModel();
|
||||
|
||||
try
|
||||
{
|
||||
string json = File.ReadAllText(configPath);
|
||||
return JsonConvert.DeserializeObject<ConfigModel>(json) ?? new ConfigModel();
|
||||
var root = JsonConvert.DeserializeObject<JObject>(json);
|
||||
|
||||
var settings = root["Settings"];
|
||||
if (settings != null) JsonConvert.PopulateObject(settings.ToString(), config.Settings);
|
||||
|
||||
var skillsArray = (JArray)root["SkillsInfo"];
|
||||
foreach (var skillObj in skillsArray)
|
||||
{
|
||||
string name = skillObj["Name"]?.ToString();
|
||||
var instance = config.SkillsInfo.FirstOrDefault(x => x.Name == name);
|
||||
if (instance != null) JsonConvert.PopulateObject(skillObj.ToString(), instance);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Instance.Logger.LogError($"Error when loading the config file.");
|
||||
return new ConfigModel();
|
||||
Instance.Logger.LogError($"Error when loading the config file: {ex.Message}");
|
||||
}
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
public static void SaveConfig(ConfigModel config)
|
||||
|
|
@ -66,110 +83,118 @@ namespace jRandomSkills
|
|||
fileWatcher.EnableRaisingEvents = true;
|
||||
}
|
||||
|
||||
public static T GetValue<T>(object skill, string key)
|
||||
{
|
||||
var skillConfig = config.SkillsInfo.FirstOrDefault(s => s.Name == skill.ToString());
|
||||
|
||||
var prop = skillConfig.GetType().GetProperty(key, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
|
||||
if (prop != null)
|
||||
{
|
||||
var value = prop.GetValue(skillConfig);
|
||||
if (value == null) return default!;
|
||||
else return (T)Convert.ChangeType(value, typeof(T));
|
||||
}
|
||||
|
||||
var field = skillConfig.GetType().GetField(key, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
|
||||
if (field != null)
|
||||
{
|
||||
var value = field.GetValue(skillConfig);
|
||||
if (value == null) return default!;
|
||||
else return (T)Convert.ChangeType(value, typeof(T));
|
||||
}
|
||||
|
||||
return default!;
|
||||
}
|
||||
|
||||
public class ConfigModel
|
||||
{
|
||||
// Team: 2 - TT, 3 - CT
|
||||
|
||||
public Settings Settings { get; set; } = new Settings();
|
||||
public SkillInfo[] SkillsInfo = {
|
||||
new SkillInfo(Skills.None),
|
||||
public DefaultSkillInfo[] SkillsInfo { get; set; }
|
||||
|
||||
new SkillInfo(Skills.NoRecoil),
|
||||
new SkillInfo(Skills.SecondLife),
|
||||
new SkillInfo(Skills.C4Camouflage),
|
||||
new SkillInfo(Skills.Ninja),
|
||||
new SkillInfo(Skills.SoundMaker, cooldown: 5),
|
||||
new SkillInfo(Skills.Prosthesis),
|
||||
new SkillInfo(Skills.OnlyHead),
|
||||
new SkillInfo(Skills.ReactiveArmor, cooldown: 15),
|
||||
new SkillInfo(Skills.ReturnToSender),
|
||||
new SkillInfo(Skills.Jammer),
|
||||
new SkillInfo(Skills.RobinHood),
|
||||
new SkillInfo(Skills.Hermit),
|
||||
new SkillInfo(Skills.AreaReaper, team: 3),
|
||||
new SkillInfo(Skills.Mute),
|
||||
new SkillInfo(Skills.HolyHandGrenade),
|
||||
new SkillInfo(Skills.Replicator, cooldown: 15),
|
||||
new SkillInfo(Skills.ToxicSmoke),
|
||||
new SkillInfo(Skills.Duplicator),
|
||||
new SkillInfo(Skills.Thief),
|
||||
new SkillInfo(Skills.Deactivator),
|
||||
new SkillInfo(Skills.Dwarf, chanceFrom: .6f, chanceTo : .95f),
|
||||
new SkillInfo(Skills.SwapPosition, cooldown: 30),
|
||||
new SkillInfo(Skills.FrozenDecoy),
|
||||
new SkillInfo(Skills.Soldier, chanceFrom: 1.15f, chanceTo: 1.35f),
|
||||
new SkillInfo(Skills.Armored, chanceFrom: .65f, chanceTo : .85f),
|
||||
new SkillInfo(Skills.Aimbot, only1v1: true),
|
||||
new SkillInfo(Skills.Retreat, cooldown: 15),
|
||||
new SkillInfo(Skills.EnemySpawn, cooldown: 15),
|
||||
new SkillInfo(Skills.Zeus),
|
||||
new SkillInfo(Skills.RadarHack),
|
||||
new SkillInfo(Skills.QuickShot),
|
||||
new SkillInfo(Skills.Planter, team: 2),
|
||||
new SkillInfo(Skills.Silent),
|
||||
new SkillInfo(Skills.KillerFlash),
|
||||
new SkillInfo(Skills.TimeManipulator, cooldown: 30),
|
||||
new SkillInfo(Skills.GodMode, cooldown: 30),
|
||||
new SkillInfo(Skills.RandomWeapon, cooldown: 15),
|
||||
new SkillInfo(Skills.WeaponsSwap, cooldown: 30),
|
||||
new SkillInfo(Skills.Wallhack),
|
||||
new SkillInfo(Skills.Flash, chanceFrom: 1.2f, chanceTo: 3.0f),
|
||||
new SkillInfo(Skills.PawelJumper),
|
||||
new SkillInfo(Skills.BunnyHop),
|
||||
new SkillInfo(Skills.Impostor),
|
||||
new SkillInfo(Skills.OneShot),
|
||||
new SkillInfo(Skills.Muhammed),
|
||||
new SkillInfo(Skills.RichBoy),
|
||||
new SkillInfo(Skills.Rambo),
|
||||
new SkillInfo(Skills.Medic),
|
||||
new SkillInfo(Skills.Ghost),
|
||||
new SkillInfo(Skills.Chicken),
|
||||
new SkillInfo(Skills.Astronaut, chanceFrom: .1f, chanceTo: .7f),
|
||||
new SkillInfo(Skills.Disarmament, chanceFrom: .2f, chanceTo: .4f),
|
||||
new SkillInfo(Skills.AntyFlash),
|
||||
new SkillInfo(Skills.Behind, chanceFrom: .2f, chanceTo: .4f),
|
||||
new SkillInfo(Skills.InfiniteAmmo),
|
||||
new SkillInfo(Skills.Catapult, chanceFrom : .2f, chanceTo : .4f),
|
||||
new SkillInfo(Skills.Dracula),
|
||||
new SkillInfo(Skills.Teleporter),
|
||||
new SkillInfo(Skills.Saper),
|
||||
new SkillInfo(Skills.Phoenix, chanceFrom: .2f, chanceTo: .4f),
|
||||
new SkillInfo(Skills.Pilot),
|
||||
new SkillInfo(Skills.Shade),
|
||||
new SkillInfo(Skills.AntyHead),
|
||||
};
|
||||
public ConfigModel()
|
||||
{
|
||||
SkillsInfo = Assembly.GetExecutingAssembly().GetTypes()
|
||||
.Where(t => typeof(DefaultSkillInfo).IsAssignableFrom(t) && t.Name == "SkillConfig")
|
||||
.Select(t =>
|
||||
{
|
||||
var ctor = t.GetConstructors().FirstOrDefault(c => c.GetParameters().All(p => p.IsOptional));
|
||||
if (ctor == null) return null;
|
||||
var args = ctor.GetParameters().Select(p => Type.Missing).ToArray();
|
||||
return ctor.Invoke(args) as DefaultSkillInfo;
|
||||
})
|
||||
.Where(instance => instance != null)
|
||||
.ToArray()!;
|
||||
}
|
||||
}
|
||||
|
||||
public class Settings
|
||||
{
|
||||
public string LangCode { get; set; } = "en";
|
||||
public string Set_Skill { get; set; } = "ustawskill, setskill";
|
||||
public string SkillsList_Menu { get; set; } = "supermoc, skille, listamocy, supermoce, losowemoce";
|
||||
public bool KillerSkillInfo { get; set; } = true;
|
||||
public bool TeamMateSkillInfo { get; set; } = true;
|
||||
public bool SummaryAfterTheRound { get; set; } = true;
|
||||
public string LangCode { get; set; }
|
||||
public int GameMode { get; set; }
|
||||
public bool KillerSkillInfo { get; set; }
|
||||
public bool TeamMateSkillInfo { get; set; }
|
||||
public bool SummaryAfterTheRound { get; set; }
|
||||
public bool DebugMode { get; set; }
|
||||
public string SetSkillCommands { get; set; }
|
||||
public string SkillsListCommands { get; set; }
|
||||
public string UseSkillCommands { get; set; }
|
||||
public string ChangeMapCommands { get; set; }
|
||||
public string StartGameCommands { get; set; }
|
||||
public string ConsoleCommands { get; set; }
|
||||
public string SwapCommands { get; set; }
|
||||
public string ShuffleCommands { get; set; }
|
||||
public string PauseCommands { get; set; }
|
||||
public string HealCommands { get; set; }
|
||||
public string SetScoreCommands { get; set; }
|
||||
|
||||
public Settings()
|
||||
{
|
||||
LangCode = "en";
|
||||
GameMode = (int)GameModes.Normal;
|
||||
KillerSkillInfo = true;
|
||||
TeamMateSkillInfo = true;
|
||||
SummaryAfterTheRound = true;
|
||||
DebugMode = true;
|
||||
|
||||
SetSkillCommands = "ustawskill, setskill, definirhabilidade, configurarhabilidade, 设置技能, 配置技能";
|
||||
SkillsListCommands = "supermoc, skille, listamocy, supermoce, skills, listaHabilidades, habilidades, 技能列表, 超能力列表";
|
||||
UseSkillCommands = "t, useSkill, usarHabilidade, 技能使用, 使用技能";
|
||||
ChangeMapCommands = "map, mapa, changemap, zmienmape, zmienmape, mudarMapa, trocarMapa, 更换地图, 更改地图";
|
||||
StartGameCommands = "start, go, começar, iniciar, 开始, 启动";
|
||||
ConsoleCommands = "console, sv, 控制台, 服务器";
|
||||
SwapCommands = "swap, zmiana, trocar, 交换, 切换";
|
||||
ShuffleCommands = "shuffle, embaralhar, 随机排序, 洗牌";
|
||||
PauseCommands = "pause, unpause, pausar, despausar, 暂停, 恢复";
|
||||
HealCommands = "heal, ulecz, curar, tratar, 治疗, 治愈";
|
||||
SetScoreCommands = "setscore, wynik, definirPontuacao, configurarPontos, 设置分数, 调整分数";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class SkillInfo
|
||||
public class DefaultSkillInfo
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public bool NeedsTeammates { get; set; }
|
||||
public int OnlyTeam { get; set; }
|
||||
public string Color { get; set; }
|
||||
public bool Active { get; set; }
|
||||
public float Cooldown { get; set; }
|
||||
public float ChanceFrom { get; set; }
|
||||
public float ChanceTo { get; set; }
|
||||
public int Team { get; set; }
|
||||
public bool Only1v1 { get; set; }
|
||||
public string Name { get; set; }
|
||||
|
||||
public SkillInfo(Skills skill, bool active = true, float cooldown = 15f, float chanceFrom = 1, float chanceTo = 1, int team = 1, bool only1v1 = false)
|
||||
public DefaultSkillInfo(Skills skill, bool active = true, string color = "#ffffff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false)
|
||||
{
|
||||
Name = skill.ToString();
|
||||
Active = active;
|
||||
Cooldown = cooldown;
|
||||
ChanceFrom = chanceFrom;
|
||||
ChanceTo = chanceTo;
|
||||
Team = team;
|
||||
Only1v1 = only1v1;
|
||||
Color = color;
|
||||
OnlyTeam = (int)onlyTeam;
|
||||
NeedsTeammates = needsTeammates;
|
||||
}
|
||||
}
|
||||
|
||||
public enum GameModes
|
||||
{
|
||||
Normal = 0,
|
||||
TeamSkills = 1,
|
||||
SameSkills = 2,
|
||||
Debug = 3,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,13 +1,19 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Cvars;
|
||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using jRandomSkills.src.player;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace jRandomSkills
|
||||
{
|
||||
public static class SkillUtils
|
||||
{
|
||||
private static MemoryFunctionVoid<nint, float, RoundEndReason, nint, nint> TerminateRoundFunc = new(GameData.GetSignature("CCSGameRules_TerminateRound"));
|
||||
|
||||
public static void PrintToChat(CCSPlayerController player, string msg, bool isError)
|
||||
{
|
||||
string checkIcon = isError ? $"{ChatColors.DarkRed}✖{ChatColors.LightRed}" : $"{ChatColors.Green}✔{ChatColors.Lime}";
|
||||
|
|
@ -17,7 +23,7 @@ namespace jRandomSkills
|
|||
public static void RegisterSkill(Skills skill, string color, bool display = true)
|
||||
{
|
||||
if (!SkillData.Skills.Any(s => s.Skill == skill))
|
||||
SkillData.Skills.Add(new dSkill_SkillInfo(skill, color, display));
|
||||
SkillData.Skills.Add(new jSkill_SkillInfo(skill, color, display));
|
||||
}
|
||||
|
||||
public static void TryGiveWeapon(CCSPlayerController player, CsItem item, int count = 1)
|
||||
|
|
@ -31,9 +37,22 @@ namespace jRandomSkills
|
|||
player.GiveNamedItem(item);
|
||||
}
|
||||
|
||||
public static double GetDistance(Vector vector1, Vector vector2)
|
||||
{
|
||||
return Math.Sqrt(Math.Pow(vector2.X - vector1.X, 2) + Math.Pow(vector2.Y - vector1.Y, 2) + Math.Pow(vector2.Z - vector1.Z, 2));
|
||||
}
|
||||
|
||||
public static string SecondsToTimer(int totalSeconds)
|
||||
{
|
||||
if (totalSeconds <= 0) return "00:00";
|
||||
int minutes = totalSeconds / 60;
|
||||
int seconds = totalSeconds % 60;
|
||||
return $"{minutes:D2}:{seconds:D2}";
|
||||
}
|
||||
|
||||
public static Vector GetForwardVector(QAngle angles)
|
||||
{
|
||||
float pitch = angles.X * (float)(Math.PI / 180);
|
||||
float pitch = -angles.X * (float)(Math.PI / 180);
|
||||
float yaw = angles.Y * (float)(Math.PI / 180);
|
||||
|
||||
float x = (float)(Math.Cos(pitch) * Math.Cos(yaw));
|
||||
|
|
@ -71,5 +90,156 @@ namespace jRandomSkills
|
|||
pawn.MaxHealth = maxHealth;
|
||||
Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iMaxHealth");
|
||||
}
|
||||
|
||||
public static void SetTeamScores(short ctScore, short tScore, RoundEndReason roundEndReason)
|
||||
{
|
||||
UpdateServerTeamScores(ctScore, tScore);
|
||||
TerminateRoundFunc.Invoke(jRandomSkills.Instance.GameRules.Handle, 5f, roundEndReason, 0, 0);
|
||||
}
|
||||
|
||||
public static void TerminateRound(CsTeam winnerTeam)
|
||||
{
|
||||
var teams = Utilities.FindAllEntitiesByDesignerName<CCSTeam>("cs_team_manager");
|
||||
var ctTeam = teams.First(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.CounterTerrorist);
|
||||
var tTeams = teams.First(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.Terrorist);
|
||||
if (ctTeam == null || tTeams == null) return;
|
||||
|
||||
short ctScore = (short)(winnerTeam == CsTeam.CounterTerrorist ? ctTeam.Score + 1 : ctTeam.Score);
|
||||
short tScore = (short)(winnerTeam == CsTeam.Terrorist ? tTeams.Score + 1 : tTeams.Score);
|
||||
|
||||
UpdateServerTeamScores(ctScore, tScore);
|
||||
TerminateRoundFunc.Invoke(jRandomSkills.Instance.GameRules.Handle, 5f, winnerTeam == CsTeam.CounterTerrorist ? RoundEndReason.BombDefused : RoundEndReason.TargetBombed, 0, 0);
|
||||
}
|
||||
|
||||
private static void UpdateServerTeamScores(short ctScore, short tScore)
|
||||
{
|
||||
int totalRoundsPlayed = ctScore + tScore;
|
||||
int maxRounds = ConVar.Find("mp_maxrounds")?.GetPrimitiveValue<int>() ?? 24;
|
||||
int halfRounds = maxRounds / 2;
|
||||
int overtimeMaxRounds = ConVar.Find("mp_overtime_maxrounds")?.GetPrimitiveValue<int>() ?? 6;
|
||||
int overtimeLimit = ConVar.Find("mp_overtime_limit")?.GetPrimitiveValue<int>() ?? 1;
|
||||
|
||||
var gameRulesProxy = jRandomSkills.Instance.GameRules;
|
||||
gameRulesProxy.TotalRoundsPlayed = totalRoundsPlayed;
|
||||
gameRulesProxy.ITotalRoundsPlayed = totalRoundsPlayed;
|
||||
gameRulesProxy.RoundsPlayedThisPhase = totalRoundsPlayed;
|
||||
|
||||
gameRulesProxy.TeamIntroPeriod = false;
|
||||
if (gameRulesProxy.GamePhase == 1 && totalRoundsPlayed < halfRounds)
|
||||
{
|
||||
gameRulesProxy.GamePhase = 0;
|
||||
gameRulesProxy.SwapTeamsOnRestart = true;
|
||||
gameRulesProxy.SwitchingTeamsAtRoundReset = true;
|
||||
gameRulesProxy.RoundsPlayedThisPhase = 0;
|
||||
gameRulesProxy.TeamIntroPeriod = true;
|
||||
}
|
||||
|
||||
if (totalRoundsPlayed < halfRounds)
|
||||
gameRulesProxy.GamePhase = 0;
|
||||
else if (gameRulesProxy.GamePhase == 0)
|
||||
{
|
||||
gameRulesProxy.GamePhase = 1;
|
||||
gameRulesProxy.SwapTeamsOnRestart = true;
|
||||
gameRulesProxy.SwitchingTeamsAtRoundReset = true;
|
||||
gameRulesProxy.RoundsPlayedThisPhase = 0;
|
||||
gameRulesProxy.TeamIntroPeriod = true;
|
||||
}
|
||||
|
||||
var structOffset = jRandomSkills.Instance.GameRules.Handle + Schema.GetSchemaOffset("CCSGameRules", "m_bMapHasBombZone") + 0x02;
|
||||
var matchStruct = Marshal.PtrToStructure<MCCSMatch>(structOffset);
|
||||
|
||||
matchStruct.m_totalScore = (short)totalRoundsPlayed;
|
||||
matchStruct.m_actualRoundsPlayed = (short)totalRoundsPlayed;
|
||||
gameRulesProxy.MatchInfoDecidedTime = Server.CurrentTime;
|
||||
|
||||
matchStruct.m_ctScoreTotal = ctScore;
|
||||
gameRulesProxy.AccountCT = ctScore;
|
||||
matchStruct.m_terroristScoreTotal = tScore;
|
||||
gameRulesProxy.AccountTerrorist = tScore;
|
||||
|
||||
if (gameRulesProxy.GamePhase == 0)
|
||||
{
|
||||
matchStruct.m_ctScoreFirstHalf = ctScore;
|
||||
matchStruct.m_terroristScoreFirstHalf = tScore;
|
||||
}
|
||||
else
|
||||
{
|
||||
matchStruct.m_ctScoreSecondHalf = ctScore;
|
||||
matchStruct.m_terroristScoreSecondHalf = tScore;
|
||||
}
|
||||
|
||||
if (totalRoundsPlayed >= maxRounds)
|
||||
{
|
||||
if (gameRulesProxy.OvertimePlaying == 0)
|
||||
{
|
||||
gameRulesProxy.OvertimePlaying = 1;
|
||||
gameRulesProxy.SwapTeamsOnRestart = true;
|
||||
gameRulesProxy.SwitchingTeamsAtRoundReset = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
int roundsInOvertime = totalRoundsPlayed - maxRounds;
|
||||
if (roundsInOvertime % overtimeMaxRounds == 0)
|
||||
{
|
||||
int currentOvertime = roundsInOvertime / overtimeMaxRounds;
|
||||
if ( currentOvertime < overtimeLimit)
|
||||
{
|
||||
gameRulesProxy.SwapTeamsOnRestart = true;
|
||||
gameRulesProxy.SwitchingTeamsAtRoundReset = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
gameRulesProxy.OvertimePlaying = 0;
|
||||
|
||||
Marshal.StructureToPtr(matchStruct, structOffset, true);
|
||||
UpdateClientTeamScores(matchStruct);
|
||||
}
|
||||
|
||||
private static void UpdateClientTeamScores(MCCSMatch match)
|
||||
{
|
||||
var teams = Utilities.FindAllEntitiesByDesignerName<CCSTeam>("cs_team_manager");
|
||||
var ctTeam = teams.First(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.CounterTerrorist);
|
||||
var tTeams = teams.First(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.Terrorist);
|
||||
|
||||
if (ctTeam != null && tTeams != null)
|
||||
{
|
||||
ctTeam.Score = match.m_ctScoreTotal;
|
||||
ctTeam.ScoreFirstHalf = match.m_ctScoreFirstHalf;
|
||||
ctTeam.ScoreSecondHalf = match.m_ctScoreSecondHalf;
|
||||
ctTeam.ScoreOvertime = match.m_ctScoreOvertime;
|
||||
Utilities.SetStateChanged(ctTeam, "CTeam", "m_iScore");
|
||||
Utilities.SetStateChanged(ctTeam, "CCSTeam", "m_scoreFirstHalf");
|
||||
Utilities.SetStateChanged(ctTeam, "CCSTeam", "m_scoreSecondHalf");
|
||||
Utilities.SetStateChanged(ctTeam, "CCSTeam", "m_scoreOvertime");
|
||||
|
||||
tTeams.Score = match.m_terroristScoreTotal;
|
||||
tTeams.ScoreFirstHalf = match.m_terroristScoreFirstHalf;
|
||||
tTeams.ScoreSecondHalf = match.m_terroristScoreSecondHalf;
|
||||
tTeams.ScoreOvertime = match.m_terroristScoreOvertime;
|
||||
Utilities.SetStateChanged(tTeams, "CTeam", "m_iScore");
|
||||
Utilities.SetStateChanged(tTeams, "CCSTeam", "m_scoreFirstHalf");
|
||||
Utilities.SetStateChanged(tTeams, "CCSTeam", "m_scoreSecondHalf");
|
||||
Utilities.SetStateChanged(tTeams, "CCSTeam", "m_scoreOvertime");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct MCCSMatch
|
||||
{
|
||||
public short m_totalScore;
|
||||
public short m_actualRoundsPlayed;
|
||||
public short m_nOvertimePlaying;
|
||||
public short m_ctScoreFirstHalf;
|
||||
public short m_ctScoreSecondHalf;
|
||||
public short m_ctScoreOvertime;
|
||||
public short m_ctScoreTotal;
|
||||
public short m_terroristScoreFirstHalf;
|
||||
public short m_terroristScoreSecondHalf;
|
||||
public short m_terroristScoreOvertime;
|
||||
public short m_terroristScoreTotal;
|
||||
public short unknown;
|
||||
public int m_phase;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue