HELLDIVERS 2

Upload your cheat tables here (No requests)
vallenvega
Noobzor
Noobzor
Posts: 5
Joined: Sat Sep 11, 2021 2:52 pm
Reputation: 1

Re: HELLDIVERS 2

Post by vallenvega »

R7Wolfy wrote:
Sat May 11, 2024 6:01 pm
Spoiler
vallenvega wrote:
Sat May 11, 2024 12:36 pm
buttfucker2000 wrote:
Sat May 11, 2024 8:38 am


Code: Select all

dmg_Super:
  mov [rcx+0C],#777 // writes penetration value 1
  mov [rcx+10],#777 // writes penetration value 2
  mov [rcx+14],#777 // writes penetration value 3
  mov [rcx+18],#777 // writes penetration value 4
  mov [rcx+1C],#100 // writes demolition value
  mov [rcx+20],#100 // writes pushback / stagger value
  //mov [rcx+24],#100 // writes ??? value
  movd xmm3,[rcx+04]
  movd xmm1,[rcx+08]
  cvtdq2ps xmm1,xmm1
  cvtdq2ps xmm3,xmm3
  mulss xmm3, dword ptr [dmg_multiplier]  // multiplies value with dmg_multiplier
  mulss xmm1, dword ptr [admg_multiplier] // multiplies value with admg_multiplier
  jmp return
  jmp code
Correct me if I'm wrong, but I think "concussive" would would be

Code: Select all

  mov [rcx+20],#100 // writes pushback / stagger value
thanks for the response but I think I didn't explain myself very well.
what I have in mind is to have different setup/capabilities for different weapons e.g.
  • CB-9 has Explosive and Stagger
  • AMR has Explosive and Destruction
  • Liberator has Stagger and Destruction
this way we can customize it to not be very obvious to other users.
as of now, it's one size fits all. you either 'have' it or you dont.
well you could custumize it to your needs by writing in more Damage varibles/sets. like create a new set call it dub with stagger buffs

Code: Select all

//as an example 
//x2 multi
Dubdmg_multiplier:
  dd (float)2
Dubadmg_multiplier:
  dd (float)2
dubstag:
 mov [rcx+20],#100 // writes pushback / stagger value
 movd xmm3,[rcx+04]
 movd xmm1,[rcx+08]
  cvtdq2ps xmm1,xmm1
  cvtdq2ps xmm3,xmm3
  mulss xmm3, dword ptr [Dubdmg_multiplier]  // multiplies value with dmg_multiplier
  mulss xmm1, dword ptr [Dubadmg_multiplier] // multiplies value with admg_multiplier
  jmp return
  jmp code
dubex:
 mov [rcx+0C],#777 // writes penetration value 1
  mov [rcx+10],#777 // writes penetration value 2
  mov [rcx+14],#777 // writes penetration value 3
  mov [rcx+18],#777 // writes penetration value 4
  mov [rcx+1C],#100 // writes demolition value
 movd xmm3,[rcx+04]
 movd xmm1,[rcx+08]
  cvtdq2ps xmm1,xmm1
  cvtdq2ps xmm3,xmm3
  mulss xmm3, dword ptr [Dubdmg_multiplier]  // multiplies value with dmg_multiplier
  mulss xmm1, dword ptr [Dubadmg_multiplier] // multiplies value with admg_multiplier
  jmp return
  jmp code
 
  
dude thank you. gonna try this one.

How to use this cheat table?
  1. Install Cheat Engine
  2. Double-click the .CT file in order to open it.
  3. Click the PC icon in Cheat Engine in order to select the game process.
  4. Keep the list.
  5. Activate the trainer options by checking boxes or setting values from 0 to 1

wilsondgonzales
Noobzor
Noobzor
Posts: 10
Joined: Sat Mar 30, 2024 4:02 pm
Reputation: 3

Re: HELLDIVERS 2

Post by wilsondgonzales »

nos4r2 wrote:
Sun May 12, 2024 6:06 am
wilsondgonzales wrote:
Sun May 12, 2024 5:20 am
nos4r2 wrote:
Sun May 12, 2024 2:31 am


Thank, this kinda nice customize each one btw i have some questions say if i set it like this {326, 2.0f, 200, 200, 5, 5, 5,5, "Helldiver melee"},

Will melee dmg do 400 dmg or fixed at 200?
yes, and any melee by other helldivers will also be doubled if they melee you
That not even what i'm asking for, i ask if i set multiplier to 2.0 but also set dmg to 200 it result in 200 dmg or 400 dmg.

Also aren't these client-side? it affect other people? i mostly play solo so i have no idea.
my bad. yes it's double the dmg of 200
200 x 2.0f
yes, it's client side so my previous statement was false

fallout11
Novice Cheater
Novice Cheater
Posts: 16
Joined: Tue Apr 30, 2024 11:17 am
Reputation: 7

Re: HELLDIVERS 2

Post by fallout11 »

Duplicate
Last edited by fallout11 on Mon May 13, 2024 2:27 am, edited 1 time in total.

fallout11
Novice Cheater
Novice Cheater
Posts: 16
Joined: Tue Apr 30, 2024 11:17 am
Reputation: 7

Re: HELLDIVERS 2

Post by fallout11 »

Duplicate
Last edited by fallout11 on Mon May 13, 2024 2:27 am, edited 1 time in total.

fallout11
Novice Cheater
Novice Cheater
Posts: 16
Joined: Tue Apr 30, 2024 11:17 am
Reputation: 7

Re: HELLDIVERS 2

Post by fallout11 »

Just a note that if you go over 99 samples you get nothing (and you get an internal flag for cheating, which causes some weirdness post-mission, like all-grey screen that you have to escape key out of to return to ship). Make sure you don't pickup or have more than that.
oddity93 wrote:
Sat May 11, 2024 12:51 pm
all i know is what i can reiterate. plus some more context after looking at whats happening
in mission, i get more samples per pickup, but when i leave, i get nothing.
and if i go over the amount thats in the mission all i get is the base reqs and exp. no bonuses for difficulty, no medals for completion, and i can go back into the same mission.
the instructions i was given are: open game, wait a moment for black screen, click boxes, close CE before game fully launches. i havent the foggiest what i would be doing wrong when everything else i have works, such as infinite health or strats
>>i went back and got other cheat tables. i was using one that had the majority of what i needed. i didnt realize someone had updated their table to work better. TL:DR its all good now

picabotwo
What is cheating?
What is cheating?
Posts: 4
Joined: Sun Feb 25, 2024 3:32 pm
Reputation: 0

Re: HELLDIVERS 2 - Infinite Shield

Post by picabotwo »

I like using the shield backback but the infinite shield makes it too easy. Any way to set a value where its just a 2x as better as original shield? I also understand we lost the ability to set the recharge time. Thanks!

Exemplify1524
Cheater
Cheater
Posts: 31
Joined: Tue Apr 30, 2024 8:37 am
Reputation: 16

Re: HELLDIVERS 2 - Infinite Shield

Post by Exemplify1524 »

picabotwo wrote:
Sun May 12, 2024 3:11 pm
I like using the shield backback but the infinite shield makes it too easy. Any way to set a value where its just a 2x as better as original shield? I also understand we lost the ability to set the recharge time. Thanks!
Try my mod version of ZoDDels script.
Press L hotkey to toggle cheat on or off. Default is off. Use DebugViewPP tool for debugging and look how it works.

When on, it will add 1.0f shield every ~100ms. You can change hotkey and value.
Also if shield at low values it will add more. So it is harder to kill shield with small damages.
Also if shield is 0 need to wait cooldown as usual.

It would be good if community help to get right values for restoration, so it will be not so obvious for coop players that you are a cheater.

Maybe restore key only if some hotkey pressed? Not toggle mofe, but press and hold mode?

This is coop game, need smart methods and stealthy cheats, so team members will like you, not hate and leave.
Spoiler

Code: Select all

{ Game   : helldivers2.exe
  Version: 
  Date   : 2024-05-01
  Author : ZoDDeL
  Mod by : Anton
}
{$c}
  // CAN CHANGE SECTION START
  #define SHIELD_RESTORE_HOTKEY 'L'
  #define SHIELD_RESTORE_VALUE 1.0f
  // CAN CHANGE SECTION END

  #define NO_OLDNAMES
  #include <windows.h>
  extern __cdecl int sprintf(char *, char *, ...);
  extern __cdecl void OutputDebugStringA(const char* lpOutputString);
  short GetAsyncKeyState(int);
  char debug_string[400];
  char button_state_old = 0;
  char shield_cheat = 0;
{$asm}
[ENABLE]

aobscanmodule(inf_shield,game.dll,F3 43 0F 10 4C 26 04 F3 41 0F 59 C1 F3 0F 5E C8)
alloc(inf_shieldRead_newmem,$2000)

label(inf_shieldRead_code)
label(inf_shieldRead_return)

inf_shieldRead_newmem:
  cmp r14,00000000
  jne inf_shieldRead_code
{$ccode base1=r14 base2=r12}
  float *shield_value = (float*)(base1 + base2 + 4);

  //float *r14_fl = (float*)(base1);
  //int *r14_int = (int*)(base1);
  //sprintf(debug_string, "Shield. value %d | r14_fl %d", (int)(*shield_value), (int)(*r14_fl));
  //OutputDebugStringA(debug_string);

  // cheat state toggle by hotkey routines
  if (GetAsyncKeyState(SHIELD_RESTORE_HOTKEY) & 0x8000) {
    if (!button_state_old) {
      button_state_old = 1;
      shield_cheat = !shield_cheat;
      sprintf(debug_string, "Shield: Hotkey pressed. Shield cheat state now: %d", shield_cheat);
      OutputDebugStringA(debug_string);
    }
  } else {
    if (button_state_old) {
      sprintf(debug_string, "Shield: Hotkey released.");
      button_state_old = 0;
    }
  }

  if (shield_cheat) {
    if ((*shield_value > 0) && (*shield_value < 100.0f)) {
       float shield_restore_multiplier = 0.5f;
       if (*shield_value < 20) {
         shield_restore_multiplier = 6.0f;
       } else if (*shield_value < 40) {
         shield_restore_multiplier = 4.0f;
       } else if (*shield_value < 60) {
         shield_restore_multiplier = 2.5f;
       }
       *shield_value += SHIELD_RESTORE_VALUE * shield_restore_multiplier;
    }
  }

  sprintf(debug_string, "Shield: value %d", (int)*shield_value);
  OutputDebugStringA(debug_string);

{$asm}
  //mov [r14+r12+04],(float)7777 // everytime opcode gets called (100times per second) this value gets written on (inf shield)
  jmp inf_shieldRead_code

inf_shieldRead_code:
  // original code start
  movss xmm1,[r14+r12+04]
  mulss xmm0,xmm9
  divss xmm1,xmm0
  // original code end
  jmp inf_shieldRead_return

inf_shield:
  jmp far inf_shieldRead_newmem
  nop 2
inf_shieldRead_return:


[DISABLE]

Amateurlawyer
Novice Cheater
Novice Cheater
Posts: 21
Joined: Fri Feb 02, 2024 4:11 am
Reputation: 0

Re: HELLDIVERS 2

Post by Amateurlawyer »

Can anyone explain how to use any of the tables? Just grabbed the game and it doesn’t let me use CE at all due to the anti cheat

ikstarven
Novice Cheater
Novice Cheater
Posts: 16
Joined: Sat Feb 24, 2024 6:27 am
Reputation: 2

Re: HELLDIVERS 2

Post by ikstarven »

Amateurlawyer wrote:
Sun May 12, 2024 4:53 pm
Can anyone explain how to use any of the tables? Just grabbed the game and it doesn’t let me use CE at all due to the anti cheat
zoddel's table at 118 is simple, and has a guide

mrnipperz
What is cheating?
What is cheating?
Posts: 1
Joined: Tue Apr 09, 2024 5:51 pm
Reputation: 0

Re: HELLDIVERS 2

Post by mrnipperz »

wilsondgonzales wrote:
Sun May 12, 2024 7:38 am
nos4r2 wrote:
Sun May 12, 2024 6:06 am
wilsondgonzales wrote:
Sun May 12, 2024 5:20 am


yes, and any melee by other helldivers will also be doubled if they melee you
That not even what i'm asking for, i ask if i set multiplier to 2.0 but also set dmg to 200 it result in 200 dmg or 400 dmg.

Also aren't these client-side? it affect other people? i mostly play solo so i have no idea.
my bad. yes it's double the dmg of 200
200 x 2.0f
yes, it's client side so my previous statement was false
id love to add extra melee dmg to zoddels superdmg table. i have one with extra melee but i like his with the the destruction of objects added to it now..

Exemplify1524
Cheater
Cheater
Posts: 31
Joined: Tue Apr 30, 2024 8:37 am
Reputation: 16

Re: HELLDIVERS 2

Post by Exemplify1524 »

mrnipperz wrote:
Sun May 12, 2024 8:41 pm
id love to add extra melee dmg to zoddels superdmg table. i have one with extra melee but i like his with the the destruction of objects added to it now..
Try new modified version of ZoDDel's super damage script.
Spoiler

Code: Select all

{
Author ZoDDel
Mod by Anton
}

{$c}
float ext_damage_mult = 1.0f;
typedef struct {
  int id; // 1
  int d1; // 2 normal_value;
  int d2; // 3 armor_value;
  int p1; // 4 p1;
  int p2; // 5 p2;
  int p3; // 6 p3;
  int p4; // 7 p4;
  int demolition; // 8
  int knockback1; // 9
  int knockback2; // 10
  int decal_type; // 11
  int decal_size; // 12
  float decal_duration; // 13
  int u7; // 14
  int u8; // 15
} GameDamageInfo;
typedef struct {
   int id; // 1
   int d1; // -2
   int d2; // -3
   int p1; // -4
   int p2; // -5
   int p3; // -6
   int p4; // -7
   int demolition; // -8
   int knockback1; // -9
   int knockback2; // -10
   float damage_mult; // -1 is default
   char *p_weapon_type;
   char *p_damage_name;
   char *p_base_stats_string;
   char hide_output;
   char is_unknown;
   GameDamageInfo game_damage_backup;
} CheatDamageInfo;


// YOU CAN CHANGE SECTION START
#define HOTKEY_EXCLUDE_DAMAGE 'U'
#define HOTKEY_INCLUDE_DAMAGE 'I'
#define HOTKEY_GOD_SHOT VK_CONTROL
#define UNKNOWN_DAMAGE_MULTIPLIER 0.5f
CheatDamageInfo g_damage_table[500] = {
// damage | penetr |demolit | knock | unk | unk
// -2  -3   -4 -5 -6 -7   -8   -9-10  -11-12-13
//050 005 | 01 00 00 00 | 10 | 25 30 |  0  0  0 | 0 0"
{326,	-2,	-3, -4, -5,	-6,	-7,	-8,	-9,	-10,	1.0f, "00 Melee", "Helldiver melee", "050 005 | 01 00 00 00 | 10 | 25 30 | 0 0 0 | 0 0"},
{ 51,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "01 Assault rifle", "AR-22C Patriot / AR-23 Liberator / AR-48 Truth Whisperer / AR-61 Tenderizer / Stalwart / AX/AR-23 Guard Dog (w Liberator AR)", "060 006 | 02 02 02 00 | 10 | 10 10 | 0 0 0 | 0 0"},
{ 50,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "01 Assault rifle", "AR-23C Liberator Concussive", "065 015 | 02 02 02 02 | 10 | 35 100 | 0 0 0 | 0 0"},
{ 48,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "01 Assault rifle", "AR-23P Liberator Penetrator", "045 015 | 03 03 03 00 | 10 | 10 10 | 0 0 0 | 0 0"},
// my
{ 65,	-2,	-3,	-4,	-5,	-6,	-7,	30,	50,  40, 	1.0f, "02 Marksman rifle", "AR-20L Justice / BR-14 Adjudicator / Machine Gun / Gatling Sentry / Machine Gun Sentry", "080 008 | 03 03 03 01 | 10 | 15 12 | 0 0 0 | 0 0"},
{ 73,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "02 Marksman rifle", "R-63 Diligence", "125 013 | 02 02 02 00 | 10 | 15 14 | 0 0 0 | 0 0"},
{ 74,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "02 Marksman rifle", "R-63CS Diligence Counter Sniper", "140 014 | 03 03 03 00 | 10 | 15 14 | 0 0 0 | 0 0"},
{ 26,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "03 Submachine gun", "MP-98 Knight", "050 005 | 02 02 02 00 | 10 | 10 4 | 0 0 0 | 0 0"},
{ 34,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "03 Submachine gun", "SG-8S / SMG-37 Defender", "070 007 | 02 02 02 00 | 10 | 10 5 | 0 0 0 | 0 0"},
{ 41,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "03 Submachine gun", "SMG-72 Pummeler", "065 007 | 02 02 02 00 | 10 | 15 5 | 0 34 2 | 0 0"},
{102,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "04 Shotgun", "SG-225 Breaker", "030 006 | 02 02 02 00 | 10 | 10 10 | 0 0 0 | 0 0"},
{103,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "04 Shotgun", "SG-225BB Breaker Bugbiter", "045 009 | 02 02 02 00 | 10 | 15 15 | 0 0 0 | 0 0"},
{104,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "04 Shotgun", "SG-225NS Breaker Nailspitter", "020 004 | 03 03 03 00 | 10 | 10 10 | 0 0 0 | 0 0"},
{101,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "04 Shotgun", "SG-225SP Breaker Spray&Pray", "012 004 | 02 02 02 00 | 10 | 3 1 | 0 0 0 | 0 0"},
{105,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "04 Shotgun", "SG-255IE Breaker Incendiary", "020 010 | 02 02 02 00 | 10 | 10 10 | 1 6 100 | 0 0"},
{ 88,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "04 Shotgun", "SG-8 Punisher", "045 012 | 02 02 02 00 | 10 | 35 30 | 0 0 0 | 0 0"},
{ 99,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "04 Shotgun", "SG-8S Slugger", "250 075 | 03 03 03 00 | 10 | 20 35 | 0 0 0 | 0 0"},
{117,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "04 Shotgun", "SMG-37 Defender", "050 035 | 03 03 03 00 | 10 | 30 25 | 2 0 0 | 0 0"},
{124,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "05 Explosive", "CB-9 Exploding Crossbow part 1 (impact)", "270 050 | 03 03 03 00 | 0 | 30 10 | 0 0 0 | 0 0"},
{125,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "05 Explosive", "CB-9 Exploding Crossbow part 2 (explosion)", "150 150 | 02 02 02 00 | 15 | 25 10 | 0 0 0 | 0 0"},
{ 84,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "05 Explosive", "JAR-5 Dominator", "275 090 | 03 03 03 00 | 10 | 35 15 | 0 0 0 | 0 0"},
{ 80,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "05 Explosive", "R-36 Eruptor p1 (direct shell impact)", "230 115 | 03 03 03 00 | 30 | 35 20 | 0 0 0 | 0 0"},
{205,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "05 Explosive", "R-36 Eruptor p2 (sub-shell enemy hits)", "150 150 | 03 00 00 00 | 20 | 25 40 | 0 0 0 | 0 0"},
{ 19,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "06 Energy-based", "LAS-16 Sickle", "055 005 | 02 02 02 00 | 10 | 10 10 | 0 0 0 | 0 0"},
{297,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "06 Energy-based", "LAS-5 Scythe", "350 070 | 02 02 02 00 | 10 | 0 0 | 0 6 0 | 0 0"},
{ 20,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "06 Energy-based", "PLAS-1 Scorcher p1 / PLAS-101 Purifier (Part 1) / SG-8P Punisher Plasma part 1 impact of projectile", "100 050 | 02 02 02 00 | 10 | 20 10 | 0 0 0 | 0 0"},
{184,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "06 Energy-based", "PLAS-1 Scorcher p2 (Plasma Damage)", "100 100 | 03 00 00 00 | 10 | 10 7 | 0 0 0 | 0 0"},
{ 21,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "06 Energy-based", "PLAS-101 Purifier", "250 100 | 03 03 03 00 | 10 | 20 10 | 0 0 0 | 0 0"},
{186,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "06 Energy-based", "PLAS-101 Purifier (Part 2) / SG-8P Punisher Plasma part 2 explosion", "150 150 | 03 03 03 00 | 10 | 35 30 | 0 0 0 | 0 0"},
{134,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "07 Pistol", "GP-31 Grenade Pistol part1 shell", "250 250 | 03 03 03 00 | 30 | 40 10 | 0 0 0 | 0 0"},
{220,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "07 Pistol", "GP-31 Grenade Pistol part2 explosion / GL-21 Grenade launcher part 2 explosion", "350 350 | 03 00 00 00 | 30 | 25 40 | 0 0 0 | 0 0"},
{296,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "07 Pistol", "LAS-7 Dagger (continuous laser pistol)", "200 020 | 02 02 02 00 | 10 | 0 0 | 0 6 0 | 0 0"},
{ 42,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "07 Pistol", "P-113 Verdict", "125 012 | 02 02 02 00 | 10 | 12 10 | 0 0 0 | 0 0"},
{ 25,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "07 Pistol", "P-19 Redeemer", "060 005 | 02 02 02 00 | 10 | 10 4 | 0 0 0 | 0 0"},
{ 27,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "07 Pistol", "P-2 Peacemaker", "075 015 | 02 02 02 00 | 10 | 10 4 | 0 0 0 | 0 0"},
{ 44,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "07 Pistol", "P-4 Senator", "175 035 | 03 03 03 00 | 10 | 20 10 | 0 0 0 | 0 0"},
{203,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "08 Grenade Standard", "G-10 Incendiary / G-13 Incendiary impact / Incendary Impact / Incendary Impact", "150 150 | 03 00 00 00 | 30 | 20 15 | 1 6 100 | 0 0"},
{213,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "08 Grenade Standard", "G-12 High Explosive / G-16 Impact", "400 400 | 04 00 00 00 | 30 | 30 40 | 0 0 0 | 0 0"},
{201,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "08 Grenade Standard", "G-6 Frag part 1", "250 250 | 03 00 00 00 | 20 | 25 40 | 0 0 0 | 0 0"},
{111,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "08 Grenade Standard", "G-6 Frag part 2", "080 008 | 02 02 02 00 | 10 | 10 20 | 0 0 0 | 0 0"},
{204,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "09 Grenade Special", "G-123 Thermite", "100 100 | 07 00 00 00 | 30 | 20 40 | 0 0 0 | 0 0"},
{169,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "09 Grenade Special", "G-23 Stun", "000 000 | 06 00 00 00 | 0 | 0 0 | 0 35 25 | 0 0"},
{122,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "Antimaterial Rifle", "450 135 | 04 04 04 00 | 20 | 20 25 | 0 0 0 | 0 0"},
{115,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "ARC3 Thrower", "250 050 | 07 07 07 00 | 20 | 35 10 | 2 0 0 | 0 0"},
{127,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "Autocannon (part 1/2)", "260 260 | 04 04 04 00 | 30 | 30 20 | 0 0 0 | 0 0"},
{216,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "Autocannon (part 2/2)", "150 150 | 03 00 00 00 | 30 | 40 40 | 0 0 0 | 0 0"},
{ 93,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "Break action shotgun", "065 013 | 02 02 02 00 | 10 | 20 20 | 0 0 0 | 0 0"},
{145,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "Commando", "500 500 | 06 05 03 00 | 40 | 50 25 | 0 0 0 | 0 0"},
{135,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "EAT-17 Expendable Anti-Tank part 1", "650 650 | 06 06 06 03 | 30 | 50 25 | 0 0 0 | 0 0"},
{189,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "EAT-17 Expendable Anti-Tank part 2", "015 015 | 03 00 00 00 | 10 | 30 15 | 0 0 0 | 0 0"},
{226,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "EAT-17 Expendable Anti-Tank part 3", "150 150 | 03 00 00 00 | 30 | 60 40 | 0 0 0 | 0 0"},
{129,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "EXO-45 Emancipator gun part 1", "300 060 | 05 05 05 00 | 30 | 30 10 | 0 0 0 | 0 0"},
{217,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "EXO-45 Emancipator gun part 2", "150 150 | 03 00 00 00 | 30 | 40 40 | 0 0 0 | 0 0"},
{147,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "EXO-45 Emancipator rocket part 1", "400 400 | 06 06 04 00 | 30 | 40 25 | 0 0 0 | 0 0"},
{234,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "EXO-45 Emancipator rocket part 2", "400 400 | 03 00 00 00 | 30 | 60 70 | 0 0 0 | 0 0"},
{  9,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "FLAM-40 Flamethrower part 1", "003 003 | 03 03 03 00 | 10 | 5 5 | 1 6 10 | 0 0"},
{ 10,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "GL-21 Grenade launcher part 1 / Mortar Sentry shoot (not shell)", "020 002 | 00 00 00 00 | 10 | 40 10 | 0 0 0 | 0 0"},
{ 11,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "Grenade Launcher", "005 000 | 02 01 00 00 | 10 | 40 10 | 0 0 0 | 0 0"},
{121,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "Heavy Machinegun", "100 035 | 04 04 04 00 | 15 | 15 20 | 0 0 0 | 0 0"},
{149,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "Javelin rocket part 1", "1000 1000 | 08 07 06 00 | 40 | 50 25 | 0 0 0 | 0 0"},
{236,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "Javelin rocket part 2", "200 200 | 05 00 00 00 | 30 | 60 70 | 0 0 0 | 0 0"},
{302,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "LAS-98 Laser Cannon", "350 200 | 04 04 04 04 | 20 | 0 0 | 0 6 0 | 0 0"},
{227,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "Quasar Cannon part 1", "650 650 | 06 06 06 03 | 30 | 50 40 | 0 0 0 | 0 0"},
{228,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "Quasar Cannon part 2", "150 150 | 03 00 00 00 | 30 | 50 40 | 0 0 0 | 0 0"},
{136,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "Recoiless Rifle part 1 shell", "650 650 | 06 06 06 03 | 30 | 50 25 | 0 0 0 | 0 0"},
{225,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "10 Stratagem weapon", "Recoiless Rifle part 2 explosion", "150 150 | 03 00 00 00 | 30 | 50 40 | 0 0 0 | 0 0"},
//
{ 22,	-2,	240	-4,	-5,	-6,	-7,	30,	50,	 30,	1.0f, "10 Stratagem weapon", "RS-422 Railgun", "600 060 | 05 05 05 05 | 10 | 35 15 | 0 0 0 | 0 0"},
{130,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "11 Stratagem Sentry", "Autocannon Sentry / Pelican evacuation ship part 1", "300 300 | 05 05 05 00 | 30 | 40 10 | 0 0 0 | 0 0"},
{298,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "11 Stratagem Sentry", "AX/LAS-5 Guard Dog Rover (w Laser Rifle)", "200 040 | 02 02 02 00 | 10 | 0 0 | 0 6 0 | 0 0"},
{271,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "11 Stratagem Sentry", "EMS Mortar Sentry - shell impact", "000 000 | 04 00 00 00 | 30 | 10 40 | 0 0 0 | 0 0"},
{243,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "11 Stratagem Sentry", "MD-6 Anti-Personnel Minefield", "200 200 | 03 00 00 00 | 30 | 30 30 | 0 0 0 | 0 0"},
{223,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "11 Stratagem Sentry", "Mortar Sentry shell", "400 400 | 03 00 00 00 | 30 | 35 40 | 0 0 0 | 0 0"},
{126,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "11 Stratagem Sentry", "Tesla Tower", "600 600 | 04 04 04 00 | 20 | 20 10 | 2 0 0 | 0 0"},
{245,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "12 Stratagem Defensive", "AntiTank mine", "1000 1000 | 05 05 05 00 | 30 | 30 40 | 0 0 0 | 0 0"},
{113,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "12 Stratagem Defensive", "MD-I4 Incendiary mines", ""},
{154,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "12 Stratagem Orbital", "500kg bomb1 shell", "1400 1400 | 07 07 07 00 | 50 | 20 15 | 0 0 0 | 0 0"},
{273,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "12 Stratagem Orbital", "500kg bomb2 explosion", "1200 1200 | 06 00 00 00 | 50 | 100 40 | 0 0 0 | 0 0"},
{152,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "12 Stratagem Orbital", "Eagle 110mm rocket pods part 1", "600 600 | 05 05 05 00 | 40 | 20 15 | 0 0 0 | 0 0"},
{241,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "12 Stratagem Orbital", "Eagle 110mm rocket pods part 2", "200 200 | 05 00 00 00 | 30 | 30 40 | 0 0 0 | 0 0"},
{254,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "12 Stratagem Orbital", "Eagle Airstrike part 2", "800 800 | 05 00 00 00 | 40 | 50 40 | 0 0 0 | 0 0"},
{142,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "12 Stratagem Orbital", "Eagle Aistrike shell / Eagle Napalm Strike shell", "500 500 | 05 05 05 00 | 40 | 20 15 | 0 0 0 | 0 0"},
{229,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "12 Stratagem Orbital", "Eagle cluster bomb / Orbital airburst strike p2", "350 350 | 03 00 00 00 | 30 | 50 40 | 0 0 0 | 0 0"},
{159,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "12 Stratagem Orbital", "Orbital 120MM HE barrage p1", "300 300 | 07 07 06 00 | 50 | 20 20 | 0 0 0 | 0 0"},
{268,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "12 Stratagem Orbital", "Orbital 120MM HE barrage p2", "750 750 | 05 00 00 00 | 50 | 70 40 | 0 0 0 | 0 0"},
{112,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "12 Stratagem Orbital", "Orbital airburst strike p1", "300 150 | 03 03 03 00 | 10 | 10 20 | 0 0 0 | 0 0"},
{158,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "12 Stratagem Orbital", "Orbital gas strike", "300 300 | 07 07 06 00 | 50 | 60 15 | 0 0 0 | 0 0"},
{305,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "12 Stratagem Orbital", "Orbital laser", "030 015 | 06 06 06 00 | 50 | 30 30 | 0 6 1 | 0 0"},
{160,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "12 Stratagem Orbital", "Orbital precision strike1 / Traitor player orbital atata 1", "450 450 | 08 07 06 00 | 50 | 20 20 | 0 0 0 | 0 0"},
{267,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "12 Stratagem Orbital", "Orbital precision strike2 / Traitor player orbital atata 2", "1000 1000 | 06 00 00 00 | 50 | 70 60 | 0 0 0 | 0 0"},
{161,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "12 Stratagem Orbital", "Orbital railcannon strike1", "2000 2000 | 10 09 08 00 | 50 | 60 35 | 0 0 0 | 0 0"},
{266,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "12 Stratagem Orbital", "Orbital railcannon strike2", "500 500 | 06 00 00 00 | 50 | 30 50 | 0 0 0 | 0 0"},
{196,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "15 Environment", "Barrel explosion", "300 300 | 03 00 00 00 | 30 | 20 40 | 1 6 10 | 0 0"},
{337,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "15 Environment", "Big smoke? On automaton map", "001 001 | 07 00 00 00 | 41 | 40 35 | 0 0 0 | 0 0"},
{309,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "15 Environment", "Burning", "050 025 | 04 04 04 00 | 0 | 0 0 | 1 0 0 | 0 0"},
{280,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "15 Environment", "Explosion", "200 200 | 03 00 00 00 | 50 | 50 40 | 0 0 0 | 0 0"},
{287,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "15 Environment", "Fall damage", "4000 4000 | 10 00 00 00 | 60 | 50 100 | 0 0 0 | 0 0"},
{294,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "15 Environment", "Green flower exploded slow effect", "015 015 | 03 00 00 00 | 0 | 15 15 | 0 46 75 | 35 50"},
{258,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "15 Environment", "Orbital capsula impact damage", "150 150 | 10 00 00 00 | 40 | 80 40 | 0 0 0 | 0 0"},
{219,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "15 Environment", "Pelican evacuation ship part 2", "150 150 | 03 00 00 00 | 30 | 40 40 | 0 0 0 | 0 0"},
{192,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "15 Environment", "Terminid yellow ground spore 1", "000 000 | 06 00 00 00 | 10 | 20 40 | 3 10 100 | 0 0"},
{311,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "15 Environment", "Terminid yellow ground spore 2 / Terminid Bug melee damage / Terminid Hunter attack 1", "003 000 | 01 01 01 00 | 0 | 0 0 | 3 0 0 | 0 0"},
{360,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Automatons", "Automaton Berserker melee", "050 050 | 03 00 00 00 | 20 | 20 15 | 0 0 0 | 0 0"},
{354,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Automatons", "Automaton Commissar (red shoulders) melee", "030 015 | 03 00 00 00 | 10 | 10 10 | 0 0 0 | 0 0"},
{  5,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Automatons", "Automaton damage", "040 020 | 02 02 02 00 | 10 | 5 5 | 1 6 50 | 0 0"},
{324,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Automatons", "Automaton distance damage (some1) / Automaton Hulk Scorcher (Gromila) Self flame?", "001 001 | 09 09 09 09 | 0 | 0 0 | 4 0 0 | 0 0"},
{  6,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Automatons", "Automaton distance damage (some2) / Automaton Gunship rocket blast", "075 050 | 06 05 04 00 | 20 | 50 25 | 0 0 0 | 0 0"},
{261,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Automatons", "Automaton Drop/Gun-ship fall on somethink", "100 100 | 03 00 00 00 | 40 | 50 40 | 0 0 0 | 0 0"},
{265,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Automatons", "Automaton grenade", "200 200 | 03 00 00 00 | 30 | 50 40 | 0 0 0 | 0 0"},
{119,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Automatons", "Automaton Gunship blaster / Automaton Hulk Scorcher right hand blaster / Automatons SHREDDER TANK 1 blaster shells", "055 005 | 03 03 03 00 | 20 | 20 15 | 0 0 0 | 0 0"},
{257,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Automatons", "Automaton Gunship rocket / Automaton rocket / Automaton Rocket devastator (rocket launchers on shoulders)", "060 060 | 03 00 00 00 | 30 | 30 40 | 0 0 0 | 0 0"},
{  7,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Automatons", "Automaton hand blaster", "030 003 | 02 02 01 00 | 10 | 10 15 | 0 0 0 | 0 0"},
{356,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Automatons", "Automaton Hulk Scorcher melee", "150 150 | 05 00 00 00 | 30 | 40 35 | 0 0 0 | 0 0"},
{353,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Automatons", "Automaton Maradeur melee / Automaton Rocket rider melee", "010 005 | 01 00 00 00 | 10 | 10 10 | 0 0 0 | 0 0"},
{206,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Automatons", "Automaton unknown", "100 100 | 03 00 00 00 | 20 | 50 40 | 0 0 0 | 0 0"},
{239,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Automatons", "Automaton unknown", "150 150 | 05 00 00 00 | 30 | 30 40 | 0 0 0 | 0 0"},
{281,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Automatons", "Automaton unknown", "300 300 | 03 00 00 00 | 50 | 50 40 | 0 0 0 | 0 0"},
{246,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Automatons", "Automatons ground red mine", "300 300 | 03 00 00 00 | 30 | 30 40 | 0 0 0 | 0 0"},
{322,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Automatons", "Automatons SHREDDER TANK 2 continuous scan", "075 075 | 06 06 06 00 | 0 | 0 0 | 5 0 0 | 0 0"},
{358,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Automatons", "Automatons SHREDDER TANK 3 rare", "200 200 | 04 00 00 00 | 40 | 40 40 | 0 0 0 | 0 0"},
{176,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Terminids", "Terminid Bile Titan bile1", "050 050 | 06 00 00 00 | 0 | 0 0 | 3 10 100 | 0 0"},
{  2,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Terminids", "Terminid Bile Titan bile2", "050 050 | 05 05 05 00 | 0 | 20 10 | 0 0 0 | 0 0"},
{351,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Terminids", "Terminid Bile Titan Stomp (impact)", "3000 3000 | 10 00 00 00 | 40 | 60 10 | 0 0 0 | 0 0"},
{342,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Terminids", "Terminid Brood commander melee attack / Terminid Hive Guard melee attack / Terminid Hunter swipes / Terminid Warrior melee attack", "040 040 | 02 00 00 00 | 20 | 20 10 | 0 0 0 | 0 0"},
{  1,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Terminids", "Terminid Bug Bile spew", "032 032 | 04 04 04 00 | 0 | 20 10 | 0 0 0 | 0 0"},
{335,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Terminids", "Terminid Charger Rush", "350 350 | 07 00 00 00 | 40 | 50 50 | 0 0 0 | 0 0"},
{292,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Terminids", "Terminid Ground spores if shoot then blow&throw away", "005 005 | 03 00 00 00 | 20 | 55 55 | 0 35 25 | 0 0"},
{338,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Terminids", "Terminid Hunter attack 2", "030 015 | 02 00 00 00 | 10 | 10 10 | 0 0 0 | 0 0"},
{  3,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Terminids", "Terminid Nursing spewer bile", "032 032 | 04 04 04 00 | 10 | 20 10 | 0 0 0 | 0 0"},
{345,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Terminids", "Terminid Scavenger melee attack", "030 015 | 02 00 00 00 | 10 | 10 5 | 0 0 0 | 0 0"},
{332,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Terminids", "Terminid some bug melee 1", "000 000 | 07 00 00 00 | 40 | 0 0 | 0 0 0 | 0 0"},
{336,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Terminids", "Terminid some bug melee 2", "030 030 | 07 00 00 00 | 41 | 40 35 | 0 0 0 | 0 0"},
{348,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Terminids", "Terminid Stalker attack", "040 040 | 03 00 00 00 | 20 | 20 15 | 0 0 0 | 0 0"},
{349,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Terminids", "Terminid Stalker throw away attack", "035 035 | 02 00 00 00 | 0 | 35 45 | 0 0 0 | 0 0"},
{340,	-2,	-3,	-4,	-5,	-6,	-7,	-8,	-9,	-10,	1.0f, "Enemy Terminids", "Terminod Stalker melee", "035 003 | 01 00 00 00 | 15 | 20 10 | 0 0 0 | 0 0"}
};
// YOU CAN CHANGE SECTION END

#define NO_OLDNAMES
#include <stddef.h>
#include <windows.h>
#include <string.h>

extern __cdecl int sprintf(char *, char *, ...);
extern __cdecl void OutputDebugStringA(const char* lpOutputString);
char g_debug_string[400];
short GetAsyncKeyState(int);


// how much records in table.  unknown damages, detected in game will be recorded above
int g_damage_table_records = 150;
// Include / Exclude global flags
char g_exclude_flag = 1;
char g_include_flag = 0;
//char damage_debug_global = 1;
int knock_value = 10;
{$asm}

[ENABLE]
aobscanmodule(damage_inject,game.dll,66 0F 6E 59 04 66 0F 6E 49 08 0F 5B C9 0F 5B DB)
alloc(damage_newmem,$20000)
label(damage_return)

// define global variable
alloc(damage_ratio,4)
registersymbol(damage_ratio)


damage_newmem:
{$ccode base_address=rcx}
extern float damage_ratio;
CheatDamageInfo *user_table_entry = NULL; // current_damage is place where to put address of g_damage_table entry with id equals damage_id
damage_ratio = UNKNOWN_DAMAGE_MULTIPLIER; // Default damage multiplier for damages (unknown) that are not found in g_damage_table. Assuming they are some enemy attacks.

GameDamageInfo *game_damage = (GameDamageInfo*)(base_address);

if (game_damage->id == 0) { goto end_section; }

// Include / Exclude damage_id printing routines
if (GetAsyncKeyState(HOTKEY_EXCLUDE_DAMAGE) & 0x8000) {
   // Exclude mode. While key pressed, all damages that are happening will mark as excluded and will not be printed in OutputDebug section
   g_exclude_flag = 1;
   g_include_flag = 0;
} else {
   g_exclude_flag = 0;
   // Include mode. While key pressed, all damages that happening and was excluded before, including back and will print in OutputDebug section
  if (GetAsyncKeyState(HOTKEY_INCLUDE_DAMAGE) & 0x8000) {
     // include mode
     g_exclude_flag = 0;
     g_include_flag = 1;
  } else {
    g_include_flag = 0;
  }
}

// analyzing if current damage_id is in g_damage_table
for (int i = 0; i < sizeof(g_damage_table) / sizeof(g_damage_table[0]); ++i) {
  if (g_damage_table[i].id == 0) {
    continue;
  }
  if (game_damage->id == g_damage_table[i].id) {
    user_table_entry = &g_damage_table[i];
    break;
  }
}

if (!user_table_entry) {
  // current damage_id is not in user cheat table.
  // Add new record to g_damage_table
  user_table_entry = &g_damage_table[g_damage_table_records++];

  user_table_entry->id = game_damage->id;
  user_table_entry->damage_mult = UNKNOWN_DAMAGE_MULTIPLIER;
  user_table_entry->d1 = game_damage->d1;
  user_table_entry->d2 = game_damage->d2;
  user_table_entry->p1 = game_damage->p1;
  user_table_entry->p2 = game_damage->p2;
  user_table_entry->p3 = game_damage->p3;
  user_table_entry->p4 = game_damage->p4;
  user_table_entry->demolition = game_damage->demolition;
  user_table_entry->knockback1 = game_damage->knockback1;
  user_table_entry->knockback2 = game_damage->knockback2;
  user_table_entry->p_weapon_type = "Added from game, not in user table";
  user_table_entry->p_damage_name = "Added from game, not in user table";
  user_table_entry->p_base_stats_string = "";
  user_table_entry->hide_output = 0;
  user_table_entry->is_unknown = 125; // 125 is a flag, that damage was added to table from game. So it is unknown, and maybe it is enemy or environmental damage

  sprintf(g_debug_string, "Damage: New damage class added to table: id %3d | %d %d | pen1-4: %d %d %d %d | demolition: %d | knock1-2 %d %d | decal size: %d duration x100: %d type: %d",
                      game_damage->id,
                      game_damage->d1,
                      game_damage->d2,
                      game_damage->p1,
                      game_damage->p2,
                      game_damage->p3,
                      game_damage->p4,
                      game_damage->demolition,
                      game_damage->knockback1,
                      game_damage->knockback2,

                      game_damage->decal_size,
                      (int)(game_damage->decal_duration * 100),
                      game_damage->decal_type
                      );
  OutputDebugStringA(g_debug_string);
}

// Error situation. Usually could not happen.
if (!user_table_entry) {
  sprintf(g_debug_string, "Damage: user_table_entry is null. return");
  OutputDebugStringA(g_debug_string);
  goto end_section;
}

// backup game_damage to user_damage
if (user_table_entry->game_damage_backup.id != game_damage->id) {
  sprintf(g_debug_string, "Damage: id %d saved game_damage_backup", game_damage->id);
  OutputDebugStringA(g_debug_string);
   user_table_entry->game_damage_backup = *game_damage;
}
/*
if (!(GetAsyncKeyState(HOTKEY_GOD_SHOT) & 0x8000)) {
   *game_damage = user_table_entry->game_damage_backup;
}
*/


// For damage entry that was specified in g_damage_table, apply damage values from table to game. Because no need to reapply the same values for damages added from game, because they dont have any user specified settings.
if (user_table_entry->is_unknown != 125) {
  // current damage id is in g_damage_table. Set damage values from table
  if (user_table_entry->d1 >= 0) {
    game_damage->d1 = user_table_entry->d1;
  }
  if (user_table_entry->d2 >= 0) {
    game_damage->d2 = user_table_entry->d2;
  }
  if (user_table_entry->p1 >= 0) {
    game_damage->p1 = user_table_entry->p1;
  }
  if (user_table_entry->p2 >= 0) {
    game_damage->p2 = user_table_entry->p2;
  }
  if (user_table_entry->p3 >= 0) {
    game_damage->p3 = user_table_entry->p3;
  }
  if (user_table_entry->p4 >= 0) {
    game_damage->p4 = user_table_entry->p4;
  }
  if (user_table_entry->demolition >= 0) {
    game_damage->demolition = user_table_entry->demolition;
  }
  if (user_table_entry->knockback1 >= 0) {
    game_damage->knockback1 = user_table_entry->knockback1;
  }
  if (user_table_entry->knockback2 >= 0) {
    game_damage->knockback2 = user_table_entry->knockback2;
  }
}

// Detect if it is our output/good damage to enemy or input/bad/enemy/environmental damage to us
char is_input_damage_to_us = 0;
if ((user_table_entry->is_unknown == 125) || strstr(user_table_entry->p_weapon_type, "Enemy") || strstr(user_table_entry->p_weapon_type, "Environment")) {
  is_input_damage_to_us = 1;
} else {
  is_input_damage_to_us = 0;
}

// set damage multiplier (will be used in $asm section later
damage_ratio = user_table_entry->damage_mult;
damage_ratio = damage_ratio * ext_damage_mult;
// if it is damage to us and damage_mult is set to -1 (not set)
if (is_input_damage_to_us) {
   if (user_table_entry->damage_mult == 1.0f) {
      damage_ratio = UNKNOWN_DAMAGE_MULTIPLIER;
   }
}

// Set new fields for Own or Enemy damages
if (is_input_damage_to_us) {
  game_damage->demolition = 0;
  game_damage->knockback1 = 0;
  game_damage->knockback2 = 0;
  game_damage->decal_type = 0;
  game_damage->decal_size = 0;
  game_damage->decal_duration = 0;
  // OutputDebugStringA("Damage: set additional fields for enemy/environmental damage");
} else {
  // set our weapon new damage values
  // is able to dectruct buildings and bug holes
/*
  if (GetAsyncKeyState(HOTKEY_GOD_SHOT) & 0x8000) {
     game_damage->d1 = 7777;
     game_damage->d2 = 7777;
     game_damage->p1 = 10;
     game_damage->p2 = 10;
     game_damage->p3 = 10;
     game_damage->p4 = 10;
     game_damage->demolition = 1000;
     game_damage->knockback1 = 1000;
     game_damage->knockback2 = 1000;
  }
*/
/*
  game_damage->demolition = 10;

  if (GetAsyncKeyState(VK_ADD) & 0x8000) {
    knock_value += 100;
    sprintf(g_debug_string, "Damage: knock for our weapon is: %d", knock_value);
    OutputDebugStringA(g_debug_string);
  }
  if (GetAsyncKeyState(VK_SUBTRACT) & 0x8000) {
    if (knock_value >= 100) {
      knock_value -= 100;
    } else {
      knock_value = 0;
    }
    sprintf(g_debug_string, "Damage: knock values for our weapon is: %d", knock_value);
    OutputDebugStringA(g_debug_string);
  }
  game_damage->decal_type = 3;
  game_damage->decal_size = 800;
  game_damage->decal_duration = 0.5f;
*/
  // knockback2 both. What difference?
  game_damage->knockback1 = 55000;
  game_damage->knockback2 = 55000;
}

// exclude include routine
if (g_exclude_flag) {
  if (!user_table_entry->hide_output) {
    sprintf(g_debug_string, "Damage: Excluded:  id %3d | %d %d | pen: %d %d %d %d | demolition: %d | knock %d %d | decal size: %d duration x100: %d type: %d | mult %d%% | damage_to_us: %d | %s",
                      game_damage->id,
                      game_damage->d1,
                      game_damage->d2,
                      game_damage->p1,
                      game_damage->p2,
                      game_damage->p3,
                      game_damage->p4,
                      game_damage->demolition,
                      game_damage->knockback1,
                      game_damage->knockback2,

                      game_damage->decal_size,
                      (int)(game_damage->decal_duration * 100),
                      game_damage->decal_type,

                      (int)(user_table_entry->damage_mult*100.0f),
                      is_input_damage_to_us,
                      user_table_entry->p_damage_name
                      );
    OutputDebugStringA(g_debug_string);
  }
  user_table_entry->hide_output = 1;
}
if (g_include_flag) {
  if (user_table_entry->hide_output) {
    sprintf(g_debug_string, "Damage: Included: id %3d | %d %d | pen1-4: %d %d %d %d | demolition: %d | knock1-2 %d %d | decal size: %d duration x100: %d type: %d | mult %d%% | damage_to_us: %d | %s",
                      game_damage->id,
                      game_damage->d1,
                      game_damage->d2,
                      game_damage->p1,
                      game_damage->p2,
                      game_damage->p3,
                      game_damage->p4,
                      game_damage->demolition,
                      game_damage->knockback1,
                      game_damage->knockback2,

                      game_damage->decal_size,
                      (int)(game_damage->decal_duration * 100),
                      game_damage->decal_type,

                      (int)(user_table_entry->damage_mult*100.0f),
                      is_input_damage_to_us,
                      user_table_entry->p_damage_name
					  );
    OutputDebugStringA(g_debug_string);
  }
  user_table_entry->hide_output = 0;
}

/*
// if undefined  should work without this
if ((user_table_entry->hide_output != 0) & (user_table_entry->hide_output != 1)) {
   user_table_entry->hide_output = 0;
}
*/

if (!user_table_entry->hide_output) {
   sprintf(g_debug_string, "Damage: OUT: id %3d | %d %d | pen1-4: %d %d %d %d | demolition: %d | knock %d %d | decal size: %d duration x100: %d type: %d | mult %d%% mult ext %d%% | damage_to_us: %d | %s",
                      game_damage->id,
                      game_damage->d1,
                      game_damage->d2,
                      game_damage->p1,
                      game_damage->p2,
                      game_damage->p3,
                      game_damage->p4,
                      game_damage->demolition,
                      game_damage->knockback1,
                      game_damage->knockback2,

                      game_damage->decal_size,
                      (int)(game_damage->decal_duration * 100),
                      game_damage->decal_type,

                      (int)(user_table_entry->damage_mult*100.0f),
                      (int)(ext_damage_mult),
                      is_input_damage_to_us,
                      user_table_entry->p_damage_name
                      );
  OutputDebugStringA(g_debug_string);
}

// OutputDebug section
/*
short res = GetAsyncKeyState('O');
if ((res & 0x8000) & (!(res & 0x0001))) {
  damage_debug_global = !damage_debug_global;
  sprintf(g_debug_string, "Damage debug messages: %d", damage_debug_global);
  OutputDebugStringA(g_debug_string);
}
*/
end_section:
{$asm}
  // standart code start
  movd xmm3,[rcx+04]
  movd xmm1,[rcx+08]
  cvtdq2ps xmm1,xmm1
  cvtdq2ps xmm3,xmm3
  // standart code end
  // damage_ratio part
  mulss xmm3, dword ptr [damage_ratio]
  mulss xmm1, dword ptr [damage_ratio]
  jmp damage_return

damage_inject:
  jmp far damage_newmem
  nop 2

damage_return:

// ------------------------------------------------------

[DISABLE]

Exemplify1524
Cheater
Cheater
Posts: 31
Joined: Tue Apr 30, 2024 8:37 am
Reputation: 16

Re: HELLDIVERS 2

Post by Exemplify1524 »

I modified gir489's run speed script.
When pressing right mouse button (in aim mode), speed multiplier is 1.5. You go a little faster in aim mode.
Hold space key to run at 5x speed (can use if no players nearby and in spectators, double check point of view of other players on map before switching on)
default speed a little faster: 1.1 it hard to detect.

Spoiler

Code: Select all

{ Author            : gir489
  Modder: Anton 11.05.2024

  Press HOTKEY to run faster
}
{$c}
#define NO_OLDNAMES
#include <windows.h>
// YOU CAN EDIT SECTION START
#define SPEED_MULTIPLIER_DEFAULT_VALUE 1.1f

#define SPEED_MULTIPLIER_AIM_HOTKEY VK_RBUTTON
#define SPEED_MULTIPLIER_AIM_VALUE 1.5f

#define SPEED_MULTIPLIER_HOTKEY VK_SPACE
#define SPEED_MULTIPLIER_VALUE 5.0f
// YOU CAN EDIT SECTION END

short GetAsyncKeyState(int);
{$asm}

[ENABLE]
aobscanmodule(aob_RunSpeed,game.dll,F3 41 0F 59 56 0C F3)
registersymbol(aob_RunSpeed)
registersymbol(runspeed_mult)
alloc(newmem_RunSpeed,1024)
alloc(runspeed_mult,4)
label(return_RunSpeed)

newmem_RunSpeed:
  // additional check to speed up only us
  push rbx
  mov rbx,F2F926ABF2F926AB
  cmp [rax],rbx
  jne short @f
{$ccode pawn_id=rax}
extern float runspeed_mult;

float speed_selector = 0;
// 0x8000 currently held down
// 0x0001 key has been pressed since the last call
// 0x8001 currently held down and has been pressed since the last call
if (GetAsyncKeyState(SPEED_MULTIPLIER_AIM_HOTKEY) & 0x8000) {
  speed_selector = SPEED_MULTIPLIER_AIM_VALUE;
}
if (GetAsyncKeyState(SPEED_MULTIPLIER_HOTKEY) & 0x8000) {
  speed_selector = SPEED_MULTIPLIER_VALUE;
}
if (speed_selector == 0) {
  speed_selector = SPEED_MULTIPLIER_DEFAULT_VALUE;
}
runspeed_mult = speed_selector;
{$asm}

mov ebx, [runspeed_mult]
mov [r14+0C], ebx
@@:
pop rbx
// additional code end
// original code start
mulss xmm2,[r14+0C]
mulss xmm2,[r14+10]
movaps xmm4,xmm2
// original code end
jmp return_RunSpeed

aob_RunSpeed:
  jmp far newmem_RunSpeed
  nop
return_RunSpeed:

runspeed_mult:
dd (float)1.00

[DISABLE]
aob_RunSpeed:
  db F3 41 0F 59 56 0C F3 41 0F 59 56 10 0F 28 E2

unregistersymbol(aob_RunSpeed)
dealloc(newmem_RunSpeed)
dealloc(RunSpeedMult)

{
// ORIGINAL CODE - INJECTION POINT: game.dll+54902E

game.dll+548FCA: EB 08                       - jmp game.dll+548FD4
game.dll+548FCC: 41 0F 28 CC                 - movaps xmm1,xmm12
game.dll+548FD0: F3 0F 5D CA                 - minss xmm1,xmm2
game.dll+548FD4: 48 8B 44 24 68              - mov rax,[rsp+68]
game.dll+548FD9: F3 44 0F 10 1D 7A BB A9 00  - movss xmm11,[game.dll+FE4B5C]
game.dll+548FE2: 41 0F 28 C4                 - movaps xmm0,xmm12
game.dll+548FE6: 4C 8B 6C 24 50              - mov r13,[rsp+50]
game.dll+548FEB: F3 0F 5C C1                 - subss xmm0,xmm1
game.dll+548FEF: 4C 8B 7C 24 40              - mov r15,[rsp+40]
game.dll+548FF4: 4C 8B 65 88                 - mov r12,[rbp-78]
game.dll+548FF8: 44 0F 2F D8                 - comiss xmm11,xmm0
game.dll+548FFC: 77 09                       - ja game.dll+549007
game.dll+548FFE: 45 0F 28 DC                 - movaps xmm11,xmm12
game.dll+549002: F3 44 0F 5D D8              - minss xmm11,xmm0
game.dll+549007: F3 41 0F 10 56 04           - movss xmm2,[r14+04]
game.dll+54900D: F3 41 0F 59 16              - mulss xmm2,[r14]
game.dll+549012: F3 41 0F 10 6E 14           - movss xmm5,[r14+14]
game.dll+549018: F2 0F 10 05 90 BA A9 00     - movsd xmm0,[game.dll+FE4AB0]
game.dll+549020: F3 41 0F 59 56 08           - mulss xmm2,[r14+08]
game.dll+549026: F3 0F 10 98 B8 0C 00 00     - movss xmm3,[rax+00000CB8]
// ---------- INJECTING HERE ----------
game.dll+54902E: F3 41 0F 59 56 0C           - mulss xmm2,[r14+0C]
// ---------- DONE INJECTING  ----------
game.dll+549034: F3 41 0F 59 56 10           - mulss xmm2,[r14+10]
game.dll+54903A: 0F 28 E2                    - movaps xmm4,xmm2
game.dll+54903D: F3 0F 5C E5                 - subss xmm4,xmm5
game.dll+549041: 0F 5A CC                    - cvtps2pd xmm1,xmm4
game.dll+549044: 0F 54 0D D5 EF A9 00        - andps xmm1,[game.dll+FE8020]
game.dll+54904B: 66 0F 2F C1                 - comisd xmm0,xmm1
game.dll+54904F: 77 21                       - ja game.dll+549072
game.dll+549051: F3 41 0F 59 DD              - mulss xmm3,xmm13
game.dll+549056: 44 0F 2F C3                 - comiss xmm8,xmm3
game.dll+54905A: 76 06                       - jna game.dll+549062
game.dll+54905C: 41 0F 28 D0                 - movaps xmm2,xmm8
game.dll+549060: EB 08                       - jmp game.dll+54906A
game.dll+549062: 41 0F 28 D4                 - movaps xmm2,xmm12
game.dll+549066: F3 0F 5D D3                 - minss xmm2,xmm3
game.dll+54906A: F3 0F 59 D4                 - mulss xmm2,xmm4
game.dll+54906E: F3 0F 58 D5                 - addss xmm2,xmm5
game.dll+549072: F3 41 0F 11 56 14           - movss [r14+14],xmm2
game.dll+549078: 43 80 BC 3C AD 58 00 00 00  - cmp byte ptr [r12+r15+000058AD],00
game.dll+549081: F3 44 0F 59 DA              - mulss xmm11,xmm2
game.dll+549086: 75 04                       - jne game.dll+54908C
}

Exemplify1524
Cheater
Cheater
Posts: 31
Joined: Tue Apr 30, 2024 8:37 am
Reputation: 16

Re: HELLDIVERS 2

Post by Exemplify1524 »

Modified ZoDDels sample pickup script.
Hold hotkey 'C' (its like crouching) while taking sample to override all counters.
Or dont hold hotkey to add more than 1. (specify here #define HOTKEY_NOT_PRESSED_ADD_VALUE 10)
Also press secret hotkey 'Q' if you want take exactly 1 sample.
I leave many comments in code.

Added to script many checks to help not reach limit >100 samples.


Spoiler

Code: Select all

{ Game   : helldivers2.exe
  Version:
  Date   : 2024-04-30
  Author : ZoDDeL
  Mod by : Anton
  Tested on: .303 path

  Hold hotkey while taking sample to override all counters. Or dont hold hotkey to add more than 1.  Also press secret hotkey if you want take exactly 1 sample.
  You can edit #define section values
}
{$c}
  // YOU CAN EDIT SECTION START
  #define CHEAT_ALL_HOTKEY 'C'
  #define SECRET_HOTKEY 'Q'
  // Keep common + rare + super sum below or equal to 100. For example you can specify 50+40+10 = 100
  #define HOTKEY_PRESSED_COMMON_SAMPLE_COUNT_REDEFINE 45
  #define HOTKEY_PRESSED_RARE_SAMPLE_COUNT_REDEFINE 30
  #define HOTKEY_PRESSED_SUPER_SAMPLE_COUNT_REDEFINE 10
  // if hotkey is not pressed and player take sample it will add specified value (game default is 1)
  #define HOTKEY_NOT_PRESSED_ADD_VALUE 10
  // YOU CAN EDIT SECTION END
  #define NO_OLDNAMES
  #include <windows.h>
  extern __cdecl int sprintf(char *, char *, ...);
  extern __cdecl void OutputDebugStringA(const char* lpOutputString);
  short GetAsyncKeyState(int);
  char debug_string[400];
  typedef struct {
    int common;
    int rare;
    int super;
  } Samples;

/*
void show_bits_sprintf(int *rdx_value, char *buffer) {
  unsigned int mask = 0x80000000; // Маска для старшего бита
  int i;

  for (i = 0; i < 32; ++i) {
    // Проверяем, установлен ли бит
    if (*rdx_value & mask) {
      sprintf(buffer + i, "1");
    } else {
      sprintf(buffer + i, "0");
    }

    mask >>= 1; // Сдвигаем маску на один бит вправо
  }

  sprintf(buffer + 32, "\0"); // Добавляем завершающий нуль-символ
}
*/
{$asm}

[ENABLE]
aobscanmodule(samples_inject,game.dll,48 8D 14 41 48 8B 43 40 4B 8D 0C 89 44 01 7C 90 04) // should be unique
alloc(samples_newmem,$2000)
label(samples_return)

samples_newmem:


  // original code start
  lea rdx,[rcx+rax*2]
  mov rax,[rbx+40]
  lea rcx,[r9+r9*4]
  // add [rax+rdx*4+04],r15d
  // original code end

  /*
  cmp rdx,0
  je samples_common
  cmp rdx,1
  je samples_rare
  cmp rdx,2
  je samples_super
samples_common: // when you pickup common
  mov [rax+rdx*4+04],#49 // common sample
  mov [rax+rdx*4+04+4],#30 // rare sample
  mov [rax+rdx*4+04+8],#20 // super sample
  jmp samples_return

samples_rare: // when you pickup rare
  mov [rax+rdx*4+04-4],#49 // common sample
  mov [rax+rdx*4+04],#30 // rare sample
  mov [rax+rdx*4+04+4],#20 // super sample
  jmp samples_return

samples_super: // when you pickup super
  mov [rax+rdx*4+04-8],#49 // common sample
  mov [rax+rdx*4+04-4],#30 // rare sample
  mov [rax+rdx*4+04],#20 // super sample
  jmp samples_return
  */
{$ccode base1=rax sample_type=rdx}
  // calculate base_address of samples structure
  // rdx 0 = base+4
  // rdx 1 = base+4+4-4 = base+4
  // rdx 2 = base+8+4-8 = base+4
  // Samples* samples = (Samples*)(base1 + sample_type*4 + 4 - sample_type*4 );
  Samples* samples = (Samples*)(base1 + 4);
  /*
  OutputDebugStringA("Samples: Got samples structure");

  sprintf(debug_string, "Samples in: common %d | rare %d | super %d", samples->common, samples->rare, samples->super);
  OutputDebugStringA(debug_string);

  sprintf(debug_string, "Samples: taken sample type is %d Amount: %d", sample_type, taken_sample_amount_r15d);
  OutputDebugStringA(debug_string);


  OutputDebugStringA("Samples: sample_type RDX  bits:");
  show_bits_sprintf(&sample_type, &debug_string);
  OutputDebugStringA(debug_string);

  OutputDebugStringA("Samples: sample amount r15d bits:");
  show_bits_sprintf(&taken_sample_amount_r15d, &debug_string);
  OutputDebugStringA(debug_string);
  */
  int samples_count_now = samples->common + samples->rare + samples->super;
  if (samples_count_now > 100) {
    samples->common = HOTKEY_PRESSED_COMMON_SAMPLE_COUNT_REDEFINE;
    samples->rare = HOTKEY_PRESSED_RARE_SAMPLE_COUNT_REDEFINE;
    samples->super = HOTKEY_PRESSED_SUPER_SAMPLE_COUNT_REDEFINE;
    sprintf(debug_string, "Samples: samples count at the moment is already >100: %d. Sample counts will set to maximum, and no new samples added: %d %d %d", samples_count_now, samples->common, samples->rare, samples->super);
    OutputDebugStringA(debug_string);
  }
  if (GetAsyncKeyState(CHEAT_ALL_HOTKEY) & 0x8000) {
    samples->common = HOTKEY_PRESSED_COMMON_SAMPLE_COUNT_REDEFINE;
    samples->rare = HOTKEY_PRESSED_RARE_SAMPLE_COUNT_REDEFINE;
    samples->super = HOTKEY_PRESSED_SUPER_SAMPLE_COUNT_REDEFINE;
    sprintf(debug_string, "Samples: hotkey pressed. Sample counts just set to maximum: %d %d %d", samples->common, samples->rare, samples->super);
    OutputDebugStringA(debug_string);
  } else {
    // If player take sample and key not pressed.
    // In this part of code you can set taken sample value multiplier
    // For example you taken 2 common samples. Set multiplier (bottom at the code) from 1.0f to 3.0f. So you will get 2 * 3.0 = 6 samples
    // addres of sample value you taken
    int value_to_add = 1;
    if (GetAsyncKeyState(SECRET_HOTKEY) & 0x8000) {
      // player donot press Cheat all hotkey but press Secret hotkey. So set pickup amount to default 1.
      // So other players can check there is no problem with you.
      // But they still may ask you throw all collected samples, and detect you're a cheater
      value_to_add = 1;
      sprintf(debug_string, "Samples: secret hotkey pressed. Samples piclup will be default (1) while you holding it");
      OutputDebugStringA(debug_string);
    } else {
      value_to_add = HOTKEY_NOT_PRESSED_ADD_VALUE;
      int add_limit = 100 - samples_count_now;
      if (add_limit == 0) {
        sprintf(debug_string, "Samples: limit reached %d. No additional samples will be added", add_limit);
        OutputDebugStringA(debug_string);
      } else if (add_limit < 0) {
        samples->common = 50;
        samples->rare = 40;
        samples->super = 10;
        sprintf(debug_string, "Samples: count is more than allowed: %d. No additional samples will be added. Sample counts are set to maximum: %d %d %d", samples_count_now, samples->common, samples->rare, samples->super);
        OutputDebugStringA(debug_string);
      } else if (value_to_add > add_limit) {
        value_to_add = add_limit;
        sprintf(debug_string, "Samples: too much samples already collected. Add value is clamped to %d/%d", value_to_add, HOTKEY_NOT_PRESSED_ADD_VALUE);
        OutputDebugStringA(debug_string);
      } else {
        sprintf(debug_string, "Samples: will add %d of type %d", value_to_add, sample_type);
        OutputDebugStringA(debug_string);
      }
    }

    if (sample_type == 0) {
       samples->common += value_to_add;
    }
    if (sample_type == 1) {
       samples->rare += value_to_add;
    }
    if (sample_type == 2) {
       samples->super += value_to_add;
    }
  }

  // hardcoded limit guard
  samples_count_now = samples->common + samples->rare + samples->super;
  if (samples_count_now > 100) {
    samples->common = 50;
    samples->rare = 40;
    samples->super = 10;
    sprintf(debug_string, "Samples: Hardcoded guard. Samples SUM is >100: %d. Sample counts are reset to maximum allowed: %d %d %d", samples_count_now, samples->common, samples->rare, samples->super);
    OutputDebugStringA(debug_string);
  }


/*
  // output debug. you can look in DebugViewPP tool https://github.com/CobaltFusion/DebugViewPP
  sprintf(debug_string, "Samples out: common %d | rare %d | super %d", samples->common, samples->rare, samples->super);
  OutputDebugStringA(debug_string);
*/
{$asm}
jmp samples_return

samples_inject:
jmp far samples_newmem
nop 3

samples_return:
registersymbol(samples_inject)

[DISABLE]

samples_inject:
  db 48 8D 14 41 48 8B 43 40 4B 8D 0C 89 44 01 7C 90 04

unregistersymbol(samples_inject)
dealloc(samples_newmem)

{
// ORIGINAL CODE - INJECTION POINT: game.dll+608B8F

game.dll+608B68: 41 FF C0        - inc r8d
game.dll+608B6B: 45 3B C1        - cmp r8d,r9d
game.dll+608B6E: 72 E0           - jb game.dll+608B50
game.dll+608B70: B8 FF FF FF FF  - mov eax,FFFFFFFF
game.dll+608B75: 48 8B 74 24 48  - mov rsi,[rsp+48]
game.dll+608B7A: 48 8B 6C 24 40  - mov rbp,[rsp+40]
game.dll+608B7F: 48 8B 7C 24 50  - mov rdi,[rsp+50]
game.dll+608B84: 44 8B C8        - mov r9d,eax
game.dll+608B87: 41 8D 4E FF     - lea ecx,[r14-01]
game.dll+608B8B: 4B 8D 04 89     - lea rax,[r9+r9*4]
// ---------- INJECTING HERE ----------
game.dll+608B8F: 48 8D 14 41     - lea rdx,[rcx+rax*2]
// ---------- DONE INJECTING  ----------
game.dll+608B93: 48 8B 43 40     - mov rax,[rbx+40]
game.dll+608B97: 4B 8D 0C 89     - lea rcx,[r9+r9*4]
game.dll+608B9B: 44 01 7C 90 04  - add [rax+rdx*4+04],r15d
game.dll+608BA0: BA 94 4C 74 92  - mov edx,92744C94
game.dll+608BA5: 48 8B 43 40     - mov rax,[rbx+40]
game.dll+608BA9: 4C 8D 04 C8     - lea r8,[rax+rcx*8]
game.dll+608BAD: 48 8B 43 30     - mov rax,[rbx+30]
game.dll+608BB1: 4A 8B 0C C8     - mov rcx,[rax+r9*8]
game.dll+608BB5: 8B 49 10        - mov ecx,[rcx+10]
game.dll+608BB8: E8 63 13 49 00  - call game.dll+A99F20
}
Last edited by Exemplify1524 on Sun May 12, 2024 10:50 pm, edited 1 time in total.

Exemplify1524
Cheater
Cheater
Posts: 31
Joined: Tue Apr 30, 2024 8:37 am
Reputation: 16

Re: HELLDIVERS 2

Post by Exemplify1524 »

Modified ZoDDels Instant complete scripts.
Press NUM1 to finish bot hives / bases etc
Spoiler

Code: Select all

{ Game   : helldivers2.exe
  Version: 
  Date   : 2024-05-03
  Author : ZoDDeL

  This script does blah blah blah
}
{$c}
#define NO_OLDNAMES
#include <windows.h>
short GetAsyncKeyState(int);
#define BUG_HIVES_COMPLETED_HOTKEY VK_NUMPAD1
{$asm}

[ENABLE]

aobscanmodule(completeHiveBase_injection,game.dll,48 8D 04 F6 8B FE 4C 69 DF 90 02 00 00 4C 03 5B 48) // should be unique
alloc(completeHiveBase_newmem,$1000)

label(completeHiveBase_code)
label(completeHiveBase_return)
label(completeHiveBase_do_trick)
label(completeHiveBase_do_nothink)


completeHiveBase_newmem:

completeHiveBase_code:
  //original code start
  lea rax,[rsi+rsi*8]  // +F8E0E4
  mov edi,esi
  imul r11,rdi,00000290
  add r11,[rbx+48]
  //original code end
  push rcx
{$ccode jmpaddr=rcx}
  extern void completeHiveBase_do_nothink();
  extern void completeHiveBase_do_trick();

  short res = GetAsyncKeyState(BUG_HIVES_COMPLETED_HOTKEY);

  jmpaddr = completeHiveBase_do_nothink;
  if (res & 0x8000) {
    jmpaddr = completeHiveBase_do_trick;
  }
{$asm}
  jmp rcx

completeHiveBase_do_nothink:
  pop rcx
  jmp completeHiveBase_return

completeHiveBase_do_trick:
  pop rcx
  mov byte ptr [rcx+rax*4+21],01 // +F8E103 cmp byte ptr [rcx+rax*4+21],00
  jmp completeHiveBase_return

completeHiveBase_injection:
  jmp far completeHiveBase_newmem
  nop 3

completeHiveBase_return:
registersymbol(completeHiveBase_injection)

[DISABLE]
completeHiveBase_injection:
  db 48 8D 04 F6 8B FE 4C 69 DF 90 02 00 00 4C 03 5B 48

unregistersymbol(completeHiveBase_injection)
dealloc(completeHiveBase_newmem)

{
// ORIGINAL CODE - INJECTION POINT: game.dll+F8E0E4

game.dll+F8E0AE: 72 B0                          - jb game.dll+F8E060
game.dll+F8E0B0: 48 8B 1D 29 B4 91 00           - mov rbx,[game.dll+18A94E0]
game.dll+F8E0B7: 33 F6                          - xor esi,esi
game.dll+F8E0B9: 39 73 0C                       - cmp [rbx+0C],esi
game.dll+F8E0BC: 0F 86 4A 02 00 00              - jbe game.dll+F8E30C
game.dll+F8E0C2: 48 8B 2D B7 60 9B 00           - mov rbp,[game.dll+1944180]
game.dll+F8E0C9: 48 BA 8F E3 38 8E E3 38 8E E3  - mov rdx,E38E38E38E38E38F
game.dll+F8E0D3: 4C 8B BC 24 80 00 00 00        - mov r15,[rsp+00000080]
game.dll+F8E0DB: 0F 1F 44 00 00                 - nop dword ptr [rax+rax+00]
game.dll+F8E0E0: 48 8B 4B 50                    - mov rcx,[rbx+50]
// ---------- INJECTING HERE ----------
game.dll+F8E0E4: 48 8D 04 F6                    - lea rax,[rsi+rsi*8]
// ---------- DONE INJECTING  ----------
game.dll+F8E0E8: 8B FE                          - mov edi,esi
game.dll+F8E0EA: 4C 69 DF 90 02 00 00           - imul r11,rdi,00000290
game.dll+F8E0F1: 4C 03 5B 48                    - add r11,[rbx+48]
game.dll+F8E0F5: 41 80 BB 7F 02 00 00 00        - cmp byte ptr [r11+0000027F],00
game.dll+F8E0FD: 0F 84 F7 01 00 00              - je game.dll+F8E2FA
game.dll+F8E103: 80 7C 81 21 00                 - cmp byte ptr [rcx+rax*4+21],00
game.dll+F8E108: 0F 85 EC 01 00 00              - jne game.dll+F8E2FA
game.dll+F8E10E: 80 7C 81 23 00                 - cmp byte ptr [rcx+rax*4+23],00
game.dll+F8E113: 0F 84 E1 01 00 00              - je game.dll+F8E2FA
game.dll+F8E119: 48 8B 43 38                    - mov rax,[rbx+38]
}
Press NUM2 to finish all side missions
Press NUM3 to finish main mission
Spoiler

Code: Select all

{ Game   : helldivers2.exe
  Version: 
  Date   : 2024-04-05
  Author : ZoDDeL

  This script does blah blah blah
}
{$c}
#define NO_OLDNAMES
#include <windows.h>
short GetAsyncKeyState(int);
extern float ext_damage_mult;
#define SIDE_MISSIONS_COMPLETED_HOTKEY VK_NUMPAD2
#define MAIN_MISSIONS_COMPLETED_HOTKEY VK_NUMPAD3
{$asm}

[ENABLE]
aobscanmodule(missionA,game.dll,45 8B 4A 18 48 8D 8E 20 01 00 00 41 8B D5) // should be unique
alloc(missionA_newmem,$1000)
label(missionA_code)
label(missionA_return)

missionA_newmem:
{$ccode r10=r10}
int *main_mission_status = (int*)(r10+18);
if (GetAsyncKeyState(MAIN_MISSIONS_COMPLETED_HOTKEY) & 0x8000) {
   *main_mission_status = 1;
}

// global operations
if (GetAsyncKeyState(VK_CONTROL) & 0x8000) {
  ext_damage_mult = 30.0;
} else {
  ext_damage_mult = 1.0;
}
{$asm}
missionA_code:
  mov r9d,[r10+18]
  lea rcx,[rsi+00000120]
  mov edx,r13d
  jmp missionA_return
missionA:
  jmp far missionA_newmem
missionA_return:
//--------------------------------------------------------
aobscanmodule(missionB,game.dll,41 8B 47 38 83 E8 02 83 F8 01 8B 83 14 08 00 00) // should be unique
alloc(missionB_newmem,$1000)

label(missionB_code)
label(missionB_return)
label(missionB_no_change)
label(missionB_complete)

missionB_newmem:
push rax
push rbx
push rcx
push rdx
push rsi
push rdi
push rbp
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15
pushfq
{$ccode jmpaddr=rcx}
extern void missionB_no_change();
extern void missionB_complete();
short GetAsyncKeyState(int);
short res = GetAsyncKeyState(SIDE_MISSIONS_COMPLETED_HOTKEY);
jmpaddr = missionB_no_change;
if (res & 0x8000) {
  jmpaddr = missionB_complete;
}
{$asm}
jmp rcx

missionB_no_change:
popfq
pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop rbp
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
pop rax
jmp missionB_code


missionB_complete:
popfq
pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop rbp
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
pop rax
  mov [r15+38],#2
  jmp missionB_code
missionB_code:
  mov eax,[r15+38]
  sub eax,02
  cmp eax,01
  mov eax,[rbx+00000814]
  jmp missionB_return
missionB:
  jmp far missionB_newmem
  nop 2
missionB_return:


[DISABLE]

Press NUM0 for instant shuttle
Spoiler

Code: Select all

{$c}
#define NO_OLDNAMES
#include <windows.h>
short GetAsyncKeyState(int);
#define INSTANT_SHUTTLE_HOTKEY VK_NUMPAD0
{$asm}


[ENABLE]

aobscanmodule(ShuttleTimer,game.dll,F3 41 0F 5C C5 F3 0F 11 04 C8 49 8B 47 78) // should be unique
alloc(shuttle_newmem,$1000)

label(shuttle_orig_code)
label(shuttle_return)
label(shuttle_not_change)
label(shuttle_now)

shuttle_newmem:
push rax
push rbx
push rcx
push rdx
push rsi
push rdi
push rbp
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15
pushfq
{$ccode jmpaddr=rcx}
extern void shuttle_not_change();
extern void shuttle_now();
short GetAsyncKeyState(int);
short res = GetAsyncKeyState(INSTANT_SHUTTLE_HOTKEY);
jmpaddr = shuttle_not_change;
if (res & 0x8000) {
  jmpaddr = shuttle_now;
}
{$asm}
jmp rcx

shuttle_not_change:
popfq
pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop rbp
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
pop rax
jmp shuttle_orig_code

shuttle_now:
popfq
pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop rbp
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
pop rax
  ucomiss xmm0, DWORD [compare_shuttle]
  jbe shuttle_orig_code
  movss xmm0, DWORD [compare_shuttle]
  jmp shuttle_orig_code

shuttle_orig_code:
  // original code start
  subss xmm0,xmm13
  movss [rax+rcx*8],xmm0
  mov rax,[r15+78]
  // original code end
  jmp shuttle_return

compare_shuttle:
dd (float)1.0

ShuttleTimer:
  jmp far shuttle_newmem
shuttle_return:

[DISABLE]

User avatar
gir489
RCE Fanatics
RCE Fanatics
Posts: 684
Joined: Mon May 08, 2017 4:08 am
Reputation: 507

Re: HELLDIVERS 2

Post by gir489 »

ZoDDeL wrote:
Sat May 11, 2024 11:47 am
Actually made decent changes.
Nice work! BTW: cfemen and I have been taking apart that damage function and we have noticed several things:

A lot of weapons are misidentified or just flat-out wrong. We corrected them here:
You can use the OnClick Armory Weapon Editor to find out the primary/secondary/grenades ID very easily by clicking them in the armory, and then reading what's at +0. Off the top of my head, I remember P-19 Redeemer being wrong, and a bunch others, but I can't remember. However, we haven't found a way to easily discover the IDs of the strategem weapons, and they are the most abundent.

We tried several heuristical ways to determine if the incoming callee is a robot/bug or a player, but we found nothing... It seems the Weapon ID method really is the best way to do it, but a major pain in the fucking ass, because they change every update. They should be coming from generated_weapon_customization_settings.dl_bin, but it's encrypted now, which we know how to decrypt, but not necessarily how to read... Basically, it's the same thing at game.dll+1DF33F0 which is an array read by the function you're hooking. If one of the parameters +36 has an index, it loads from there the weapon structure. otherwise, it loads game.dll+1DF3FD0 which is your "skip any 0 dmg weapons like smoke or unknown shit" scenario you've discovered.

Post Reply

Who is online

Users browsing this forum: admantx, AmazonBot, Cloover, deriderder, dirtydanisreal, Google [Bot], Google Adsense [Bot], Jetadawoot, kyosuke, liquidxearo1, masterrune, oqsoljqjtdlxrgypnn, pavlosgr, running_nomad, ryouhei, SemrushBot, Sjusju, teppei00002002, VirgilSouth, VOO_DOO, zeng954