Tidy up weapon code and data dumper
This commit is contained in:
315114
Client/Data/Animations.json
Normal file
315114
Client/Data/Animations.json
Normal file
File diff suppressed because it is too large
Load Diff
4287
Client/Data/VehicleWeapons.json
Normal file
4287
Client/Data/VehicleWeapons.json
Normal file
File diff suppressed because it is too large
Load Diff
99
Client/Data/WeaponFixes.json
Normal file
99
Client/Data/WeaponFixes.json
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
{
|
||||||
|
"Bullet": {
|
||||||
|
"2861067768": "VEHICLE_WEAPON_INSURGENT_MINIGUN",
|
||||||
|
"3683206664": "VEHICLE_WEAPON_TECHNICAL_MINIGUN",
|
||||||
|
"3048454573": "VEHICLE_WEAPON_AKULA_TURRET_SINGLE",
|
||||||
|
"476907586": "VEHICLE_WEAPON_AKULA_TURRET_DUAL",
|
||||||
|
"431576697": "VEHICLE_WEAPON_AKULA_MINIGUN",
|
||||||
|
"3405172033": "VEHICLE_WEAPON_ANNIHILATOR2_MINI",
|
||||||
|
"1000258817": "VEHICLE_WEAPON_BARRAGE_TOP_MINIGUN",
|
||||||
|
"525623141": "VEHICLE_WEAPON_BARRAGE_REAR_MINIGUN",
|
||||||
|
"1338760315": "VEHICLE_WEAPON_CARACARA_MINIGUN",
|
||||||
|
"490982948": "VEHICLE_WEAPON_DEATHBIKE_DUALMINIGUN",
|
||||||
|
"3909880809": "VEHICLE_WEAPON_DEATHBIKE2_MINIGUN_LASER",
|
||||||
|
"2600428406": "VEHICLE_WEAPON_DELUXO_MG",
|
||||||
|
"1416047217": "VEHICLE_WEAPON_DUNE_MINIGUN",
|
||||||
|
"3003147322": "VEHICLE_WEAPON_FLAMETHROWER",
|
||||||
|
"2182329506": "VEHICLE_WEAPON_FLAMETHROWER_SCIFI",
|
||||||
|
"855547631": "VEHICLE_WEAPON_HAVOK_MINIGUN",
|
||||||
|
"2263283790": "VEHICLE_WEAPON_POUNDER2_MINI",
|
||||||
|
"2431961420": "VEHICLE_WEAPON_SEASPARROW2_MINIGUN",
|
||||||
|
"2667462330": "VEHICLE_WEAPON_SPEEDO4_TURRET_MINI",
|
||||||
|
"3670375085": "VEHICLE_WEAPON_TAMPA_FIXEDMINIGUN",
|
||||||
|
"1744687076": "VEHICLE_WEAPON_TAMPA_DUALMINIGUN",
|
||||||
|
"1697521053": "VEHICLE_WEAPON_THRUSTER_MG",
|
||||||
|
"376489128": "VEHICLE_WEAPON_TULA_MINIGUN",
|
||||||
|
"4109257098": "VEHICLE_WEAPON_RCTANK_FLAME",
|
||||||
|
"3959029566": "VEHICLE_WEAPON_CANNON_BLAZER",
|
||||||
|
"1119849093": "WEAPON_MINIGUN",
|
||||||
|
"4256881901": "WEAPON_DIGISCANNER",
|
||||||
|
"1186503822": "VEHICLE_WEAPON_PLAYER_BUZZARD",
|
||||||
|
"3056410471": "WEAPON_RAYMINIGUN",
|
||||||
|
"729375873": "VEHICLE_WEAPON_TURRET_LIMO",
|
||||||
|
"2756787765": "VEHICLE_WEAPON_TURRET_VALKYRIE",
|
||||||
|
"50118905": "VEHICLE_WEAPON_RUINER_BULLET"
|
||||||
|
},
|
||||||
|
"Lazer": {
|
||||||
|
"955522731": "VEHICLE_WEAPON_STRIKEFORCE_CANNON",
|
||||||
|
"539292904": "WEAPON_EXPLOSION",
|
||||||
|
"1638077257": "VEHICLE_WEAPON_PLAYER_SAVAGE"
|
||||||
|
},
|
||||||
|
"Others": {
|
||||||
|
"3441901897": "WEAPON_BATTLEAXE",
|
||||||
|
"4192643659": "WEAPON_BOTTLE",
|
||||||
|
"2460120199": "WEAPON_DAGGER",
|
||||||
|
"2343591895": "WEAPON_FLASHLIGHT",
|
||||||
|
"3794977420": "WEAPON_GARBAGEBAG",
|
||||||
|
"3494679629": "WEAPON_HANDCUFFS",
|
||||||
|
"4191993645": "WEAPON_HATCHET",
|
||||||
|
"3638508604": "WEAPON_KNUCKLE",
|
||||||
|
"3713923289": "WEAPON_MACHETE",
|
||||||
|
"2484171525": "WEAPON_POOLCUE",
|
||||||
|
"2725352035": "WEAPON_UNARMED",
|
||||||
|
"4194021054": "WEAPON_ANIMAL",
|
||||||
|
"148160082": "WEAPON_COUGAR",
|
||||||
|
"2578778090": "WEAPON_KNIFE",
|
||||||
|
"1737195953": "WEAPON_NIGHTSTICK",
|
||||||
|
"1317494643": "WEAPON_HAMMER",
|
||||||
|
"2508868239": "WEAPON_BAT",
|
||||||
|
"1141786504": "WEAPON_GOLFCLUB",
|
||||||
|
"2227010557": "WEAPON_CROWBAR",
|
||||||
|
"101631238": "WEAPON_FIREEXTINGUISHER",
|
||||||
|
"883325847": "WEAPON_PETROLCAN",
|
||||||
|
"2294779575": "WEAPON_BRIEFCASE",
|
||||||
|
"28811031": "WEAPON_BRIEFCASE_02",
|
||||||
|
"3450622333": "VEHICLE_WEAPON_SEARCHLIGHT",
|
||||||
|
"3530961278": "VEHICLE_WEAPON_RADAR",
|
||||||
|
"1223143800": "WEAPON_BARBED_WIRE",
|
||||||
|
"4284007675": "WEAPON_DROWNING",
|
||||||
|
"1936677264": "WEAPON_DROWNING_IN_VEHICLE",
|
||||||
|
"2339582971": "WEAPON_BLEEDING",
|
||||||
|
"2461879995": "WEAPON_ELECTRIC_FENCE",
|
||||||
|
"3452007600": "WEAPON_FALL",
|
||||||
|
"910830060": "WEAPON_EXHAUSTION",
|
||||||
|
"3425972830": "WEAPON_HIT_BY_WATER_CANNON",
|
||||||
|
"133987706": "WEAPON_RAMMED_BY_CAR",
|
||||||
|
"2741846334": "WEAPON_RUN_OVER_BY_CAR",
|
||||||
|
"341774354": "WEAPON_HELI_CRASH",
|
||||||
|
"2971687502": "VEHICLE_WEAPON_ROTORS",
|
||||||
|
"3750660587": "WEAPON_FIRE",
|
||||||
|
"3854032506": "WEAPON_ANIMAL_RETRIEVER",
|
||||||
|
"3146768957": "WEAPON_SMALL_DOG",
|
||||||
|
"743550225": "WEAPON_TIGER_SHARK",
|
||||||
|
"3030980043": "WEAPON_HAMMERHEAD_SHARK",
|
||||||
|
"4198358245": "WEAPON_KILLER_WHALE",
|
||||||
|
"861723357": "WEAPON_BOAR",
|
||||||
|
"1205296881": "WEAPON_PIG",
|
||||||
|
"1161062353": "WEAPON_COYOTE",
|
||||||
|
"4106648222": "WEAPON_DEER",
|
||||||
|
"955837630": "WEAPON_HEN",
|
||||||
|
"2793925639": "WEAPON_RABBIT",
|
||||||
|
"3799318422": "WEAPON_CAT",
|
||||||
|
"94548753": "WEAPON_COW",
|
||||||
|
"940833800": "WEAPON_STONE_HATCHET",
|
||||||
|
"3756226112": "WEAPON_SWITCHBLADE",
|
||||||
|
"419712736": "WEAPON_WRENCH",
|
||||||
|
"406929569": "WEAPON_FERTILIZERCAN",
|
||||||
|
"3126027122": "WEAPON_HAZARDCAN"
|
||||||
|
}
|
||||||
|
}
|
329
Client/Data/WeaponHash.cs
Normal file
329
Client/Data/WeaponHash.cs
Normal file
@ -0,0 +1,329 @@
|
|||||||
|
public enum WeaponHash : uint
|
||||||
|
{
|
||||||
|
Advancedrifle = 0xAF113F99,
|
||||||
|
AirDefenceGun = 0x2C082D7D,
|
||||||
|
AirstrikeRocket = 0x13579279,
|
||||||
|
Animal = 0xF9FBAEBE,
|
||||||
|
AnimalRetriever = 0xE5B7DE7A,
|
||||||
|
Appistol = 0x22D8FE39,
|
||||||
|
ArenaHomingMissile = 0x648A81D0,
|
||||||
|
ArenaMachineGun = 0x34FDFF66,
|
||||||
|
Assaultrifle = 0xBFEFFF6D,
|
||||||
|
AssaultrifleMk2 = 0x394F415C,
|
||||||
|
Assaultshotgun = 0xE284C527,
|
||||||
|
Assaultsmg = 0xEFE7E2DF,
|
||||||
|
Autoshotgun = 0x12E82D3D,
|
||||||
|
Ball = 0x23C9F95C,
|
||||||
|
BarbedWire = 0x48E7B178,
|
||||||
|
Bat = 0x958A4A8F,
|
||||||
|
Battleaxe = 0xCD274149,
|
||||||
|
BirdCrap = 0x6D5E2801,
|
||||||
|
Bleeding = 0x8B7333FB,
|
||||||
|
Boar = 0x335CDADD,
|
||||||
|
Bottle = 0xF9E6AA4B,
|
||||||
|
Briefcase = 0x88C78EB7,
|
||||||
|
Briefcase02 = 0x1B79F17,
|
||||||
|
Bullpuprifle = 0x7F229F94,
|
||||||
|
BullpuprifleMk2 = 0x84D6FAFD,
|
||||||
|
Bullpupshotgun = 0x9D61E50F,
|
||||||
|
Bzgas = 0xA0973D5E,
|
||||||
|
Carbinerifle = 0x83BF0278,
|
||||||
|
CarbinerifleMk2 = 0xFAD1F1C9,
|
||||||
|
Cat = 0xE274FF96,
|
||||||
|
Ceramicpistol = 0x2B5EF5EC,
|
||||||
|
Combatmg = 0x7FD62962,
|
||||||
|
CombatmgMk2 = 0xDBBD7280,
|
||||||
|
Combatpdw = 0xA3D4D34,
|
||||||
|
Combatpistol = 0x5EF9FEC4,
|
||||||
|
Combatshotgun = 0x5A96BA4,
|
||||||
|
Compactlauncher = 0x781FE4A,
|
||||||
|
Compactrifle = 0x624FE830,
|
||||||
|
Cougar = 0x8D4BE52,
|
||||||
|
Cow = 0x5A2B311,
|
||||||
|
Coyote = 0x453467D1,
|
||||||
|
Crowbar = 0x84BD7BFD,
|
||||||
|
Dagger = 0x92A27487,
|
||||||
|
Dbshotgun = 0xEF951FBB,
|
||||||
|
Deer = 0xF4C67A9E,
|
||||||
|
Digiscanner = 0xFDBADCED,
|
||||||
|
Doubleaction = 0x97EA20B8,
|
||||||
|
Drowning = 0xFF58C4FB,
|
||||||
|
DrowningInVehicle = 0x736F5990,
|
||||||
|
ElectricFence = 0x92BD4EBB,
|
||||||
|
Emplauncher = 0xDB26713A,
|
||||||
|
Exhaustion = 0x364A29EC,
|
||||||
|
Explosion = 0x2024F4E8,
|
||||||
|
Fall = 0xCDC174B0,
|
||||||
|
Fertilizercan = 0x184140A1,
|
||||||
|
Fire = 0xDF8E89EB,
|
||||||
|
Fireextinguisher = 0x60EC506,
|
||||||
|
Firework = 0x7F7497E5,
|
||||||
|
Flare = 0x497FACC3,
|
||||||
|
Flaregun = 0x47757124,
|
||||||
|
Flashlight = 0x8BB05FD7,
|
||||||
|
Gadgetpistol = 0x57A4368C,
|
||||||
|
Garbagebag = 0xE232C28C,
|
||||||
|
Golfclub = 0x440E4788,
|
||||||
|
Grenade = 0x93E220BD,
|
||||||
|
Grenadelauncher = 0xA284510B,
|
||||||
|
GrenadelauncherSmoke = 0x4DD2DC56,
|
||||||
|
Gusenberg = 0x61012683,
|
||||||
|
Hammer = 0x4E875F73,
|
||||||
|
HammerheadShark = 0xB4A915CB,
|
||||||
|
Handcuffs = 0xD04C944D,
|
||||||
|
Hatchet = 0xF9DCBF2D,
|
||||||
|
Hazardcan = 0xBA536372,
|
||||||
|
Heavypistol = 0xD205520E,
|
||||||
|
Heavyrifle = 0xC78D71B4,
|
||||||
|
Heavyshotgun = 0x3AABBBAA,
|
||||||
|
Heavysniper = 0xC472FE2,
|
||||||
|
HeavysniperMk2 = 0xA914799,
|
||||||
|
HeliCrash = 0x145F1012,
|
||||||
|
Hen = 0x38F8ECBE,
|
||||||
|
HitByWaterCannon = 0xCC34325E,
|
||||||
|
Hominglauncher = 0x63AB0442,
|
||||||
|
KillerWhale = 0xFA3DDCE5,
|
||||||
|
Knife = 0x99B507EA,
|
||||||
|
Knuckle = 0xD8DF3C3C,
|
||||||
|
Machete = 0xDD5DF8D9,
|
||||||
|
Machinepistol = 0xDB1AA450,
|
||||||
|
Marksmanpistol = 0xDC4DB296,
|
||||||
|
Marksmanrifle = 0xC734385A,
|
||||||
|
MarksmanrifleMk2 = 0x6A6C02E0,
|
||||||
|
Mg = 0x9D07F764,
|
||||||
|
Microsmg = 0x13532244,
|
||||||
|
Militaryrifle = 0x9D1F17E6,
|
||||||
|
Minigun = 0x42BF8A85,
|
||||||
|
Minismg = 0xBD248B55,
|
||||||
|
Molotov = 0x24B17070,
|
||||||
|
Musket = 0xA89CB99E,
|
||||||
|
Navyrevolver = 0x917F6C8C,
|
||||||
|
Nightstick = 0x678B81B1,
|
||||||
|
PassengerRocket = 0x166218FF,
|
||||||
|
Petrolcan = 0x34A67B97,
|
||||||
|
Pig = 0x47D75EF1,
|
||||||
|
Pipebomb = 0xBA45E8B8,
|
||||||
|
Pistol = 0x1B06D571,
|
||||||
|
Pistol50 = 0x99AEEB3B,
|
||||||
|
PistolMk2 = 0xBFE256D4,
|
||||||
|
Poolcue = 0x94117305,
|
||||||
|
Proxmine = 0xAB564B93,
|
||||||
|
Pumpshotgun = 0x1D073A89,
|
||||||
|
PumpshotgunMk2 = 0x555AF99A,
|
||||||
|
Rabbit = 0xA687EC07,
|
||||||
|
Railgun = 0x6D544C99,
|
||||||
|
RammedByCar = 0x7FC7D7A,
|
||||||
|
Raycarbine = 0x476BF155,
|
||||||
|
Rayminigun = 0xB62D1F67,
|
||||||
|
Raypistol = 0xAF3696A1,
|
||||||
|
Remotesniper = 0x33058E22,
|
||||||
|
Revolver = 0xC1B3C3D1,
|
||||||
|
RevolverMk2 = 0xCB96392F,
|
||||||
|
Rpg = 0xB1CA77B1,
|
||||||
|
RunOverByCar = 0xA36D413E,
|
||||||
|
Sawnoffshotgun = 0x7846A318,
|
||||||
|
SmallDog = 0xBB8FE23D,
|
||||||
|
Smg = 0x2BE6766B,
|
||||||
|
SmgMk2 = 0x78A97CD0,
|
||||||
|
Smokegrenade = 0xFDBC8A50,
|
||||||
|
Sniperrifle = 0x5FC3C11,
|
||||||
|
Snowball = 0x787F0BB,
|
||||||
|
Snspistol = 0xBFD21232,
|
||||||
|
SnspistolMk2 = 0x88374054,
|
||||||
|
Specialcarbine = 0xC0A3098D,
|
||||||
|
SpecialcarbineMk2 = 0x969C3D67,
|
||||||
|
Stickybomb = 0x2C3731D9,
|
||||||
|
Stinger = 0x687652CE,
|
||||||
|
StoneHatchet = 0x3813FC08,
|
||||||
|
Stungun = 0x3656C8C1,
|
||||||
|
StungunMp = 0x45CD9CF3,
|
||||||
|
Switchblade = 0xDFE37640,
|
||||||
|
TigerShark = 0x2C51AD11,
|
||||||
|
Tranquilizer = 0x32A888BD,
|
||||||
|
Unarmed = 0xA2719263,
|
||||||
|
VehicleRocket = 0xBEFDC581,
|
||||||
|
Vintagepistol = 0x83839C4,
|
||||||
|
Wrench = 0x19044EE0,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum VehicleWeaponHash : uint
|
||||||
|
{
|
||||||
|
Invalid = 0xFFFFFFFF,
|
||||||
|
AkulaBarrage = 0x880D14F2,
|
||||||
|
AkulaMinigun = 0x19B95679,
|
||||||
|
AkulaMissile = 0x7CBE304C,
|
||||||
|
AkulaTurretDual = 0x1C6D0842,
|
||||||
|
AkulaTurretSingle = 0xB5B3B9AD,
|
||||||
|
Annihilator2Barrage = 0x35D8CC90,
|
||||||
|
Annihilator2Mini = 0xCAF6CD41,
|
||||||
|
Annihilator2Missile = 0xC76BC6B7,
|
||||||
|
ApcCannon = 0x138F71D8,
|
||||||
|
ApcMg = 0xB56E4E4,
|
||||||
|
ApcMissile = 0x44A56189,
|
||||||
|
ArdentMg = 0xC44E4341,
|
||||||
|
AvengerCannon = 0x9867203B,
|
||||||
|
BarrageRearGl = 0xA44C228D,
|
||||||
|
BarrageRearMg = 0x47894765,
|
||||||
|
BarrageRearMinigun = 0x1F545F65,
|
||||||
|
BarrageTopMg = 0xF7498994,
|
||||||
|
BarrageTopMinigun = 0x3B9EBD01,
|
||||||
|
Bomb = 0x9AF0B90C,
|
||||||
|
BombCluster = 0xD28BCA3,
|
||||||
|
BombGas = 0x5540A91E,
|
||||||
|
BombIncendiary = 0x6AF7A717,
|
||||||
|
BombStandardWide = 0x6EA548D0,
|
||||||
|
BombushkaCannon = 0xD8443A59,
|
||||||
|
BombushkaDualmg = 0x2C2B2D58,
|
||||||
|
BombWater = 0xF444C4C8,
|
||||||
|
Bruiser250calLaser = 0x3D6A0196,
|
||||||
|
Bruiser50cal = 0xD73DC601,
|
||||||
|
Brutus250calLaser = 0x68C7A4C3,
|
||||||
|
Brutus50cal = 0xEB5E5C0A,
|
||||||
|
CannonBlazer = 0xEBF9FF3E,
|
||||||
|
CaracaraMg = 0x6C516BA8,
|
||||||
|
CaracaraMinigun = 0x4FCBDC7B,
|
||||||
|
ChernoMissile = 0xA247D03E,
|
||||||
|
CometMg = 0xEAA835F3,
|
||||||
|
Deathbike2MinigunLaser = 0xE90C0BE9,
|
||||||
|
DeathbikeDualminigun = 0x1D43CE24,
|
||||||
|
DeluxoMg = 0x9AFF6376,
|
||||||
|
DeluxoMissile = 0xB4F96934,
|
||||||
|
DogfighterMg = 0x5F1834E2,
|
||||||
|
DogfighterMissile = 0xCA46F87D,
|
||||||
|
Dominator450cal = 0xF80C9B0F,
|
||||||
|
Dominator550calLaser = 0xB4246A5F,
|
||||||
|
DuneGrenadelauncher = 0xA0FC710D,
|
||||||
|
DuneMg = 0xD11507CF,
|
||||||
|
DuneMinigun = 0x54672A71,
|
||||||
|
EnemyLaser = 0x5D6660AB,
|
||||||
|
Flamethrower = 0xB300643A,
|
||||||
|
FlamethrowerScifi = 0x8213B4A2,
|
||||||
|
Granger2Mg = 0xEAE2E19A,
|
||||||
|
HackerMissile = 0x766FF7B1,
|
||||||
|
HackerMissileHoming = 0x77EACF96,
|
||||||
|
HalftrackDualmg = 0x4F6384FB,
|
||||||
|
HalftrackQuadmg = 0x491B2E74,
|
||||||
|
HavokMinigun = 0x32FE9EEF,
|
||||||
|
HunterBarrage = 0x2ED14835,
|
||||||
|
HunterCannon = 0x2A00AB1A,
|
||||||
|
HunterMg = 0x42BA80A7,
|
||||||
|
HunterMissile = 0x924A5F5,
|
||||||
|
Impaler250cal = 0x5F565C09,
|
||||||
|
Impaler350calLaser = 0x8CBDFC88,
|
||||||
|
Imperator250calLaser = 0x7817C526,
|
||||||
|
Imperator50cal = 0xB662C67B,
|
||||||
|
InsurgentMinigun = 0xAA886DF8,
|
||||||
|
Issi450cal = 0x7648E34D,
|
||||||
|
Issi550calLaser = 0x767F6925,
|
||||||
|
Jb700Mg = 0x373AD53C,
|
||||||
|
KhanjaliCannon = 0x1E3ACFA0,
|
||||||
|
KhanjaliCannonHeavy = 0x838B716D,
|
||||||
|
KhanjaliGl = 0x178605E2,
|
||||||
|
KhanjaliMg = 0x2A6F8E1D,
|
||||||
|
KosatkaTorpedo = 0x62E2140E,
|
||||||
|
MenacerMg = 0xDFCAF8A4,
|
||||||
|
MicrolightMg = 0xC4E0216C,
|
||||||
|
Mine = 0x59EAE9A4,
|
||||||
|
MineEmp = 0x69E10D60,
|
||||||
|
MineEmpRc = 0x5454B4C6,
|
||||||
|
MineKinetic = 0x3C09584E,
|
||||||
|
MineKineticRc = 0x252AF560,
|
||||||
|
MineSlick = 0x56FACAC7,
|
||||||
|
MineSlickRc = 0x84E87B17,
|
||||||
|
MineSpike = 0xD96DA06C,
|
||||||
|
MineSpikeRc = 0x7C2AFE51,
|
||||||
|
MineTar = 0xF4418BA0,
|
||||||
|
MineTarRc = 0x7D3474D6,
|
||||||
|
MobileopsCannon = 0xE53E69A4,
|
||||||
|
MogulDualnose = 0xE5F3AE2F,
|
||||||
|
MogulDualturret = 0xBA277C01,
|
||||||
|
MogulNose = 0xF6189F4A,
|
||||||
|
MogulTurret = 0xE2FD135E,
|
||||||
|
Monster3Glkin = 0xE5AE53DD,
|
||||||
|
MortarExplosive = 0xA1A8CCD2,
|
||||||
|
MortarKinetic = 0x632A22FD,
|
||||||
|
Mule4Mg = 0x84558727,
|
||||||
|
Mule4Missile = 0x4772F84B,
|
||||||
|
Mule4TurretGl = 0xDD124A65,
|
||||||
|
NightsharkMg = 0xA61AC574,
|
||||||
|
NoseTurretValkyrie = 0x4170E491,
|
||||||
|
Oppressor2Cannon = 0xD64D3469,
|
||||||
|
Oppressor2Mg = 0xE2451DD6,
|
||||||
|
Oppressor2Missile = 0x753A78F1,
|
||||||
|
OppressorMg = 0xD9322EDD,
|
||||||
|
OppressorMissile = 0x8BB7C63E,
|
||||||
|
Paragon2Mg = 0x2CAC4286,
|
||||||
|
PatrolboatDualmg = 0x4C2FB4E9,
|
||||||
|
PlaneRocket = 0xCF0896E0,
|
||||||
|
PlayerBullet = 0x4B139B2D,
|
||||||
|
PlayerBuzzard = 0x46B89C8E,
|
||||||
|
PlayerHunter = 0x9F1A91DE,
|
||||||
|
PlayerLaser = 0xEFFD014B,
|
||||||
|
PlayerLazer = 0xE2822A29,
|
||||||
|
PlayerSavage = 0x61A31349,
|
||||||
|
Pounder2Barrage = 0x926B8CE4,
|
||||||
|
Pounder2Gl = 0x9318FF16,
|
||||||
|
Pounder2Mini = 0x86E6F84E,
|
||||||
|
Pounder2Missile = 0x9A8EA9A,
|
||||||
|
Radar = 0xD276317E,
|
||||||
|
RctankFlame = 0xF4EE498A,
|
||||||
|
RctankGun = 0x52FCA619,
|
||||||
|
RctankLazer = 0x57F22C50,
|
||||||
|
RctankRocket = 0x76F744CB,
|
||||||
|
RevolterMg = 0xBD5E626A,
|
||||||
|
RogueCannon = 0xE72ABBC2,
|
||||||
|
RogueMg = 0x97273CD,
|
||||||
|
RogueMissile = 0x6C88E47D,
|
||||||
|
Rotors = 0xB1205A4E,
|
||||||
|
RuinerBullet = 0x2FCC0F9,
|
||||||
|
RuinerRocket = 0x50DC6AB,
|
||||||
|
SavestraMg = 0xEB41E84E,
|
||||||
|
Scarab250calLaser = 0xE22DEDCC,
|
||||||
|
Scarab50cal = 0x217FEF28,
|
||||||
|
ScramjetMg = 0xDCE6112,
|
||||||
|
ScramjetMissile = 0xBCE908DB,
|
||||||
|
SeabreezeMg = 0x51B8D4E8,
|
||||||
|
Searchlight = 0xCDAC517D,
|
||||||
|
Seasparrow2Minigun = 0x90F4C94C,
|
||||||
|
Slamvan450cal = 0x3AAB6E6B,
|
||||||
|
Slamvan550calLaser = 0x519543AE,
|
||||||
|
SpaceRocket = 0xF8A3939F,
|
||||||
|
Speedo4Mg = 0xC7FCF93C,
|
||||||
|
Speedo4TurretMg = 0xD6561141,
|
||||||
|
Speedo4TurretMini = 0x9EFE3EBA,
|
||||||
|
StrikeforceBarrage = 0x39BC6683,
|
||||||
|
StrikeforceCannon = 0x38F41EAB,
|
||||||
|
StrikeforceMissile = 0x1EF01D8A,
|
||||||
|
SubcarMg = 0x461DDDB0,
|
||||||
|
SubcarMissile = 0xD4897C0E,
|
||||||
|
SubcarTorpedo = 0xE783C3BA,
|
||||||
|
SubMissileHoming = 0xAAE74AC1,
|
||||||
|
TampaDualminigun = 0x67FDCFE4,
|
||||||
|
TampaFixedminigun = 0xDAC57AAD,
|
||||||
|
TampaMissile = 0x9E5840A2,
|
||||||
|
TampaMortar = 0x3C83C410,
|
||||||
|
Tank = 0x73F7C04B,
|
||||||
|
TechnicalMinigun = 0xDB894608,
|
||||||
|
ThrusterMg = 0x652E1D9D,
|
||||||
|
ThrusterMissile = 0x4635DD15,
|
||||||
|
TrailerDualaa = 0x808C4D4C,
|
||||||
|
TrailerMissile = 0x145599F7,
|
||||||
|
TrailerQuadmg = 0x4711B02C,
|
||||||
|
TulaDualmg = 0xB0D15C0B,
|
||||||
|
TulaMg = 0x488BD081,
|
||||||
|
TulaMinigun = 0x1670C4A8,
|
||||||
|
TulaNosemg = 0x419D8E15,
|
||||||
|
TurretBoxville = 0xB54F4918,
|
||||||
|
TurretDinghy550cal = 0xB3B155FD,
|
||||||
|
TurretInsurgent = 0x44DB5498,
|
||||||
|
TurretLimo = 0x2B796481,
|
||||||
|
TurretPatrolboat50cal = 0xDF4EA041,
|
||||||
|
TurretTechnical = 0x7FD2EA0B,
|
||||||
|
TurretValkyrie = 0xA4513E35,
|
||||||
|
VigilanteMg = 0xF4077EE7,
|
||||||
|
VigilanteMissile = 0x504DA665,
|
||||||
|
ViserisMg = 0x87A02E06,
|
||||||
|
VolatolDualmg = 0x4497AC40,
|
||||||
|
Zr380250calLaser = 0x220093BC,
|
||||||
|
Zr38050cal = 0x6AB93C82,
|
||||||
|
}
|
2891
Client/Data/Weapons.json
Normal file
2891
Client/Data/Weapons.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -9,6 +9,7 @@ using System.Windows;
|
|||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using RageCoop.Core;
|
using RageCoop.Core;
|
||||||
|
using static RageCoop.Client.Shared;
|
||||||
using MessageBox = System.Windows.MessageBox;
|
using MessageBox = System.Windows.MessageBox;
|
||||||
using OpenFileDialog = Microsoft.Win32.OpenFileDialog;
|
using OpenFileDialog = Microsoft.Win32.OpenFileDialog;
|
||||||
|
|
||||||
@ -101,7 +102,7 @@ namespace RageCoop.Client.Installer
|
|||||||
checkKeys:
|
checkKeys:
|
||||||
UpdateStatus("Checking conflicts");
|
UpdateStatus("Checking conflicts");
|
||||||
var menyooConfig = Path.Combine(root, @"menyooStuff\menyooConfig.ini");
|
var menyooConfig = Path.Combine(root, @"menyooStuff\menyooConfig.ini");
|
||||||
var settingsPath = Path.Combine(root, Util.SettingsPath);
|
var settingsPath = Path.Combine(root, SettingsPath);
|
||||||
Settings settings = null;
|
Settings settings = null;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -171,7 +172,7 @@ namespace RageCoop.Client.Installer
|
|||||||
}
|
}
|
||||||
|
|
||||||
UpdateStatus("Completed!");
|
UpdateStatus("Completed!");
|
||||||
MessageBox.Show("Installation sucessful!");
|
MessageBox.Show("Installation successful!");
|
||||||
Environment.Exit(0);
|
Environment.Exit(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,16 +11,6 @@
|
|||||||
<Configurations>Debug;Release</Configurations>
|
<Configurations>Debug;Release</Configurations>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Compile Remove="Resources\**" />
|
|
||||||
<EmbeddedResource Remove="Resources\**" />
|
|
||||||
<None Remove="Resources\**" />
|
|
||||||
<Page Remove="Resources\**" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Remove="bg.png" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
|
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
|
||||||
<OutDir>..\..\bin\Debug\Client</OutDir>
|
<OutDir>..\..\bin\Debug\Client</OutDir>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
@ -34,7 +24,6 @@
|
|||||||
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\Core\RageCoop.Core.csproj" />
|
|
||||||
<ProjectReference Include="..\Loader\RageCoop.Client.Loader.csproj" />
|
<ProjectReference Include="..\Loader\RageCoop.Client.Loader.csproj" />
|
||||||
<ProjectReference Include="..\Scripts\RageCoop.Client.csproj" />
|
<ProjectReference Include="..\Scripts\RageCoop.Client.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -9,6 +9,7 @@ using GTA.Native;
|
|||||||
using RageCoop.Client.CefHost;
|
using RageCoop.Client.CefHost;
|
||||||
using RageCoop.Client.Scripting;
|
using RageCoop.Client.Scripting;
|
||||||
using RageCoop.Core;
|
using RageCoop.Core;
|
||||||
|
using static RageCoop.Client.Shared;
|
||||||
|
|
||||||
namespace RageCoop.Client.GUI
|
namespace RageCoop.Client.GUI
|
||||||
{
|
{
|
||||||
@ -27,23 +28,13 @@ namespace RageCoop.Client.GUI
|
|||||||
{
|
{
|
||||||
Main.CefRunning = true;
|
Main.CefRunning = true;
|
||||||
HookManager.Initialize();
|
HookManager.Initialize();
|
||||||
CefController.Initialize(@"RageCoop\SubProcess\RageCoop.Client.CefHost.exe");
|
CefController.Initialize(CefSubProcessPath);
|
||||||
CefController.OnCefMessage = m => API.Logger.Debug(m);
|
CefController.OnCefMessage = m => API.Logger.Debug(m);
|
||||||
HookManager.AddOverLay(CefOverlay);
|
HookManager.AddOverLay(CefOverlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CefClient ActiveClient { get; set; }
|
public static CefClient ActiveClient { get; set; }
|
||||||
|
|
||||||
public static void Test()
|
|
||||||
{
|
|
||||||
var c = CreateClient(new Size(640, 480));
|
|
||||||
c.Scale = 0.8f;
|
|
||||||
c.Opacity = 128;
|
|
||||||
Script.Wait(2000);
|
|
||||||
c.Controller.LoadUrl("https://ragecoop.online/");
|
|
||||||
ActiveClient = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Tick()
|
public static void Tick()
|
||||||
{
|
{
|
||||||
if (ActiveClient != null)
|
if (ActiveClient != null)
|
||||||
|
@ -21,6 +21,7 @@ using Console = GTA.Console;
|
|||||||
using Control = GTA.Control;
|
using Control = GTA.Control;
|
||||||
using Screen = System.Windows.Forms.Screen;
|
using Screen = System.Windows.Forms.Screen;
|
||||||
using Script = GTA.Script;
|
using Script = GTA.Script;
|
||||||
|
using static RageCoop.Client.Shared;
|
||||||
|
|
||||||
namespace RageCoop.Client
|
namespace RageCoop.Client
|
||||||
{
|
{
|
||||||
@ -58,35 +59,21 @@ namespace RageCoop.Client
|
|||||||
public Main()
|
public Main()
|
||||||
{
|
{
|
||||||
Util.StartUpCheck();
|
Util.StartUpCheck();
|
||||||
|
|
||||||
|
Directory.CreateDirectory(DataPath);
|
||||||
Console.Info(
|
Console.Info(
|
||||||
$"Starting {typeof(Main).FullName}, domain: {AppDomain.CurrentDomain.Id} {AppDomain.CurrentDomain.FriendlyName}");
|
$"Starting {typeof(Main).FullName}, domain: {AppDomain.CurrentDomain.Id} {AppDomain.CurrentDomain.FriendlyName}");
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Settings = Util.ReadSettings();
|
Settings = Util.ReadSettings();
|
||||||
if (Settings.DataDirectory.StartsWith("Scripts"))
|
|
||||||
{
|
|
||||||
var defaultDir = new Settings().DataDirectory;
|
|
||||||
Console.Warning("Data directory must be outside scripts folder, migrating to default direcoty: " +
|
|
||||||
defaultDir);
|
|
||||||
if (Directory.Exists(Settings.DataDirectory))
|
|
||||||
{
|
|
||||||
CoreUtils.CopyFilesRecursively(new DirectoryInfo(Settings.DataDirectory),
|
|
||||||
new DirectoryInfo(defaultDir));
|
|
||||||
Directory.Delete(Settings.DataDirectory, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
Settings.DataDirectory = defaultDir;
|
|
||||||
Util.SaveSettings();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
// GTA.UI.Notification.Show("Malformed configuration, overwriting with default values...");
|
Notification.Show("Malformed configuration, overwriting with default values...");
|
||||||
Settings = new Settings();
|
Settings = new Settings();
|
||||||
Util.SaveSettings();
|
Util.SaveSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
Directory.CreateDirectory(Settings.DataDirectory);
|
|
||||||
Logger = new Logger()
|
Logger = new Logger()
|
||||||
{
|
{
|
||||||
Writers = new List<StreamWriter> { CoreUtils.OpenWriter(LogPath) },
|
Writers = new List<StreamWriter> { CoreUtils.OpenWriter(LogPath) },
|
||||||
@ -153,9 +140,6 @@ namespace RageCoop.Client
|
|||||||
Counter.Restart();
|
Counter.Restart();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static string LogPath => $"{Settings.DataDirectory}\\RageCoop.Client.log";
|
|
||||||
|
|
||||||
private static void OnAborted(object sender, EventArgs e)
|
private static void OnAborted(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@ -484,7 +468,10 @@ namespace RageCoop.Client
|
|||||||
Resources.Unload();
|
Resources.Unload();
|
||||||
});
|
});
|
||||||
Memory.RestorePatches();
|
Memory.RestorePatches();
|
||||||
|
if (CefRunning)
|
||||||
|
{
|
||||||
CefManager.CleanUp();
|
CefManager.CleanUp();
|
||||||
|
}
|
||||||
HookManager.CleanUp();
|
HookManager.CleanUp();
|
||||||
DownloadManager.Cleanup();
|
DownloadManager.Cleanup();
|
||||||
Voice.ClearAll();
|
Voice.ClearAll();
|
||||||
|
@ -6,19 +6,15 @@ using GTA.Native;
|
|||||||
using GTA.UI;
|
using GTA.UI;
|
||||||
using LemonUI.Menus;
|
using LemonUI.Menus;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using RageCoop.Core;
|
||||||
using Console = GTA.Console;
|
using Console = GTA.Console;
|
||||||
|
using static RageCoop.Client.Shared;
|
||||||
|
|
||||||
namespace RageCoop.Client
|
namespace RageCoop.Client
|
||||||
{
|
{
|
||||||
internal class AnimDic
|
|
||||||
{
|
|
||||||
public string[] Animations;
|
|
||||||
public string DictionaryName;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static class DevToolMenu
|
internal static class DevToolMenu
|
||||||
{
|
{
|
||||||
private const string AnimationsPath = @"RageCoop\Data\animDictsCompact.json";
|
|
||||||
|
|
||||||
public static NativeMenu Menu = new NativeMenu("RAGECOOP", "DevTool", "Internal testing tools")
|
public static NativeMenu Menu = new NativeMenu("RAGECOOP", "DevTool", "Internal testing tools")
|
||||||
{
|
{
|
||||||
@ -26,31 +22,24 @@ namespace RageCoop.Client
|
|||||||
Alignment = Main.Settings.FlipMenu ? Alignment.Right : Alignment.Left
|
Alignment = Main.Settings.FlipMenu ? Alignment.Right : Alignment.Left
|
||||||
};
|
};
|
||||||
|
|
||||||
private static readonly NativeCheckboxItem enableItem = new NativeCheckboxItem("Enable");
|
private static readonly NativeCheckboxItem enableItem = new NativeCheckboxItem("Show weapon bones");
|
||||||
public static readonly NativeItem dumpItem = new NativeItem("Dump vehicle weapons");
|
public static readonly NativeItem DumpFixItem = new NativeItem("Dump weapon fixes");
|
||||||
public static readonly NativeItem dumpFixItem = new NativeItem("Dump weapon fixes");
|
public static readonly NativeItem GetAnimItem = new NativeItem("Get current animation");
|
||||||
public static readonly NativeItem dumpWHashItem = new NativeItem("Dump WeaponHash.cs");
|
public static readonly NativeItem DumpVwHashItem = new NativeItem("Dump VehicleWeaponHash.cs");
|
||||||
public static readonly NativeItem getAnimItem = new NativeItem("Get current animation");
|
|
||||||
|
|
||||||
public static readonly NativeItem dumpVWHashItem = new NativeItem("Dump VehicleWeaponHash.cs");
|
|
||||||
|
|
||||||
static DevToolMenu()
|
static DevToolMenu()
|
||||||
{
|
{
|
||||||
Menu.Banner.Color = Color.FromArgb(225, 0, 0, 0);
|
Menu.Banner.Color = Color.FromArgb(225, 0, 0, 0);
|
||||||
Menu.Title.Color = Color.FromArgb(255, 165, 0);
|
Menu.Title.Color = Color.FromArgb(255, 165, 0);
|
||||||
|
|
||||||
enableItem.Activated += enableItem_Activated;
|
enableItem.Activated += ShowBones;
|
||||||
enableItem.Checked = false;
|
enableItem.Checked = false;
|
||||||
|
DumpFixItem.Activated += (s, e) => WeaponUtil.DumpWeaponFix(WeaponFixDataPath);
|
||||||
dumpItem.Activated += DumpItem_Activated;
|
GetAnimItem.Activated += (s, e) =>
|
||||||
dumpVWHashItem.Activated += (s, e) => WeaponUtil.DumpVehicleWeaponHashes();
|
|
||||||
dumpWHashItem.Activated += (s, e) => WeaponUtil.DumpWeaponHashes();
|
|
||||||
dumpFixItem.Activated += (s, e) => WeaponUtil.DumpWeaponFix();
|
|
||||||
getAnimItem.Activated += (s, e) =>
|
|
||||||
{
|
{
|
||||||
if (File.Exists(AnimationsPath))
|
if (File.Exists(AnimationsDataPath))
|
||||||
{
|
{
|
||||||
var anims = JsonConvert.DeserializeObject<AnimDic[]>(File.ReadAllText(AnimationsPath));
|
var anims = JsonConvert.DeserializeObject<AnimDic[]>(File.ReadAllText(AnimationsDataPath));
|
||||||
foreach (var anim in anims)
|
foreach (var anim in anims)
|
||||||
foreach (var a in anim.Animations)
|
foreach (var a in anim.Animations)
|
||||||
if (Function.Call<bool>(Hash.IS_ENTITY_PLAYING_ANIM, Main.P, anim.DictionaryName, a, 3))
|
if (Function.Call<bool>(Hash.IS_ENTITY_PLAYING_ANIM, Main.P, anim.DictionaryName, a, 3))
|
||||||
@ -61,40 +50,17 @@ namespace RageCoop.Client
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Notification.Show($"~r~{AnimationsPath} not found");
|
Notification.Show($"~r~{AnimationsDataPath} not found");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Menu.Add(enableItem);
|
Menu.Add(enableItem);
|
||||||
Menu.Add(dumpItem);
|
Menu.Add(DumpVwHashItem);
|
||||||
Menu.Add(dumpVWHashItem);
|
Menu.Add(DumpFixItem);
|
||||||
Menu.Add(dumpWHashItem);
|
Menu.Add(GetAnimItem);
|
||||||
Menu.Add(dumpFixItem);
|
|
||||||
Menu.Add(getAnimItem);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void DumpItem_Activated(object sender, EventArgs e)
|
private static void ShowBones(object sender, EventArgs e)
|
||||||
{
|
|
||||||
dumpItem.Enabled = false;
|
|
||||||
Directory.CreateDirectory(@"RageCoop\Data\tmp");
|
|
||||||
var input = @"RageCoop\Data\tmp\vehicles.json";
|
|
||||||
var dumpLocation = @"RageCoop\Data\VehicleWeapons.json";
|
|
||||||
try
|
|
||||||
{
|
|
||||||
VehicleWeaponInfo.Dump(input, dumpLocation);
|
|
||||||
Console.Info("Weapon info dumped to " + dumpLocation);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.Error("~r~" + ex);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
dumpItem.Enabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void enableItem_Activated(object sender, EventArgs e)
|
|
||||||
{
|
{
|
||||||
if (enableItem.Checked)
|
if (enableItem.Checked)
|
||||||
{
|
{
|
||||||
|
@ -2,7 +2,9 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using RageCoop.Client.Scripting;
|
||||||
using RageCoop.Core;
|
using RageCoop.Core;
|
||||||
|
using static RageCoop.Client.Shared;
|
||||||
|
|
||||||
namespace RageCoop.Client
|
namespace RageCoop.Client
|
||||||
{
|
{
|
||||||
@ -45,6 +47,7 @@ namespace RageCoop.Client
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
Directory.CreateDirectory(ResourceFolder);
|
||||||
Main.Resources.Load(ResourceFolder, _resources.ToArray());
|
Main.Resources.Load(ResourceFolder, _resources.ToArray());
|
||||||
return new Packets.FileTransferResponse { ID = 0, Response = FileResponse.Loaded };
|
return new Packets.FileTransferResponse { ID = 0, Response = FileResponse.Loaded };
|
||||||
}
|
}
|
||||||
@ -57,8 +60,8 @@ namespace RageCoop.Client
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string ResourceFolder => Path.GetFullPath(Path.Combine(Main.Settings.DataDirectory, "Resources",
|
public static string ResourceFolder => Path.GetFullPath(Path.Combine(DataPath, "Resources",
|
||||||
Main.Settings.LastServerAddress.Replace(":", ".")));
|
API.ServerEndPoint.ToString().Replace(":", ".")));
|
||||||
|
|
||||||
public static event EventHandler<string> DownloadCompleted;
|
public static event EventHandler<string> DownloadCompleted;
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ using System.Resources;
|
|||||||
|
|
||||||
|
|
||||||
// Version informationr(
|
// Version informationr(
|
||||||
[assembly: AssemblyVersion("1.5.7.356")]
|
[assembly: AssemblyVersion("1.6.0.0")]
|
||||||
[assembly: AssemblyFileVersion("1.5.7.356")]
|
[assembly: AssemblyFileVersion("1.6.0.0")]
|
||||||
[assembly: NeutralResourcesLanguageAttribute( "en-US" )]
|
[assembly: NeutralResourcesLanguageAttribute( "en-US" )]
|
||||||
|
|
||||||
|
@ -45,7 +45,6 @@
|
|||||||
<Compile Include="Menus\Sub\DevToolMenu.cs" />
|
<Compile Include="Menus\Sub\DevToolMenu.cs" />
|
||||||
<Compile Include="Menus\Sub\ServersMenu.cs" />
|
<Compile Include="Menus\Sub\ServersMenu.cs" />
|
||||||
<Compile Include="Menus\Sub\SettingsMenu.cs" />
|
<Compile Include="Menus\Sub\SettingsMenu.cs" />
|
||||||
<Compile Include="Menus\Sub\UpdateMenu.cs" />
|
|
||||||
<Compile Include="Networking\Chat.cs" />
|
<Compile Include="Networking\Chat.cs" />
|
||||||
<Compile Include="Networking\DownloadManager.cs" />
|
<Compile Include="Networking\DownloadManager.cs" />
|
||||||
<Compile Include="Networking\HolePunch.cs" />
|
<Compile Include="Networking\HolePunch.cs" />
|
||||||
@ -54,6 +53,11 @@
|
|||||||
<Compile Include="Networking\Send.cs" />
|
<Compile Include="Networking\Send.cs" />
|
||||||
<Compile Include="Networking\Statistics.cs" />
|
<Compile Include="Networking\Statistics.cs" />
|
||||||
<Compile Include="PlayerList.cs" />
|
<Compile Include="PlayerList.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs">
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DesignTime>True</DesignTime>
|
||||||
|
<DependentUpon>AssemblyInfo.tt</DependentUpon>
|
||||||
|
</Compile>
|
||||||
<Compile Include="Scripting\API.cs" />
|
<Compile Include="Scripting\API.cs" />
|
||||||
<Compile Include="Scripting\BaseScript.cs" />
|
<Compile Include="Scripting\BaseScript.cs" />
|
||||||
<Compile Include="Scripting\ClientScript.cs" />
|
<Compile Include="Scripting\ClientScript.cs" />
|
||||||
@ -71,11 +75,11 @@
|
|||||||
<Compile Include="Sync\EntityPool.cs" />
|
<Compile Include="Sync\EntityPool.cs" />
|
||||||
<Compile Include="Sync\SyncEvents.cs" />
|
<Compile Include="Sync\SyncEvents.cs" />
|
||||||
<Compile Include="Sync\Voice.cs" />
|
<Compile Include="Sync\Voice.cs" />
|
||||||
<Compile Include="Util\AddOnDataProvider.cs" />
|
|
||||||
<Compile Include="Util\Memory.cs" />
|
<Compile Include="Util\Memory.cs" />
|
||||||
<Compile Include="Util\NativeCaller.cs" />
|
<Compile Include="Util\NativeCaller.cs" />
|
||||||
<Compile Include="Util\PedConfigFlags.cs" />
|
<Compile Include="Util\PedConfigFlags.cs" />
|
||||||
<Compile Include="Util\PedExtensions.cs" />
|
<Compile Include="Util\PedExtensions.cs" />
|
||||||
|
<Compile Include="Shared\Shared.cs" />
|
||||||
<Compile Include="Util\TaskType.cs" />
|
<Compile Include="Util\TaskType.cs" />
|
||||||
<Compile Include="Util\Util.cs" />
|
<Compile Include="Util\Util.cs" />
|
||||||
<Compile Include="Util\VehicleExtensions.cs" />
|
<Compile Include="Util\VehicleExtensions.cs" />
|
||||||
@ -143,6 +147,9 @@
|
|||||||
<Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
<Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
|
<HintPath>..\..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.Windows.Forms" />
|
<Reference Include="System.Windows.Forms" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -183,8 +190,13 @@
|
|||||||
<PostBuildEvent Condition=" '$(DevEnvDir)' != '*Undefined*'">
|
<PostBuildEvent Condition=" '$(DevEnvDir)' != '*Undefined*'">
|
||||||
"$(DevEnvDir)TextTransform.exe" -a !!BuildConfiguration!$(Configuration) "$(ProjectDir)Properties\AssemblyInfo.tt"
|
"$(DevEnvDir)TextTransform.exe" -a !!BuildConfiguration!$(Configuration) "$(ProjectDir)Properties\AssemblyInfo.tt"
|
||||||
</PostBuildEvent>
|
</PostBuildEvent>
|
||||||
|
<PostBuildEvent Condition="'$(Configuration)' != 'API' AND '$(SolutionDir)' != '*Undefined*'">
|
||||||
|
copy "$(SolutionDir)Client\Data" "..\Data" /y
|
||||||
|
</PostBuildEvent>
|
||||||
<PreBuildEvent Condition=" '$(SolutionDir)' != '*Undefined*'">
|
<PreBuildEvent Condition=" '$(SolutionDir)' != '*Undefined*'">
|
||||||
dotnet build -c $(Configuration) "$(SolutionDir)Client\CefHost\RageCoop.Client.CefHost.csproj"
|
dotnet build -c $(Configuration) "$(SolutionDir)Client\CefHost\RageCoop.Client.CefHost.csproj"
|
||||||
</PreBuildEvent>
|
</PreBuildEvent>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)' != 'API'">
|
||||||
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
@ -1,2 +1,3 @@
|
|||||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||||
|
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=shared/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=util/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=util/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
@ -85,24 +85,6 @@ namespace RageCoop.Client.Scripting
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static class Events
|
public static class Events
|
||||||
{
|
{
|
||||||
/// <summary>
|
|
||||||
/// This is equivalent of <see cref="Script.KeyDown" />
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// Calling <see cref="GTA.Script.Yield" /> in the handler will interfer other scripts, subscribe to
|
|
||||||
/// <see cref="GTA.Script.KeyDown" /> instead.
|
|
||||||
/// </remarks>
|
|
||||||
[Obsolete] public static KeyEventHandler OnKeyDown;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// This is equivalent of <see cref="Script.KeyUp" />
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// Calling <see cref="GTA.Script.Yield" /> in the handler will interfer other scripts, subscribe to
|
|
||||||
/// <see cref="GTA.Script.KeyUp" /> instead.
|
|
||||||
/// </remarks>
|
|
||||||
[Obsolete] public static KeyEventHandler OnKeyUp;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The local player is dead
|
/// The local player is dead
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -128,16 +110,6 @@ namespace RageCoop.Client.Scripting
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static event EventHandler<SyncedPed> OnPedDeleted;
|
public static event EventHandler<SyncedPed> OnPedDeleted;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// This is equivalent of <see cref="GTA.Script.Tick" />.
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// Calling <see cref="GTA.Script.Yield" /> in the handler will interfer other scripts, subscribe to
|
|
||||||
/// <see cref="GTA.Script.Tick" /> instead.
|
|
||||||
/// </remarks>
|
|
||||||
[Obsolete]
|
|
||||||
public static event EmptyEvent OnTick;
|
|
||||||
|
|
||||||
#region DELEGATES
|
#region DELEGATES
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -179,21 +151,6 @@ namespace RageCoop.Client.Scripting
|
|||||||
OnPlayerDied?.Invoke();
|
OnPlayerDied?.Invoke();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void InvokeTick()
|
|
||||||
{
|
|
||||||
OnTick?.Invoke();
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static void InvokeKeyDown(object s, KeyEventArgs e)
|
|
||||||
{
|
|
||||||
OnKeyDown?.Invoke(s, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static void InvokeKeyUp(object s, KeyEventArgs e)
|
|
||||||
{
|
|
||||||
OnKeyUp?.Invoke(s, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static void InvokeCustomEventReceived(Packets.CustomEvent p)
|
internal static void InvokeCustomEventReceived(Packets.CustomEvent p)
|
||||||
{
|
{
|
||||||
var args = new CustomEventReceivedArgs { Hash = p.Hash, Args = p.Args };
|
var args = new CustomEventReceivedArgs { Hash = p.Hash, Args = p.Args };
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using GTA;
|
using GTA;
|
||||||
@ -264,32 +265,7 @@ namespace RageCoop.Client.Scripting
|
|||||||
|
|
||||||
private static InputArgument GetInputArgument(object obj)
|
private static InputArgument GetInputArgument(object obj)
|
||||||
{
|
{
|
||||||
// Implicit conversion
|
return Unsafe.As<InputArgument>(obj);
|
||||||
switch (obj)
|
|
||||||
{
|
|
||||||
case byte _:
|
|
||||||
return (byte)obj;
|
|
||||||
case short _:
|
|
||||||
return (short)obj;
|
|
||||||
case ushort _:
|
|
||||||
return (ushort)obj;
|
|
||||||
case int _:
|
|
||||||
return (int)obj;
|
|
||||||
case uint _:
|
|
||||||
return (uint)obj;
|
|
||||||
case long _:
|
|
||||||
return (long)obj;
|
|
||||||
case ulong _:
|
|
||||||
return (ulong)obj;
|
|
||||||
case float _:
|
|
||||||
return (float)obj;
|
|
||||||
case bool _:
|
|
||||||
return (bool)obj;
|
|
||||||
case string _:
|
|
||||||
return obj as string;
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -74,10 +74,6 @@ namespace RageCoop.Client
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public int WorldPedSoftLimit { get; set; } = 30;
|
public int WorldPedSoftLimit { get; set; } = 30;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The directory where log and resources downloaded from server will be placed.
|
|
||||||
/// </summary>
|
|
||||||
public string DataDirectory { get; set; } = "RageCoop\\Data";
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Show the owner name of the entity you're aiming at
|
/// Show the owner name of the entity you're aiming at
|
||||||
|
24
Client/Scripts/Shared/Shared.cs
Normal file
24
Client/Scripts/Shared/Shared.cs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace RageCoop.Client
|
||||||
|
{
|
||||||
|
internal static partial class Shared
|
||||||
|
{
|
||||||
|
public static string BasePath = "RageCoop";
|
||||||
|
public static string DataPath = Path.Combine(BasePath, "Data");
|
||||||
|
public static string LogPath = Path.Combine(DataPath, "RageCoop.Client.log");
|
||||||
|
public static string SettingsPath = Path.Combine(DataPath,"Setting.json");
|
||||||
|
|
||||||
|
public static string VehicleWeaponDataPath = Path.Combine(DataPath, "VehicleWeapons.json");
|
||||||
|
public static string WeaponFixDataPath = Path.Combine(DataPath, "WeaponFixes.json");
|
||||||
|
public static string WeaponInfoDataPath = Path.Combine(DataPath, "Weapons.json");
|
||||||
|
public static string AnimationsDataPath = Path.Combine(DataPath, "Animations.json");
|
||||||
|
|
||||||
|
public static string CefSubProcessPath = Path.Combine(BasePath, "SubProcess", "RageCoop.Client.CefHost.exe");
|
||||||
|
}
|
||||||
|
}
|
@ -1,59 +0,0 @@
|
|||||||
using GTA;
|
|
||||||
|
|
||||||
namespace RageCoop.Client
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Class providing support for addon mods
|
|
||||||
/// </summary>
|
|
||||||
internal class AddOnDataProvider
|
|
||||||
{
|
|
||||||
public static int GetMuzzleIndex(Model model)
|
|
||||||
{
|
|
||||||
switch (model.Hash)
|
|
||||||
{
|
|
||||||
// f14a2
|
|
||||||
case -848721350:
|
|
||||||
return 48;
|
|
||||||
|
|
||||||
// f15e
|
|
||||||
case 881261972:
|
|
||||||
return 32;
|
|
||||||
|
|
||||||
// f16c
|
|
||||||
case -2051171080:
|
|
||||||
return 25;
|
|
||||||
|
|
||||||
// F22A
|
|
||||||
case 2061630439:
|
|
||||||
return 14;
|
|
||||||
|
|
||||||
// f35c
|
|
||||||
case -343547392:
|
|
||||||
return 44;
|
|
||||||
|
|
||||||
// mig29a
|
|
||||||
case 513887552:
|
|
||||||
return 18;
|
|
||||||
|
|
||||||
// su30sm
|
|
||||||
case -733985185:
|
|
||||||
return 34;
|
|
||||||
|
|
||||||
// su33
|
|
||||||
case -722216722:
|
|
||||||
return 34;
|
|
||||||
|
|
||||||
// su35s
|
|
||||||
case -268602544:
|
|
||||||
return 28;
|
|
||||||
|
|
||||||
// su57
|
|
||||||
case 1490050781:
|
|
||||||
return 21;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -11,6 +11,7 @@ using LemonUI.Elements;
|
|||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using RageCoop.Core;
|
using RageCoop.Core;
|
||||||
using Font = GTA.UI.Font;
|
using Font = GTA.UI.Font;
|
||||||
|
using static RageCoop.Client.Shared;
|
||||||
|
|
||||||
[assembly: InternalsVisibleTo("RageCoop.Client.Installer")]
|
[assembly: InternalsVisibleTo("RageCoop.Client.Installer")]
|
||||||
|
|
||||||
@ -18,7 +19,6 @@ namespace RageCoop.Client
|
|||||||
{
|
{
|
||||||
internal static class Util
|
internal static class Util
|
||||||
{
|
{
|
||||||
public static string SettingsPath = "RageCoop\\Settings.json";
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The location of the cursor on screen between 0 and 1.
|
/// The location of the cursor on screen between 0 and 1.
|
||||||
|
@ -7,240 +7,97 @@ using GTA;
|
|||||||
using GTA.Math;
|
using GTA.Math;
|
||||||
using GTA.Native;
|
using GTA.Native;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using RageCoop.Client.Scripting;
|
||||||
using RageCoop.Core;
|
using RageCoop.Core;
|
||||||
using Console = GTA.Console;
|
using Console = GTA.Console;
|
||||||
|
using static RageCoop.Client.Shared;
|
||||||
|
|
||||||
namespace RageCoop.Client
|
namespace RageCoop.Client
|
||||||
{
|
{
|
||||||
#region DUMP
|
|
||||||
|
|
||||||
internal class VehicleInfo
|
|
||||||
{
|
|
||||||
public VehicleBone[] Bones;
|
|
||||||
public uint Hash;
|
|
||||||
public string Name;
|
|
||||||
public string[] Weapons;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal class VehicleBone
|
|
||||||
{
|
|
||||||
public uint BoneID;
|
|
||||||
public uint BoneIndex;
|
|
||||||
public string BoneName;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal class WeaponBones
|
|
||||||
{
|
|
||||||
public VehicleBone[] Bones;
|
|
||||||
public string Name;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal class VehicleWeaponInfo
|
|
||||||
{
|
|
||||||
public uint Hash;
|
|
||||||
public string Name;
|
|
||||||
public Dictionary<uint, WeaponBones> Weapons = new Dictionary<uint, WeaponBones>();
|
|
||||||
|
|
||||||
public static void Dump(string input, string output)
|
|
||||||
{
|
|
||||||
Console.Info("Generating " + output);
|
|
||||||
if (!File.Exists(input))
|
|
||||||
{
|
|
||||||
Console.Info("Downloading");
|
|
||||||
HttpHelper.DownloadFile(
|
|
||||||
"https://raw.githubusercontent.com/DurtyFree/gta-v-data-dumps/master/vehicles.json", input);
|
|
||||||
}
|
|
||||||
|
|
||||||
Console.Info("Deserialising");
|
|
||||||
var infos = JsonConvert.DeserializeObject<VehicleInfo[]>(File.ReadAllText(input));
|
|
||||||
Console.Info("Serialising");
|
|
||||||
File.WriteAllText(output,
|
|
||||||
JsonConvert.SerializeObject(
|
|
||||||
infos.Select(x => FromVehicle(x)).Where(x => x != null),
|
|
||||||
Formatting.Indented));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static VehicleWeaponInfo FromVehicle(VehicleInfo info)
|
|
||||||
{
|
|
||||||
if (info.Weapons.Length == 0) return null;
|
|
||||||
var result = new VehicleWeaponInfo { Hash = info.Hash, Name = info.Name };
|
|
||||||
for (var i = 0; i < info.Weapons.Length; i++)
|
|
||||||
result.Weapons.Add((uint)Game.GenerateHash(info.Weapons[i])
|
|
||||||
, new WeaponBones
|
|
||||||
{
|
|
||||||
Name = info.Weapons[i],
|
|
||||||
Bones = info.Bones.Where(x =>
|
|
||||||
x.BoneName.StartsWith($"weapon_{i + 1}") && !x.BoneName.EndsWith("rot")).ToArray()
|
|
||||||
});
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal class WeaponInfo
|
|
||||||
{
|
|
||||||
public uint Hash;
|
|
||||||
public string Name;
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Explicit, Size = 312)]
|
|
||||||
public struct DlcWeaponData
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
internal class WeaponFix
|
internal class WeaponFix
|
||||||
{
|
{
|
||||||
public Dictionary<uint, string> Bullet = new Dictionary<uint, string>();
|
public Dictionary<uint, string> Bullet = new Dictionary<uint, string>();
|
||||||
public Dictionary<uint, string> Lazer = new Dictionary<uint, string>();
|
public Dictionary<uint, string> Lazer = new Dictionary<uint, string>();
|
||||||
|
public Dictionary<uint, string> Others = new Dictionary<uint, string>();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
internal static class WeaponUtil
|
internal static class WeaponUtil
|
||||||
{
|
{
|
||||||
public const string VehicleWeaponLocation = @"RageCoop\Data\VehicleWeapons.json";
|
|
||||||
public const string WeaponFixLocation = @"RageCoop\Data\WeaponFixes.json";
|
|
||||||
public static Dictionary<uint, VehicleWeaponInfo> VehicleWeapons = new Dictionary<uint, VehicleWeaponInfo>();
|
public static Dictionary<uint, VehicleWeaponInfo> VehicleWeapons = new Dictionary<uint, VehicleWeaponInfo>();
|
||||||
public static WeaponFix WeaponFix;
|
public static WeaponFix WeaponFix;
|
||||||
|
public static Dictionary<uint, WeaponInfo> Weapons;
|
||||||
public static readonly HashSet<uint> ExplosiveBullets = new HashSet<uint>
|
|
||||||
{
|
|
||||||
(uint)VehicleWeaponHash.PlayerLazer,
|
|
||||||
(uint)WeaponHash.Railgun,
|
|
||||||
1638077257
|
|
||||||
};
|
|
||||||
|
|
||||||
public static readonly HashSet<WeaponHash> ProjectileWeapons = new HashSet<WeaponHash>
|
|
||||||
{
|
|
||||||
WeaponHash.HomingLauncher,
|
|
||||||
WeaponHash.RPG,
|
|
||||||
WeaponHash.Firework,
|
|
||||||
WeaponHash.UpNAtomizer,
|
|
||||||
WeaponHash.GrenadeLauncher,
|
|
||||||
WeaponHash.GrenadeLauncherSmoke,
|
|
||||||
WeaponHash.CompactGrenadeLauncher,
|
|
||||||
WeaponHash.FlareGun
|
|
||||||
};
|
|
||||||
|
|
||||||
public static readonly HashSet<VehicleWeaponHash> VehicleProjectileWeapons = new HashSet<VehicleWeaponHash>
|
|
||||||
{
|
|
||||||
VehicleWeaponHash.PlaneRocket,
|
|
||||||
VehicleWeaponHash.SpaceRocket,
|
|
||||||
VehicleWeaponHash.Tank,
|
|
||||||
(VehicleWeaponHash)3565779982, // STROMBERG missiles
|
|
||||||
(VehicleWeaponHash)3169388763 // SCRAMJET missiles
|
|
||||||
};
|
|
||||||
|
|
||||||
static WeaponUtil()
|
static WeaponUtil()
|
||||||
{
|
{
|
||||||
if (!File.Exists(VehicleWeaponLocation))
|
|
||||||
{
|
|
||||||
Directory.CreateDirectory(@"RageCoop\Data\tmp");
|
|
||||||
var input = @"RageCoop\Data\tmp\vehicles.json";
|
|
||||||
VehicleWeaponInfo.Dump(input, VehicleWeaponLocation);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse and load to memory
|
// Parse and load to memory
|
||||||
foreach (var w in JsonConvert.DeserializeObject<VehicleWeaponInfo[]>(
|
foreach (var w in JsonConvert.DeserializeObject<VehicleWeaponInfo[]>(
|
||||||
File.ReadAllText(VehicleWeaponLocation))) VehicleWeapons.Add(w.Hash, w);
|
File.ReadAllText(VehicleWeaponDataPath))) VehicleWeapons.Add(w.Hash, w);
|
||||||
WeaponFix = JsonConvert.DeserializeObject<WeaponFix>(File.ReadAllText(WeaponFixLocation));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void DumpWeaponFix(string path = WeaponFixLocation)
|
Weapons = JsonConvert.DeserializeObject<Dictionary<uint, WeaponInfo>>(
|
||||||
|
File.ReadAllText(WeaponInfoDataPath));
|
||||||
|
|
||||||
|
if (File.Exists(WeaponFixDataPath))
|
||||||
|
{
|
||||||
|
WeaponFix = JsonConvert.DeserializeObject<WeaponFix>(File.ReadAllText(WeaponFixDataPath));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
API.Logger.Warning("Weapon fix data not found");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static void DumpWeaponFix(string path)
|
||||||
{
|
{
|
||||||
var P = Game.Player.Character;
|
var P = Game.Player.Character;
|
||||||
var pos = P.Position + Vector3.WorldUp * 3;
|
var pos = P.Position + Vector3.WorldUp * 3;
|
||||||
var types = new HashSet<int> { 3 };
|
var types = new HashSet<int> { 3 };
|
||||||
P.IsInvincible = true;
|
P.IsInvincible = true;
|
||||||
var fix = new WeaponFix();
|
var fix = new WeaponFix();
|
||||||
foreach (VehicleWeaponHash v in Enum.GetValues(typeof(VehicleWeaponHash)))
|
foreach (var w in Weapons)
|
||||||
{
|
{
|
||||||
Console.Info("Testing: " + v);
|
Console.Info("Testing " + w.Value.Name);
|
||||||
if (types.Contains(v.GetWeaponDamageType()))
|
if (w.Value.FireType != "PROJECTILE")
|
||||||
{
|
{
|
||||||
var asset = new WeaponAsset((int)v);
|
var asset = new WeaponAsset(w.Key);
|
||||||
asset.Request(1000);
|
asset.Request(1000);
|
||||||
World.ShootBullet(pos, pos + Vector3.WorldUp, P, asset, 0, 1000);
|
World.ShootBullet(pos, pos + Vector3.WorldUp, P, asset, 0, 1000);
|
||||||
if (!Function.Call<bool>(Hash.IS_BULLET_IN_AREA, pos.X, pos.Y, pos.Z, 10f, true) &&
|
if (!Function.Call<bool>(Hash.IS_BULLET_IN_AREA, pos.X, pos.Y, pos.Z, 10f, true) &&
|
||||||
!Function.Call<bool>(Hash.IS_PROJECTILE_IN_AREA, pos.X - 10, pos.Y - 10, pos.Z - 10, pos.X + 10,
|
!Function.Call<bool>(Hash.IS_PROJECTILE_IN_AREA, pos.X - 10, pos.Y - 10, pos.Z - 10, pos.X + 10,
|
||||||
pos.Y + 10, pos.Z + 10, true))
|
pos.Y + 10, pos.Z + 10, true))
|
||||||
fix.Bullet.Add((uint)v, $"{nameof(VehicleWeaponHash)}.{v}");
|
{
|
||||||
|
switch (w.Value.DamageType)
|
||||||
|
{
|
||||||
|
case "BULLET":
|
||||||
|
fix.Bullet.Add(w.Key, w.Value.Name);
|
||||||
|
break;
|
||||||
|
case "EXPLOSIVE":
|
||||||
|
fix.Lazer.Add(w.Key, w.Value.Name);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fix.Others.Add(w.Key, w.Value.Name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
foreach (var p in World.GetAllProjectiles()) p.Delete();
|
foreach (var p in World.GetAllProjectiles()) p.Delete();
|
||||||
Script.Wait(50);
|
Script.Wait(50);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (WeaponHash w in Enum.GetValues(typeof(WeaponHash)))
|
|
||||||
if (types.Contains(w.GetWeaponDamageType()))
|
|
||||||
{
|
|
||||||
Console.Info("Testing: " + w);
|
|
||||||
var asset = new WeaponAsset((int)w);
|
|
||||||
asset.Request(1000);
|
|
||||||
World.ShootBullet(pos, pos + Vector3.WorldUp, P, asset, 0, 1000);
|
|
||||||
if (!Function.Call<bool>(Hash.IS_BULLET_IN_AREA, pos.X, pos.Y, pos.Z, 10f, true) &&
|
|
||||||
!Function.Call<bool>(Hash.IS_PROJECTILE_IN_AREA, pos.X - 10, pos.Y - 10, pos.Z - 10, pos.X + 10,
|
|
||||||
pos.Y + 10, pos.Z + 10, true))
|
|
||||||
fix.Bullet.Add((uint)w, $"{nameof(WeaponHash)}.{w}");
|
|
||||||
foreach (var p in World.GetAllProjectiles()) p.Delete();
|
|
||||||
Script.Wait(50);
|
|
||||||
}
|
|
||||||
|
|
||||||
AddLazer(VehicleWeaponHash.PlayerSavage);
|
|
||||||
AddLazer(VehicleWeaponHash.StrikeforceCannon);
|
|
||||||
|
|
||||||
void AddLazer(dynamic hash)
|
|
||||||
{
|
|
||||||
fix.Lazer.Add((uint)hash, $"{hash.GetType().Name}.{hash.ToString()}");
|
|
||||||
}
|
|
||||||
|
|
||||||
File.WriteAllText(path, JsonConvert.SerializeObject(fix, Formatting.Indented));
|
File.WriteAllText(path, JsonConvert.SerializeObject(fix, Formatting.Indented));
|
||||||
|
|
||||||
P.IsInvincible = false;
|
P.IsInvincible = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DumpWeaponHashes(string path = VehicleWeaponLocation)
|
|
||||||
{
|
|
||||||
var hashes = new Dictionary<uint, string>();
|
|
||||||
foreach (var wep in JsonConvert.DeserializeObject<WeaponInfo[]>(
|
|
||||||
HttpHelper.DownloadString(
|
|
||||||
"https://raw.githubusercontent.com/DurtyFree/gta-v-data-dumps/master/weapons.json")))
|
|
||||||
{
|
|
||||||
if (!wep.Name.StartsWith("WEAPON")) continue;
|
|
||||||
hashes.Add(wep.Hash, wep.Name);
|
|
||||||
}
|
|
||||||
|
|
||||||
var output = "public enum WeaponHash : uint\r\n{";
|
|
||||||
var lines = new List<string>();
|
|
||||||
foreach (var hash in hashes)
|
|
||||||
lines.Add($"{CoreUtils.FormatToSharpStyle(hash.Value, 7)} = {hash.Key.ToHex()}");
|
|
||||||
lines.Sort();
|
|
||||||
foreach (var l in lines) output += $"\r\n\t{l},";
|
|
||||||
output += "\r\n}";
|
|
||||||
File.WriteAllText(path, output);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void DumpVehicleWeaponHashes(string path = @"RageCoop\Data\VehicleWeaponHash.cs")
|
|
||||||
{
|
|
||||||
var hashes = new Dictionary<uint, string>();
|
|
||||||
foreach (var veh in VehicleWeapons.Values)
|
|
||||||
foreach (var hash in veh.Weapons)
|
|
||||||
if (!hashes.ContainsKey(hash.Key))
|
|
||||||
hashes.Add(hash.Key, hash.Value.Name);
|
|
||||||
var output = "public enum VehicleWeaponHash : uint\r\n{\r\n\tInvalid = 0xFFFFFFFF,";
|
|
||||||
var lines = new List<string>();
|
|
||||||
foreach (var hash in hashes) lines.Add($"{CoreUtils.FormatToSharpStyle(hash.Value)} = {hash.Key.ToHex()}");
|
|
||||||
lines.Sort();
|
|
||||||
foreach (var l in lines) output += $"\r\n\t{l},";
|
|
||||||
output += "\r\n}";
|
|
||||||
File.WriteAllText(path, output);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static uint GetWeaponFix(uint hash)
|
public static uint GetWeaponFix(uint hash)
|
||||||
{
|
{
|
||||||
if (WeaponFix.Bullet.TryGetValue(hash, out var _)) return (uint)VehicleWeaponHash.SubcarMg;
|
|
||||||
if (WeaponFix.Lazer.TryGetValue(hash, out var _)) return (uint)VehicleWeaponHash.PlayerLazer;
|
if (WeaponFix.Bullet.TryGetValue(hash, out _)) return 0x461DDDB0;
|
||||||
|
if (WeaponFix.Lazer.TryGetValue(hash, out _)) return 0xE2822A29;
|
||||||
|
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static Dictionary<uint, bool> GetWeaponComponents(this Weapon weapon)
|
public static Dictionary<uint, bool> GetWeaponComponents(this Weapon weapon)
|
||||||
{
|
{
|
||||||
Dictionary<uint, bool> result = null;
|
Dictionary<uint, bool> result = null;
|
||||||
@ -289,21 +146,10 @@ namespace RageCoop.Client
|
|||||||
public static bool IsUsingProjectileWeapon(this Ped p)
|
public static bool IsUsingProjectileWeapon(this Ped p)
|
||||||
{
|
{
|
||||||
var vp = p.VehicleWeapon;
|
var vp = p.VehicleWeapon;
|
||||||
var type = Function.Call<int>(Hash.GET_WEAPON_DAMAGE_TYPE, vp);
|
return Weapons.TryGetValue(vp != VehicleWeaponHash.Invalid ?
|
||||||
if (vp != VehicleWeaponHash.Invalid)
|
(uint)vp : (uint)p.Weapons.Current.Hash, out var info)
|
||||||
return type == 3
|
&& info.FireType == "PROJECTILE";
|
||||||
? false
|
|
||||||
: VehicleProjectileWeapons.Contains(vp) || (type == 5 && !ExplosiveBullets.Contains((uint)vp));
|
|
||||||
|
|
||||||
var w = p.Weapons.Current;
|
|
||||||
return w.Group == WeaponGroup.Thrown || ProjectileWeapons.Contains(w.Hash);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int GetWeaponDamageType<T>(this T hash) where T : Enum
|
|
||||||
{
|
|
||||||
return Function.Call<int>(Hash.GET_WEAPON_DAMAGE_TYPE, hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string GetFlashFX(this WeaponHash w, bool veh)
|
public static string GetFlashFX(this WeaponHash w, bool veh)
|
||||||
{
|
{
|
||||||
if (veh)
|
if (veh)
|
||||||
@ -361,18 +207,4 @@ namespace RageCoop.Client
|
|||||||
return Function.Call<WeaponGroup>(Hash.GET_WEAPONTYPE_GROUP, hash);
|
return Function.Call<WeaponGroup>(Hash.GET_WEAPONTYPE_GROUP, hash);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
class WeaponInfo
|
|
||||||
{
|
|
||||||
public string Name;
|
|
||||||
public string MuzzleFx;
|
|
||||||
}
|
|
||||||
public class AimingInfo
|
|
||||||
{
|
|
||||||
public string Name;
|
|
||||||
public float HeadingLimit;
|
|
||||||
public float SweepPitchMin;
|
|
||||||
public float SweepPitchMax;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
}
|
@ -11,6 +11,10 @@
|
|||||||
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
|
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
</assemblyBinding>
|
</assemblyBinding>
|
||||||
</runtime>
|
</runtime>
|
||||||
</configuration>
|
</configuration>
|
@ -1,5 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
<packages>
|
<packages>
|
||||||
<package id="Microsoft.Extensions.ObjectPool" version="6.0.8" targetFramework="net48" />
|
<package id="Microsoft.Extensions.ObjectPool" version="6.0.8" targetFramework="net48" />
|
||||||
<package id="Microsoft.NETCore.Platforms" version="1.1.0" targetFramework="net48" />
|
<package id="Microsoft.NETCore.Platforms" version="1.1.0" targetFramework="net48" />
|
||||||
@ -45,7 +44,7 @@
|
|||||||
<package id="System.Reflection.Primitives" version="4.3.0" targetFramework="net48" />
|
<package id="System.Reflection.Primitives" version="4.3.0" targetFramework="net48" />
|
||||||
<package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="net48" />
|
<package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="net48" />
|
||||||
<package id="System.Runtime" version="4.3.0" targetFramework="net48" />
|
<package id="System.Runtime" version="4.3.0" targetFramework="net48" />
|
||||||
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net48" />
|
<package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="net48" />
|
||||||
<package id="System.Runtime.Extensions" version="4.3.0" targetFramework="net48" />
|
<package id="System.Runtime.Extensions" version="4.3.0" targetFramework="net48" />
|
||||||
<package id="System.Runtime.Handles" version="4.3.0" targetFramework="net48" />
|
<package id="System.Runtime.Handles" version="4.3.0" targetFramework="net48" />
|
||||||
<package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="net48" />
|
<package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="net48" />
|
||||||
|
@ -11,6 +11,7 @@ using System.Runtime.CompilerServices;
|
|||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Xml;
|
||||||
using GTA;
|
using GTA;
|
||||||
using GTA.Math;
|
using GTA.Math;
|
||||||
using Lidgren.Network;
|
using Lidgren.Network;
|
||||||
@ -42,7 +43,7 @@ namespace RageCoop.Core
|
|||||||
"ScriptHookVDotNet"
|
"ScriptHookVDotNet"
|
||||||
};
|
};
|
||||||
|
|
||||||
public static string FormatToSharpStyle(string input, int offset = 14)
|
public static string FormatToSharpStyle(string input, int offset)
|
||||||
{
|
{
|
||||||
var ss = input.Substring(offset).Split("_".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
|
var ss = input.Substring(offset).Split("_".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
|
||||||
// Replace first character with upper case
|
// Replace first character with upper case
|
||||||
@ -354,6 +355,35 @@ namespace RageCoop.Core
|
|||||||
{
|
{
|
||||||
return new StreamWriter(File.Open(path, mode, access, share));
|
return new StreamWriter(File.Open(path, mode, access, share));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static float GetFloat(this XmlNode n)
|
||||||
|
{
|
||||||
|
return float.Parse(n.Attributes["value"].Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Generate jenkins one-at-a-time hash from specified string (lower)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static uint JoaatHash(string key)
|
||||||
|
{
|
||||||
|
var i = 0;
|
||||||
|
uint hash = 0;
|
||||||
|
while (i != key.Length)
|
||||||
|
{
|
||||||
|
hash += char.ToLowerInvariant(key[i++]);
|
||||||
|
hash += hash << 10;
|
||||||
|
hash ^= hash >> 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
hash += hash << 3;
|
||||||
|
hash ^= hash >> 11;
|
||||||
|
hash += hash << 15;
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class IpInfo
|
internal class IpInfo
|
||||||
|
136
Core/VehicleWeaponInfo.cs
Normal file
136
Core/VehicleWeaponInfo.cs
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
using Newtonsoft.Json;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using Console = System.Console;
|
||||||
|
using System.Xml;
|
||||||
|
using Formatting = Newtonsoft.Json.Formatting;
|
||||||
|
|
||||||
|
namespace RageCoop.Core
|
||||||
|
{
|
||||||
|
|
||||||
|
internal class AnimDic
|
||||||
|
{
|
||||||
|
public string[] Animations;
|
||||||
|
public string DictionaryName;
|
||||||
|
|
||||||
|
public static AnimDic[] Dump(string input, string output)
|
||||||
|
{
|
||||||
|
|
||||||
|
Console.WriteLine("Generating " + output);
|
||||||
|
if (!File.Exists(input))
|
||||||
|
{
|
||||||
|
Console.WriteLine("Downloading");
|
||||||
|
HttpHelper.DownloadFile(
|
||||||
|
"https://raw.githubusercontent.com/DurtyFree/gta-v-data-dumps/master/animDictsCompact.json", input);
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("Deserializing");
|
||||||
|
var anims = JsonConvert.DeserializeObject<AnimDic[]>(File.ReadAllText(input));
|
||||||
|
Console.WriteLine("Serializing");
|
||||||
|
File.WriteAllText(output, JsonConvert.SerializeObject(anims, Formatting.Indented));
|
||||||
|
return anims;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
internal class WeaponInfo
|
||||||
|
{
|
||||||
|
public string Audio;
|
||||||
|
public float Damage;
|
||||||
|
public string DamageType;
|
||||||
|
public string FireType;
|
||||||
|
public bool IsVehicleWeapon;
|
||||||
|
public string Name;
|
||||||
|
public float Speed;
|
||||||
|
public WeaponInfo() { }
|
||||||
|
public WeaponInfo(XmlNode node)
|
||||||
|
{
|
||||||
|
if (node.Attributes["type"].Value != "CWeaponInfo") throw new Exception("Not a CWeaponInfo node");
|
||||||
|
foreach (XmlNode info in node.ChildNodes)
|
||||||
|
switch (info.Name)
|
||||||
|
{
|
||||||
|
case "Name":
|
||||||
|
Name = info.InnerText;
|
||||||
|
break;
|
||||||
|
case "Audio":
|
||||||
|
Audio = info.InnerText;
|
||||||
|
break;
|
||||||
|
case "FireType":
|
||||||
|
FireType = info.InnerText;
|
||||||
|
break;
|
||||||
|
case "DamageType":
|
||||||
|
DamageType = info.InnerText;
|
||||||
|
break;
|
||||||
|
case "Damage":
|
||||||
|
Damage = info.GetFloat();
|
||||||
|
break;
|
||||||
|
case "Speed":
|
||||||
|
Speed = info.GetFloat();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
IsVehicleWeapon = Name.StartsWith("VEHICLE_WEAPON");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
internal class VehicleInfo
|
||||||
|
{
|
||||||
|
public VehicleBone[] Bones;
|
||||||
|
public uint Hash;
|
||||||
|
public string Name;
|
||||||
|
public string[] Weapons;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class VehicleBone
|
||||||
|
{
|
||||||
|
public uint BoneID;
|
||||||
|
public uint BoneIndex;
|
||||||
|
public string BoneName;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class WeaponBones
|
||||||
|
{
|
||||||
|
public VehicleBone[] Bones;
|
||||||
|
public string Name;
|
||||||
|
}
|
||||||
|
internal class VehicleWeaponInfo
|
||||||
|
{
|
||||||
|
public uint Hash;
|
||||||
|
public string Name;
|
||||||
|
public Dictionary<uint, WeaponBones> Weapons = new Dictionary<uint, WeaponBones>();
|
||||||
|
|
||||||
|
public static void Dump(string input, string output)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Generating " + output);
|
||||||
|
if (!File.Exists(input))
|
||||||
|
{
|
||||||
|
Console.WriteLine("Downloading");
|
||||||
|
HttpHelper.DownloadFile(
|
||||||
|
"https://raw.githubusercontent.com/DurtyFree/gta-v-data-dumps/master/vehicles.json", input);
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("Deserializing");
|
||||||
|
var infos = JsonConvert.DeserializeObject<VehicleInfo[]>(File.ReadAllText(input));
|
||||||
|
Console.WriteLine("Serializing");
|
||||||
|
File.WriteAllText(output,
|
||||||
|
JsonConvert.SerializeObject(
|
||||||
|
infos.Select(FromVehicle).Where(x => x != null),
|
||||||
|
Formatting.Indented));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static VehicleWeaponInfo FromVehicle(VehicleInfo info)
|
||||||
|
{
|
||||||
|
if (info.Weapons.Length == 0) return null;
|
||||||
|
var result = new VehicleWeaponInfo { Hash = info.Hash, Name = info.Name };
|
||||||
|
for (var i = 0; i < info.Weapons.Length; i++)
|
||||||
|
result.Weapons.Add(CoreUtils.JoaatHash(info.Weapons[i])
|
||||||
|
, new WeaponBones
|
||||||
|
{
|
||||||
|
Name = info.Weapons[i],
|
||||||
|
Bones = info.Bones.Where(x =>
|
||||||
|
x.BoneName.StartsWith($"weapon_{i + 1}") && !x.BoneName.EndsWith("rot")).ToArray()
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -21,9 +21,9 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RageCoop.Client.CefHost", "
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{70A1F09D-648D-4C8B-8947-E920B1A587A3}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{70A1F09D-648D-4C8B-8947-E920B1A587A3}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CefTest", "Tools\CefTest\CefTest.csproj", "{874944F4-2D01-4423-B55C-C651CCBA6630}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CefTest", "Tools\CefTest\CefTest.csproj", "{874944F4-2D01-4423-B55C-C651CCBA6630}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataDumper", "Tools\DataDumper\DataDumper.csproj", "{6387D897-09AF-4464-B440-80438E3BB8D0}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataDumper", "Tools\DataDumper\DataDumper.csproj", "{6387D897-09AF-4464-B440-80438E3BB8D0}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
2
RageCoop-V.sln.DotSettings
Normal file
2
RageCoop-V.sln.DotSettings
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||||
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=Joaat/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
@ -15,7 +15,7 @@ using System.Resources;
|
|||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
// Version information
|
// Version information
|
||||||
[assembly: AssemblyVersion("1.5.8.34")]
|
[assembly: AssemblyVersion("1.6.0.3")]
|
||||||
[assembly: AssemblyFileVersion("1.5.8.34")]
|
[assembly: AssemblyFileVersion("1.6.0.3")]
|
||||||
[assembly: NeutralResourcesLanguageAttribute( "en-US" )]
|
[assembly: NeutralResourcesLanguageAttribute( "en-US" )]
|
||||||
|
|
||||||
|
@ -1,117 +1,34 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
<TargetFramework>net48</TargetFramework>
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
|
||||||
<ProjectGuid>{874944F4-2D01-4423-B55C-C651CCBA6630}</ProjectGuid>
|
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<RootNamespace>CefTest</RootNamespace>
|
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
||||||
<AssemblyName>CefTest</AssemblyName>
|
<UseWindowsForms>true</UseWindowsForms>
|
||||||
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
|
<ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets>
|
||||||
<FileAlignment>512</FileAlignment>
|
|
||||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
|
||||||
<Deterministic>true</Deterministic>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
|
||||||
<DebugSymbols>true</DebugSymbols>
|
|
||||||
<DebugType>full</DebugType>
|
|
||||||
<Optimize>false</Optimize>
|
|
||||||
<OutputPath>bin\Debug\</OutputPath>
|
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
|
||||||
<DebugType>pdbonly</DebugType>
|
|
||||||
<Optimize>true</Optimize>
|
|
||||||
<OutputPath>bin\Release\</OutputPath>
|
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<OutDir>..\..\bin\Tools\CefTest</OutDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="BitmapUtil">
|
<Reference Include="BitmapUtil">
|
||||||
<HintPath>..\libs\BitmapUtil.dll</HintPath>
|
<HintPath>..\libs\BitmapUtil.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="PInvoke.Kernel32, Version=0.7.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\..\packages\PInvoke.Kernel32.0.7.124\lib\net46\PInvoke.Kernel32.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="PInvoke.User32, Version=0.7.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\..\packages\PInvoke.User32.0.7.124\lib\net45\PInvoke.User32.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="PInvoke.Windows.Core, Version=0.7.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\..\packages\PInvoke.Windows.Core.0.7.124\lib\net45\PInvoke.Windows.Core.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="PInvoke.Windows.ShellScalingApi, Version=0.7.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\..\packages\PInvoke.Windows.ShellScalingApi.0.7.124\lib\net45\PInvoke.Windows.ShellScalingApi.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="SharpD2D, Version=0.1.1.0, Culture=neutral, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\..\packages\SharpD2D.0.1.1\lib\netstandard2.0\SharpD2D.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="SharpDX, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b4dcf0f35e5521f1, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\..\packages\SharpDX.4.2.0\lib\net45\SharpDX.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="SharpDX.Direct2D1, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b4dcf0f35e5521f1, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\..\packages\SharpDX.Direct2D1.4.2.0\lib\net45\SharpDX.Direct2D1.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="SharpDX.DXGI, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b4dcf0f35e5521f1, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\..\packages\SharpDX.DXGI.4.2.0\lib\net45\SharpDX.DXGI.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System" />
|
|
||||||
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System.Core" />
|
|
||||||
<Reference Include="System.Drawing" />
|
|
||||||
<Reference Include="System.Drawing.Common, Version=4.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\packages\System.Drawing.Common.4.5.0\lib\net461\System.Drawing.Common.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System.Numerics" />
|
|
||||||
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System.Runtime.Remoting" />
|
<Reference Include="System.Runtime.Remoting" />
|
||||||
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System.Windows.Forms" />
|
|
||||||
<Reference Include="System.Xml.Linq" />
|
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
|
||||||
<Reference Include="Microsoft.CSharp" />
|
|
||||||
<Reference Include="System.Data" />
|
|
||||||
<Reference Include="System.Net.Http" />
|
|
||||||
<Reference Include="System.Xml" />
|
|
||||||
<Reference Include="Validation, Version=2.4.0.0, Culture=neutral, PublicKeyToken=2fc06f0d701809a7, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\..\packages\Validation.2.4.15\lib\net45\Validation.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="D2DWindow.cs">
|
<Compile Update="D2DWindow.cs">
|
||||||
<SubType>Component</SubType>
|
<SubType>Component</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Program.cs" />
|
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="App.config" />
|
<ProjectReference Include="..\..\Client\CefHost\RageCoop.Client.CefHost.csproj" />
|
||||||
<None Include="packages.config" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\Client\CefHost\RageCoop.Client.CefHost.csproj">
|
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
|
||||||
<Project>{ba750e08-5e41-4b56-8ad5-875716d2ccea}</Project>
|
<PackageReference Include="SharpD2D" Version="0.1.1" />
|
||||||
<Name>RageCoop.Client.CefHost</Name>
|
<PackageReference Include="System.Data.DataSetExtensions" Version="4.5.0" />
|
||||||
</ProjectReference>
|
<PackageReference Include="Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers" Version="0.4.355802">
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Microsoft.Windows.Compatibility" Version="7.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
|
||||||
</Project>
|
</Project>
|
@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<packages>
|
|
||||||
<package id="PInvoke.Kernel32" version="0.7.124" targetFramework="net48" />
|
|
||||||
<package id="PInvoke.User32" version="0.7.124" targetFramework="net48" />
|
|
||||||
<package id="PInvoke.Windows.Core" version="0.7.124" targetFramework="net48" />
|
|
||||||
<package id="PInvoke.Windows.ShellScalingApi" version="0.7.124" targetFramework="net48" />
|
|
||||||
<package id="SharpD2D" version="0.1.1" targetFramework="net48" />
|
|
||||||
<package id="SharpDX" version="4.2.0" targetFramework="net48" />
|
|
||||||
<package id="SharpDX.Direct2D1" version="4.2.0" targetFramework="net48" />
|
|
||||||
<package id="SharpDX.DXGI" version="4.2.0" targetFramework="net48" />
|
|
||||||
<package id="System.Buffers" version="4.5.1" targetFramework="net48" />
|
|
||||||
<package id="System.Drawing.Common" version="4.5.0" targetFramework="net48" />
|
|
||||||
<package id="System.Memory" version="4.5.4" targetFramework="net48" />
|
|
||||||
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" />
|
|
||||||
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net48" />
|
|
||||||
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net48" />
|
|
||||||
<package id="Validation" version="2.4.15" targetFramework="net48" />
|
|
||||||
</packages>
|
|
@ -4,6 +4,7 @@
|
|||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<TargetFramework>net6.0</TargetFramework>
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<OutDir>..\..\bin\Tools\DataDumper</OutDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -6,61 +6,60 @@ using Formatting = Newtonsoft.Json.Formatting;
|
|||||||
|
|
||||||
namespace DataDumper;
|
namespace DataDumper;
|
||||||
|
|
||||||
internal class WeaponInfo
|
|
||||||
|
[Flags]
|
||||||
|
public enum GenFlags
|
||||||
{
|
{
|
||||||
public string Audio;
|
WeaponInfo = 1,
|
||||||
public float Damage;
|
WeaponHash = 2,
|
||||||
public string DamageType;
|
VehicleWeaponInfo = 4,
|
||||||
public string FireType;
|
Animations = 8,
|
||||||
public bool IsVehicleWeapon;
|
All = ~0
|
||||||
public string Name;
|
|
||||||
public float Speed;
|
|
||||||
|
|
||||||
public WeaponInfo(XmlNode node)
|
|
||||||
{
|
|
||||||
if (node.Attributes["type"].Value != "CWeaponInfo") throw new Exception("Not a CWeaponInfo node");
|
|
||||||
foreach (XmlNode info in node.ChildNodes)
|
|
||||||
switch (info.Name)
|
|
||||||
{
|
|
||||||
case "Name":
|
|
||||||
Name = info.InnerText;
|
|
||||||
break;
|
|
||||||
case "Audio":
|
|
||||||
Audio = info.InnerText;
|
|
||||||
break;
|
|
||||||
case "FireType":
|
|
||||||
FireType = info.InnerText;
|
|
||||||
break;
|
|
||||||
case "DamageType":
|
|
||||||
DamageType = info.InnerText;
|
|
||||||
break;
|
|
||||||
case "Damage":
|
|
||||||
Damage = info.GetFloat();
|
|
||||||
break;
|
|
||||||
case "Speed":
|
|
||||||
Speed = info.GetFloat();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
IsVehicleWeapon = Name.StartsWith("VEHICLE_WEAPON");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Program
|
public static class Program
|
||||||
{
|
{
|
||||||
public static float GetFloat(this XmlNode n)
|
public static GenFlags ToGenerate = GenFlags.All;
|
||||||
|
public static void Main(string[] args)
|
||||||
{
|
{
|
||||||
return float.Parse(n.Attributes["value"].Value);
|
if (args.Length > 0 && Enum.TryParse<GenFlags>(args[0], true, out var flags))
|
||||||
|
{
|
||||||
|
ToGenerate = flags;
|
||||||
}
|
}
|
||||||
|
Directory.CreateDirectory("out");
|
||||||
|
|
||||||
public static void Main()
|
#region META
|
||||||
|
// Dumps from the game's xml documents, needs to have all *.meta file extracted to "meta" directory. OpenIV is recommended
|
||||||
|
|
||||||
|
if (ToGenerate.HasFlag(GenFlags.WeaponInfo))
|
||||||
{
|
{
|
||||||
Dictionary<uint, WeaponInfo> weapons = new();
|
Dictionary<uint, WeaponInfo> weapons = new();
|
||||||
foreach (var f in Directory.GetFiles("meta", "*.meta")) Parse(f, weapons);
|
foreach (var f in Directory.GetFiles("meta", "*.meta")) Parse(f, weapons);
|
||||||
Directory.CreateDirectory("Weapons");
|
File.WriteAllText("out/Weapons.json", JsonConvert.SerializeObject(weapons, Formatting.Indented));
|
||||||
File.WriteAllText("Weapons\\Weapons.json", JsonConvert.SerializeObject(weapons, Formatting.Indented));
|
if (ToGenerate.HasFlag(GenFlags.WeaponHash))
|
||||||
|
{
|
||||||
DumpWeaponHash(weapons, true);
|
DumpWeaponHash(weapons, true);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
#region EXTERNAL
|
||||||
|
// External data from DurtyFree's data dumps: https://github.com/DurtyFree/gta-v-data-dumps
|
||||||
|
|
||||||
|
Directory.CreateDirectory("ext");
|
||||||
|
if (ToGenerate.HasFlag(GenFlags.VehicleWeaponInfo))
|
||||||
|
{
|
||||||
|
VehicleWeaponInfo.Dump("ext/vehicles.json", "out/VehicleWeapons.json");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ToGenerate.HasFlag(GenFlags.Animations))
|
||||||
|
{
|
||||||
|
AnimDic.Dump("ext/animDictsCompact.json", "out/Animations.json");
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
|
||||||
private static void Parse(string filename, Dictionary<uint, WeaponInfo> weap)
|
private static void Parse(string filename, Dictionary<uint, WeaponInfo> weap)
|
||||||
{
|
{
|
||||||
@ -85,7 +84,7 @@ public static class Program
|
|||||||
{
|
{
|
||||||
var info = new WeaponInfo(n);
|
var info = new WeaponInfo(n);
|
||||||
if (!info.Name.StartsWith("VEHICLE_WEAPON") && !info.Name.StartsWith("WEAPON")) continue;
|
if (!info.Name.StartsWith("VEHICLE_WEAPON") && !info.Name.StartsWith("WEAPON")) continue;
|
||||||
var hash = Hash(info.Name);
|
var hash = CoreUtils.JoaatHash(info.Name);
|
||||||
if (weap.ContainsKey(hash))
|
if (weap.ContainsKey(hash))
|
||||||
weap[hash] = info;
|
weap[hash] = info;
|
||||||
else
|
else
|
||||||
@ -95,7 +94,7 @@ public static class Program
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void DumpWeaponHash(Dictionary<uint, WeaponInfo> weapons, bool sort = false,
|
private static void DumpWeaponHash(Dictionary<uint, WeaponInfo> weapons, bool sort = false,
|
||||||
string path = @"Weapons\WeaponHash.cs")
|
string path = @"out/WeaponHash.cs")
|
||||||
{
|
{
|
||||||
StringBuilder output = new();
|
StringBuilder output = new();
|
||||||
List<string> lines = new();
|
List<string> lines = new();
|
||||||
@ -111,7 +110,7 @@ public static class Program
|
|||||||
output.Append("public enum VehicleWeaponHash : uint\r\n{\r\n\tInvalid = 0xFFFFFFFF,");
|
output.Append("public enum VehicleWeaponHash : uint\r\n{\r\n\tInvalid = 0xFFFFFFFF,");
|
||||||
lines = new List<string>();
|
lines = new List<string>();
|
||||||
foreach (var info in vehWeaps)
|
foreach (var info in vehWeaps)
|
||||||
lines.Add($"{CoreUtils.FormatToSharpStyle(info.Value.Name)} = {info.Key.ToHex()}");
|
lines.Add($"{CoreUtils.FormatToSharpStyle(info.Value.Name, 14)} = {info.Key.ToHex()}");
|
||||||
if (sort) lines.Sort();
|
if (sort) lines.Sort();
|
||||||
foreach (var l in lines) output.Append($"\r\n\t{l},");
|
foreach (var l in lines) output.Append($"\r\n\t{l},");
|
||||||
output.Append("\r\n}");
|
output.Append("\r\n}");
|
||||||
@ -125,21 +124,4 @@ public static class Program
|
|||||||
return nodes;
|
return nodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static uint Hash(string key)
|
|
||||||
{
|
|
||||||
key = key.ToLower();
|
|
||||||
var i = 0;
|
|
||||||
uint hash = 0;
|
|
||||||
while (i != key.Length)
|
|
||||||
{
|
|
||||||
hash += key[i++];
|
|
||||||
hash += hash << 10;
|
|
||||||
hash ^= hash >> 6;
|
|
||||||
}
|
|
||||||
|
|
||||||
hash += hash << 3;
|
|
||||||
hash ^= hash >> 11;
|
|
||||||
hash += hash << 15;
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
}
|
}
|
Binary file not shown.
BIN
libs/ScriptHookVDotNet3.pdb
Normal file
BIN
libs/ScriptHookVDotNet3.pdb
Normal file
Binary file not shown.
Reference in New Issue
Block a user