Page 2 of 8 FirstFirst 1234 ... LastLast
Results 11 to 20 of 73

Thread: GAS Grenade For COD2 MP

  1. #11
    Private First Class G-Stuff002's Avatar
    Join Date
    Jan 2018
    Posts
    212
    Thanks
    42
    Thanked 109 Times in 107 Posts
    I'll will spend the whole day today and i will write out all the scripts related to grenade from all folders and files. Maybe someone fast a look after, when i finish and prompt the line where the script is responsible for "slowdeath" as said kung foo man. Ok, I'm starting...

  2. #12
    Brigadier General
    Join Date
    Oct 2012
    Posts
    994
    Thanks
    20
    Thanked 588 Times in 388 Posts
    Quote Originally Posted by G-Stuff002 View Post
    I begin to disassemble this mod, its differently have this grenade is no possibility. As an experiment i deleted
    moke_grenade_german_mp2,
    smoke_grenade_german_mp,
    GASGrenadeallies_mp,
    GASGrenadeaxis_mp

    and gas grenede STILL work in game, I think it's in scripts who are responsible for this.

    I look in _weapons.gsc but not find script responsible for function

    This is IWD have all folders and files for grenade but without script for damage
    https://drive.google.com/open?id=1dD...4YFjg1fD2fYGRq

    Spoiler:


    Spoiler:
    The GSC file that handles mustard gas damage is in _mc2\_mc2_mcFX:

    Allies:

    Code:
    _mc2\_mc2_mcFX::AlliedMonitorMustardGas();
    Code:
    _mc2\_mc2_mcFX::AlliedGasPlayer();
    Axis:

    Code:
    _mc2\_mc2_mcFX::AxisMonitorMustardGas();
    Code:
    _mc2\_mc2_mcFX::AxisGasPlayer();
    There are 2 weapon files:

    Code:
    alliesgas_mp
    Code:
    axisgas_mp
    And both the weapon files use a single FX file:

    Code:
    fx\impacts\mustard_blast.efx
    I've no idea why they have four functions handling the damage. From what I've seen, the only difference between them is the name of the sWeapon. But you can handle that by stipulating the different names based on team:

    Code:
    monitorMustardGas( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime )
    { 
    	self endon("TimeToDie");
    	self endon("disconnect");
    	//PLAY EFFECT FOR 15 SECONDS 
    	gastime = 10;     
    	for(j = 0;j <= gastime;j++) 
    	{ 
    		//LOOP THROUGH PLAYERS AND DETERMINE WHO IS IN RANGE 
    		players = getentarray("player", "classname"); 
    		for(i=0;i<players.size;i++) 
    		{ 
    			dst = distance(vPoint, players[i].origin); 
    
    			//AREA WHICH PLAYER WILL BE AFFECTED EXPANDS 
    			//ALONG WITH THE GAS/SMOKE (~2ft per sec)
    
    			if( dst > 200 + (j * 20) || players[i].sessionstate != "playing" || !isAlive(players[i]) ) 
    				continue; 
    			//DAMAGE THE PLAYER
    
    			pcnt = 200 + (j * 20);
    			if(dst > pcnt * .75 ) 					// 0-25% dmg
    				iDamage = randomint(5);
    			else if(dst > pcnt * .5 && dst < pcnt * .75) 	// 25-50 % dmg
    				iDamage = 15 + randomint(5);
    			else if(dst > pcnt *.25 && dst < pcnt * .5) 	// 59-75% dmg
    				iDamage = 30 + randomint(5);
    			else if(dst < pcnt * .25)				// 100% dmg
    				iDamage = 45 + randomint(5);
    
    			//vDir = undefined; 
    			//SET THE MOD 
    			sMeansOfDeath = "MOD_UNKNOWN"; 
    			// SET THE WEAPON TO "NONE" SO THE DAMAGE CALLBACK 
    			// DOESNT PICK IT BACK UP AND RESTART THE THREAD 
    			
    			if( eAttacker.pers["team"] == "axis" )
    				sWeapon = "alliedgas_mp";
    			else
    				sWeapon = "axisgas_mp";
    			
    			iDFlags = 1; 
    
    			players[i] thread AlliedGasPlayer(eAttacker, eAttacker, iDamage, iDFlags , sMeansOfDeath , sWeapon, vPoint , undefined,"none",psOffsetTime); 
    		} 
    		wait(1); 
    	}    
    }
    Last edited by Tally; 21st February 2018 at 10:55.

  3. The Following User Says Thank You to Tally For This Useful Post:

    kung foo man (21st February 2018)

  4. #13
    Private First Class G-Stuff002's Avatar
    Join Date
    Jan 2018
    Posts
    212
    Thanks
    42
    Thanked 109 Times in 107 Posts
    Way: merc2v3_4pb_svr_.iwd/

    1 folder. /character (nothing here)
    2 folder. /codescripts (nothing here)
    3 folder. /mptype (nothing here)

    4 folder. /_mc2/
    Copy of _mc2_special.gsc (maybe)
    >.....upload later

    pb.gsc (nothing)
    _ammobox_allied.gsc (nothing)
    _ammobox_axis.gsc (nothing)
    _artillery.gsc (nothing) WOW, Tally took a part in the development this script..

    _callbacksetup.gsc (maybe)
    >.....upload later

    _healthpacks.gsc (nothing)
    _mc2_classes.gsc (nothing)

    _mc2_gore.gsc (maybe)
    >.....upload later

    Spoiler:
    case "axisfire_mp":
    case "fire_mp":
    case "alliedgas_mp":
    case "axisgas_mp":
    return "specialnades";

    //die extrawurst


    _mc2_hud.gsc (nothing)

    _mc2_init.gsc (maybe)
    >.....upload later

    _mc2_mcFX.gsc (maybe find) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    >.....upload later

    }
    }

    //Begin split
    /* -----------------------------------------------------
    CREATE THE AREA EFFECT
    AND DAMAGE FOR THE MUSTARD GAS
    eAttacker = owner of damage
    vPoint = mustard gas grenade coords
    ---------------------------------------------------- */
    AlliedMonitorMustardGas(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime)
    {
    self endon("TimeToDie");
    self endon("disconnect");
    //PLAY EFFECT FOR 15 SECONDS
    gastime = 10;
    for(j = 0;j <= gastime;j++)
    {
    //LOOP THROUGH PLAYERS AND DETERMINE WHO IS IN RANGE
    players = getentarray("player", "classname");
    for(i=0;i<players.size;i++)
    {
    dst = distance(vPoint, players[i].origin);

    //AREA WHICH PLAYER WILL BE AFFECTED EXPANDS
    //ALONG WITH THE GAS/SMOKE (~2ft per sec)

    if( dst > 200 + (j * 20) || players[i].sessionstate != "playing" || !isAlive(players[i]) )
    continue;
    //DAMAGE THE PLAYER

    pcnt = 200 + (j * 20);
    if(dst > pcnt * .75 ) // 0-25% dmg
    iDamage = randomint(5);
    else if(dst > pcnt * .5 && dst < pcnt * .75) // 25-50 % dmg
    iDamage = 15 + randomint(5);
    else if(dst > pcnt *.25 && dst < pcnt * .5) // 59-75% dmg
    iDamage = 30 + randomint(5);
    else if(dst < pcnt * .25) // 100% dmg
    iDamage = 45 + randomint(5);

    //vDir = undefined;
    //SET THE MOD
    sMeansOfDeath = "MOD_UNKNOWN";
    // SET THE WEAPON TO "NONE" SO THE DAMAGE CALLBACK
    // DOESNT PICK IT BACK UP AND RESTART THE THREAD
    sWeapon = "alliedgas_mp";
    iDFlags = 1;

    players[i] thread AlliedGasPlayer(eAttacker, eAttacker, iDamage, iDFlags , sMeansOfDeath , sWeapon, vPoint , undefined,"none",psOffsetTime);
    }
    wait(1);
    }
    }

    and other script...


    _mc2_models.gsc (nothing)
    _mc2_payload.gsc (nothing)

    _mc2_player.gsc (maybe)

    Spoiler:
    }
    if(level.scr_extragore && sMeansOfDeath != "MOD_GRENADE" && sMeansOfDeath != "MOD_GRENADE_SPLASH")
    {
    if(level.bloodfx==0)return;
    else if(level.bloodfx==1)
    {
    switch (randomint(3))
    {
    case 0: playfx(level._effect["hit_extra1_mc"],vPoint,vDir);break;
    case 1: playfx(level._effect["hit_extra2_mc"],vPoint,vDir);break;
    case 2: playfx(level._effect["hit_extra3_mc"],vPoint,vDir);break;
    }



    _mc2_special.gsc (nothing)

    _mc2_util.gsc (maybe)

    Spoiler:
    /*-------------------------------------------
    CLEAN UP THE HUD ELEMENTS WHEN A PLAYER DIES
    -------------------------------------------*/
    resetHUD()
    {
    if (isDefined(self.Painscreen))
    self.Painscreen destroy();
    if (isDefined(self.Painscreen2))
    self.Painscreen2 destroy();
    if (isDefined(self.bloodyscreen))
    self.bloodyscreen destroy();
    if (isDefined(self.bloodyscreen1))
    self.bloodyscreen1 destroy();
    if (isDefined(self.bloodyscreen2))
    self.bloodyscreen2 destroy();
    }

    and other...

    _mc2_vars.gsc (maybe) (Initialize the cvars )

    _medkit_allied.gsc (nothing)
    _medkit_axis.gsc (nothing)
    _mortars.gsc (nothing)
    _sprinting.gsc (nothing)



    5 folder. /maps/mp/

    mp_rhine.gsc (nothing)
    _load.gsc (nothing)


    /maps/mp/gametypes

    it's i need gametypes
    tdm.gsc (maybe)
    dm.gsc (maybe)

    Spoiler:
    //[Merciless2]///////////////////////////////
    if(isdefined(self.protected))return;
    if(isDefined(sWeapon) && sWeapon == "axisgas_mp"||sWeapon == "alliedgas_mp")
    {
    if(sWeapon == "alliedgas_mp" && sMeansOfDeath != "MOD_MELEE")
    {
    if (!isDefined(vPoint))
    vPoint = self.origin + (0,0,11);
    if(isDefined(level.mustardgas) && level.mustardgas == vPoint)
    return;
    level.mustardgas = vPoint;
    level thread _mc2\_mc2_mcFX::AlliedMonitorMustardGas(eInflictor , eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, level.mustardgas, vDir, sHitLoc, psOffsetTime);
    return;
    }
    else if(sWeapon == "axisgas_mp" && sMeansOfDeath != "MOD_MELEE")
    {
    if (!isDefined(vPoint))
    vPoint = self.origin + (0,0,11);
    if(isDefined(level.mustardgas) && level.mustardgas == vPoint)
    return;
    level.mustardgas = vPoint;
    level thread _mc2\_mc2_mcFX::AlliedMonitorMustardGas(eInflictor , eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, level.mustardgas, vDir, sHitLoc, psOffsetTime);
    return;

    }
    }

    AND

    //[Merciless2]///////////////////////////////
    if(isdefined(self.protected))return;
    if(isDefined(sWeapon) && sWeapon == "axisgas_mp"||sWeapon == "alliedgas_mp")
    {
    if(sWeapon == "alliedgas_mp" && sMeansOfDeath != "MOD_MELEE")
    {
    if (!isDefined(vPoint))
    vPoint = self.origin + (0,0,11);
    if(isDefined(level.mustardgas) && level.mustardgas == vPoint)
    return;
    level.mustardgas = vPoint;
    level thread _mc2\_mc2_mcFX::AlliedMonitorMustardGas(eInflictor , eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, level.mustardgas, vDir, sHitLoc, psOffsetTime);
    return;
    }
    else if(sWeapon == "axisgas_mp" && sMeansOfDeath != "MOD_MELEE")
    {
    if (!isDefined(vPoint))
    vPoint = self.origin + (0,0,11);
    if(isDefined(level.mustardgas) && level.mustardgas == vPoint)
    return;
    level.mustardgas = vPoint;
    level thread _mc2\_mc2_mcFX::AlliedMonitorMustardGas(eInflictor , eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, level.mustardgas, vDir, sHitLoc, psOffsetTime);
    return;

    }



    _callbacksetup.gsc (maybe)
    >.....upload later

    Spoiler:
    /*---------------------------------------
    SCREAMS WHEN WEAPON IS A FLAME WEAPON
    ----------------------------------------*/
    if(!isDefined(self.scr) && sMeansOfDeath == "MOD_FLAME")
    {
    self thread _mc2\_mc2_util::scream("m");
    }


    if(!isDefined(level.scr_tkpunish))
    level.scr_tkpunish = 0;

    if(!isDefined(iDamage))
    iDamage = 1;

    if(sWeapon != "fire_mp" && sWeapon != "axisgas_mp" && sWeapon != "axisfire_mp" && sWeapon !="alliedgas_mp" && sMeansOfDeath != "MOD_UNKNOWN")
    {


    _grenadeindicators.gsc (nothing)
    _healthoverlay.gsc (nothing)
    _hud_playerscore.gsc (nothing)
    _hud_teamscore.gsc (nothing)
    _menus.gsc (nothing)
    _quickmessages.gsc (nothing)
    _teams.gsc (nothing)
    _weapons.gsc (maybe need "Class special weapons balanced")
    Last edited by G-Stuff002; 21st February 2018 at 12:31.

  5. #14
    Private First Class G-Stuff002's Avatar
    Join Date
    Jan 2018
    Posts
    212
    Thanks
    42
    Thanked 109 Times in 107 Posts
    Thank you Tally!

    ..omg, now it need to understand how to put everything together for one iwd to cut/collect/combine all files and scripts in one mod (gasgrenade)


    continue to think.. and work
    Last edited by G-Stuff002; 21st February 2018 at 12:56.

  6. #15
    Private First Class G-Stuff002's Avatar
    Join Date
    Jan 2018
    Posts
    212
    Thanks
    42
    Thanked 109 Times in 107 Posts
    Maybe they have four functions handling the damage because they have a different range/distances of damage i think...or timing of damage
    Last edited by G-Stuff002; 21st February 2018 at 13:31.

  7. #16
    Private First Class G-Stuff002's Avatar
    Join Date
    Jan 2018
    Posts
    212
    Thanks
    42
    Thanked 109 Times in 107 Posts
    now, what i do. Look all script in _mc2_mcFX.gsc and change

    in script
    alliedgas_mp to smoke_grenade_german_mp, beacouse i will be use usual/original smoke grenade for change

    In weapons/mp
    alliedgas_mp file rename to smoke_grenade_german_mp and cut/past to new.iwd

    and will see if _mc2_mcFX Redirect to loading other GSCs
    Last edited by G-Stuff002; 21st February 2018 at 14:08.

  8. #17
    Brigadier General
    Join Date
    Oct 2012
    Posts
    994
    Thanks
    20
    Thanked 588 Times in 388 Posts
    Quote Originally Posted by G-Stuff002 View Post
    now, what i do. Look all script in _mc2_mcFX.gsc and change

    in script
    alliedgas_mp to smoke_grenade_german_mp, beacouse i will be use usual/original smoke grenade for change

    In weapons/mp
    alliedgas_mp file rename to smoke_grenade_german_mp and cut/past to new.iwd

    and will see if _mc2_mcFX Redirect to loading other GSCs
    To start everything off, you need to edit each gametype file, and modify the callback_playerdamage() function:

    Code:
    Callback_PlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime)
    {
    	if(self.sessionteam == "spectator")
    		return;
    		
    	if( isDefined(sWeapon) && sWeapon == "axisgas_mp"|| sWeapon == "alliedgas_mp" )
    	{
    			if(sWeapon == "alliedgas_mp" && sMeansOfDeath != "MOD_MELEE")
    			{
    				if (!isDefined(vPoint))
    					vPoint = self.origin + (0,0,11);
    				if(isDefined(level.mustardgas) && level.mustardgas == vPoint)
    					return;
    				level.mustardgas = vPoint;
    				level thread _mc2\_mc2_mcFX::AlliedMonitorMustardGas(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, level.mustardgas, vDir, sHitLoc, psOffsetTime);
    				return;
    			}
    			else if(sWeapon == "axisgas_mp" && sMeansOfDeath != "MOD_MELEE")
    			{
    				if (!isDefined(vPoint))
    				vPoint = self.origin + (0,0,11);
    				if(isDefined(level.mustardgas) && level.mustardgas == vPoint)
    				return;
    				level.mustardgas = vPoint;
    				level thread _mc2\_mc2_mcFX::AlliedMonitorMustardGas(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, level.mustardgas, vDir, sHitLoc, psOffsetTime);
    				return;
    
    			}
    	}
    
    	// Don't do knockback if the damage direction was not specified
    	if(!isDefined(vDir))
    		iDFlags |= level.iDFLAGS_NO_KNOCKBACK;
    
    	friendly = undefined;
    
    	// check for completely getting out of the damage
    	if(!(iDFlags & level.iDFLAGS_NO_PROTECTION))
    	{
    		if(isPlayer(eAttacker) && (self != eAttacker) && (self.pers["team"] == eAttacker.pers["team"]))
    		{
    			if(level.friendlyfire == "0")
    			{
    				return;
    			}
    			else if(level.friendlyfire == "1")
    			{
    				// Make sure at least one point of damage is done
    				if(iDamage < 1)
    					iDamage = 1;
    
    				self finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
    
    				// Shellshock/Rumble
    				self thread maps\mp\gametypes\_shellshock::shellshockOnDamage(sMeansOfDeath, iDamage);
    				self playrumble("damage_heavy");
    			}
    			else if(level.friendlyfire == "2")
    			{
    				eAttacker.friendlydamage = true;
    
    				iDamage = int(iDamage * .5);
    
    				// Make sure at least one point of damage is done
    				if(iDamage < 1)
    					iDamage = 1;
    
    				eAttacker finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
    				eAttacker.friendlydamage = undefined;
    
    				friendly = true;
    			}
    			else if(level.friendlyfire == "3")
    			{
    				eAttacker.friendlydamage = true;
    
    				iDamage = int(iDamage * .5);
    
    				// Make sure at least one point of damage is done
    				if(iDamage < 1)
    					iDamage = 1;
    
    				self finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
    				eAttacker finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
    				eAttacker.friendlydamage = undefined;
    
    				friendly = true;
    
    				// Shellshock/Rumble
    				self thread maps\mp\gametypes\_shellshock::shellshockOnDamage(sMeansOfDeath, iDamage);
    				self playrumble("damage_heavy");
    			}
    		}
    		else
    		{
    			// Make sure at least one point of damage is done
    			if(iDamage < 1)
    				iDamage = 1;
    
    			self finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
    
    			// Shellshock/Rumble
    			self thread maps\mp\gametypes\_shellshock::shellshockOnDamage(sMeansOfDeath, iDamage);
    			self playrumble("damage_heavy");
    		}
    
    		if(isdefined(eAttacker) && eAttacker != self)
    			eAttacker thread maps\mp\gametypes\_damagefeedback::updateDamageFeedback();
    	}
    	
    
    	// Do debug print if it's enabled
    	if(getCvarInt("g_debugDamage"))
    	{
    		println("client:" + self getEntityNumber() + " health:" + self.health +
    			" damage:" + iDamage + " hitLoc:" + sHitLoc);
    	}
    
    	if(self.sessionstate != "dead")
    	{
    		lpselfnum = self getEntityNumber();
    		lpselfname = self.name;
    		lpselfteam = self.pers["team"];
    		lpselfGuid = self getGuid();
    		lpattackerteam = "";
    
    		if(isPlayer(eAttacker))
    		{
    			lpattacknum = eAttacker getEntityNumber();
    			lpattackGuid = eAttacker getGuid();
    			lpattackname = eAttacker.name;
    			lpattackerteam = eAttacker.pers["team"];
    		}
    		else
    		{
    			lpattacknum = -1;
    			lpattackGuid = "";
    			lpattackname = "";
    			lpattackerteam = "world";
    		}
    
    		if(isDefined(friendly))
    		{
    			lpattacknum = lpselfnum;
    			lpattackname = lpselfname;
    			lpattackGuid = lpselfGuid;
    		}
    
    		logPrint("D;" + lpselfGuid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackGuid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sWeapon + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n");
    	}
    }
    As you can see from this, the code looks for either alliedgas_mp or axisgas_mp weapon files, and starts threading to your mustardgas functions.

  9. #18
    Private First Class G-Stuff002's Avatar
    Join Date
    Jan 2018
    Posts
    212
    Thanks
    42
    Thanked 109 Times in 107 Posts
    add to new.iwd/_mc2/_mc2_util.gsc (maybe need edit)

    because have find in code in _mc2_mcFX.gsc, this:
    }

    if(!isDefined(self.puked) && randomint(100) > 70) //30% chance to puke
    {
    playfxontag (level._effect["puke"], self, "j_Head");
    _mc2\_mc2_util::forceto("crouch");
    if(!isDefined(self.scr))
    {
    Last edited by G-Stuff002; 21st February 2018 at 15:26.

  10. #19
    Private First Class G-Stuff002's Avatar
    Join Date
    Jan 2018
    Posts
    212
    Thanks
    42
    Thanked 109 Times in 107 Posts
    ok,

    Olmost finish but now need copy from original cod2: dm.gsc and tdm.gsc
    beacouse in merc2V3_4pb this files configured to run unnecessary threads

    and insert the callback_playerdamage() scripts and modify

  11. #20
    Private First Class G-Stuff002's Avatar
    Join Date
    Jan 2018
    Posts
    212
    Thanks
    42
    Thanked 109 Times in 107 Posts
    Did not add to dm.gsc tdm.gsc:

    self _mc2\_mc2_player::_mc2_PlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);

    and _mc2/_mc2_player.gsc file

    ///maybe needed///

    continue edit...

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •