MODDB tutorial

Discuss anything not covered by any of the other categories.
Post Reply
franqutrass
Posts: 69
Joined: Wed Dec 30, 2009 6:29 pm
Location: peru
Contact:

MODDB tutorial

Post by franqutrass »

Hi I have a question because they do not understand a word of this tutorial.
http://www.moddb.com/games/quake-2/tuto ... apon-melee
hello
r00k
Posts: 1111
Joined: Sat Nov 13, 2004 10:39 pm

Post by r00k »

The problem is that the code is corrupted with characters like "&#40, &#13" etc. which are html tagged ascii key codes. something went wrong when the author posted the message and the message board converted the charsi. http://ascii.cl/htmlcodes.htm
You can hand convert them if u want :P
Chip
Posts: 575
Joined: Wed Jan 21, 2009 9:12 am
Location: Dublin, Ireland
Contact:

Re: MODDB tutorial

Post by Chip »

franqutrass wrote:Hi I have a question because they do not understand a word of this tutorial.
http://www.moddb.com/games/quake-2/tuto ... apon-melee
Ok, first we need to define the fire function.

Open up g_weapon.c, head to the bottom, all the way to the bottom... further... after fire_bfg.. further... yes, right there. Add all this in straight from the bottom:

Code: Select all

/*
/*
==================
Fire_Punch
Commented for Moddb Tutorial
==================
*/

void fire_punch (edict_t *self, vec3_t start, vec3_t aim, int reach, int damage, int kick, int quiet, int mod)
{
vec3_t forward, right, up;
vec3_t v;
vec3_t point;
trace_t tr;

vectoangles2 (aim, v); //
AngleVectors (v, forward, right, up); //
VectorNormalize (forward); //
VectorMA( start, reach, forward, point); // Aiming stuff

//see if the hit connects
tr = gi.trace(start, NULL, NULL, point, self, MASK_SHOT);
if(tr.fraction == 1.0)
{
if(!quiet) //not needed, it's better to follow my later steps
//gi.sound (self, CHAN_WEAPON, gi.soundindex ("weapons/swish.wav"), 1, ATTN_NORM, 0);
return;
}

if(tr.ent->takedamage == DAMAGE_YES || tr.ent->takedamage == DAMAGE_AIM) // Make sure they took damage
{
// pull the player forward if you do damage
VectorMA(self->velocity, 75, forward, self->velocity); // Pull forward
VectorMA(self->velocity, 75, up, self->velocity); // Pull up a tad bit. You can't slide;)

// do the damage
// FIXME - make the damage appear at right spot and direction
T_Damage (tr.ent, self, self, vec3_origin, tr.ent->s.origin, vec3_origin, damage, kick/2, 
DAMAGE_ENERGY, mod); // Time to Slice my friends
gi.sound(self, CHAN_WEAPON, gi.soundindex("weapons/phitw1.wav"), 1, ATTN_IDLE, 0); // Used for my Punch. 
//Rename and use for whatever

if(!quiet)
gi.sound (self, CHAN_WEAPON, gi.soundindex ("weapons/meatht.wav"), 1, ATTN_NORM, 0); // Don't change this. 
//This is only used if your weapon is not quiet.. Chainfist isn't quiet, knife is
}
else
{
if(!quiet)
gi.sound (self, CHAN_WEAPON, gi.soundindex ("weapons/tink1.wav"), 1, ATTN_NORM, 0); //same as above

VectorScale (tr.plane.normal, 256, point);
gi.WriteByte (svc_temp_entity);
gi.WriteByte (TE_SPARKS); //make sparks, not gunshot..
gi.WritePosition (tr.endpos);
gi.WriteDir (point);
gi.multicast (tr.endpos, MULTICAST_PVS);
gi.sound (self, CHAN_AUTO, gi.soundindex("weapons/phitw2.wav") , 1, ATTN_NORM, 0); //hit wall sound
}
}

Whew. That's alot of code.

Now, let's go to p_weapon.c, and make sure you've got a model! Put this code to the way bottom, like g_weapon

Code: Select all

/*
=======================
Punching/Melee
=======================
*/

void Null_Fire(edict_t *ent)
{
int i;
vec3_t start;
vec3_t forward, right;
vec3_t angles;
int damage = 5; //change to whatever
int kick = 2; //ditto here
vec3_t offset;

if (ent->client->ps.gunframe == 11) //rename 11 to after you're attack frame
{
ent->client->ps.gunframe++;
return;
}

AngleVectors (ent->client->v_angle, forward, right, NULL);

VectorScale (forward, -2, ent->client->kick_origin);
ent->client->kick_angles[0] = -2;

VectorSet(offset, 0, 8, ent->viewheight-8 );
P_ProjectSource (ent->client, ent->s.origin, offset, forward, right, start); //where does the hit start from?

if (is_quad)
{
damage *= 4;
kick *= 4;
}

// get start / end positions
VectorAdd (ent->client->v_angle, ent->client->kick_angles, angles);
AngleVectors (angles, forward, right, NULL);
VectorSet(offset, 0, 8, ent->viewheight-8 );
P_ProjectSource (ent->client, ent->s.origin, offset, forward, right, start);
fire_punch (ent, start, forward, 45, damage, 200, 1, MOD_PUNCH); // yep, matches the fire_ function 

ent->client->ps.gunframe++; //NEEDED
PlayerNoise(ent, start, PNOISE_WEAPON); //NEEDED

// if (! ( (int)dmflags->value & DF_INFINITE_AMMO ) )
// ent->client->pers.inventory[ent->client->ammo_index]--; // comment these out to prevent the Minus NULL Ammo bug
}

void Weapon_Null (edict_t *ent)
{
static int pause_frames[] = {10, 21, 0};
static int fire_frames[] = {6, 0}; // Frame stuff here

Weapon_Generic (ent, 3, 9, 22, 24, pause_frames, fire_frames, Null_Fire);
}

Ok, now, let's head to g_items.c, near the beginning.

You'll see

Code: Select all

void Weapon_Blaster (edict_t *ent);
void Weapon_Shotgun (edict_t *ent);
void Weapon_SuperShotgun (edict_t *ent);
void Weapon_Machinegun (edict_t *ent);
void Weapon_Chaingun (edict_t *ent);
void Weapon_HyperBlaster (edict_t *ent);
void Weapon_RocketLauncher (edict_t *ent);
void Weapon_Grenade (edict_t *ent);
void Weapon_GrenadeLauncher (edict_t *ent);
void Weapon_Railgun (edict_t *ent);
void Weapon_BFG (edict_t *ent);
under that, add

Code: Select all

void Weapon_Null (edict_t *ent);
That was easy! now, go lower, and find:

Code: Select all

/* weapon_blaster (.3 .3 1) (-16 -16 -16) (16 16 16)
always owned, never in the world
*/
{
"weapon_blaster", 
NULL,
Use_Weapon,
NULL,
Weapon_Blaster,
"misc/w_pkup.wav",
NULL, 0,
"models/weapons/v_blast/tris.md2",
/* icon */ "w_blaster",
/* pickup */ "Blaster",
0,
0,
NULL,
IT_WEAPON|IT_STAY_COOP,
WEAP_BLASTER,
NULL,
0,
/* precache */ "weapons/blastf1a.wav misc/lasfly.wav"
},
above that, add this:

Code: Select all

{
"weapon_null", // The map entity name. dont include this in a map whatever you do.
NULL, // The pickup function
Use_Weapon, // How to use
NULL, // the drop function
Weapon_Null, //What the use function is
"misc/w_pkup.wav",
"models/nullweapon.md2",0,
"models/nullweapon.md2", //The models stuff.(This is my Hands model)
"w_blaster", //Icon to be used. you could create another, you probably should
"Hands", //Pickup name. use this to give the item to someone at the start of the game
0,
0,
NULL,
IT_WEAPON|IT_STAY_COOP,
WEAP_BLASTER, // the model index, just an integer defined in g_local.h
NULL,
0,
""
},

Ok, now that that's done, let's head on over to g_local.c Find:

Code: Select all

#define MOD_EXIT 28
#define MOD_SPLASH 29
#define MOD_TARGET_LASER 30
#define MOD_TRIGGER_HURT 31
#define MOD_HIT 32
#define MOD_TARGET_BLASTER 33
#define MOD_FRIENDLY_FIRE 0x8000000
below them, add

Code: Select all

#define MOD_PUNCH 34

Now, go to p_client.c, and find

Code: Select all

case MOD_TELEFRAG:
message = "tried to invade";
message2 = "'s personal space";
break;
under it, add this:

Code: Select all

case MOD_PUNCH:
message = "took";
message2 = "'s fist in the face";
break;

Now that we have the means of death, let's replace the blaster with it! Find:

Code: Select all

PrecacheItem (FindItem ("Blaster"));

replace with

Code: Select all

PrecacheItem (FindItem ("Hands"));

Find

Code: Select all

if (weapon && !oldcount)
{
if (other->client->pers.weapon != ent->item && ( !deathmatch->value || other->client->pers.weapon == FindItem("Blaster") ) )
other->client->newweapon = ent->item;
}

Replace with

Code: Select all

if (weapon && !oldcount)
{
if (other->client->pers.weapon != ent->item && ( !deathmatch->value || other->client->pers.weapon == FindItem("Hands") ) )
other->client->newweapon = ent->item;
}

Find

Code: Select all

item = self->client->pers.weapon;
if (! self->client->pers.inventory[self->client->ammo_index] )
item = NULL;
if (item && (strcmp (item->pickup_name, "Blaster") == 0))
item = NULL;

Replace again with

Code: Select all

item = self->client->pers.weapon;
if (! self->client->pers.inventory[self->client->ammo_index] )
item = NULL;
if (item && (strcmp (item->pickup_name, "Hands") == 0))
item = NULL;

Find

Code: Select all

if ( ent->client->pers.inventory[ITEM_INDEX(FindItem("shells"))]
&& ent->client->pers.inventory[ITEM_INDEX(FindItem("shotgun"))] )
{
ent->client->newweapon = FindItem ("shotgun");
return;
}
ent->client->newweapon = FindItem ("Blaster");
}

Replace with

Code: Select all

if ( ent->client->pers.inventory[ITEM_INDEX(FindItem("shells"))]
&& ent->client->pers.inventory[ITEM_INDEX(FindItem("shotgun"))] )
{
ent->client->newweapon = FindItem ("shotgun");
return;
}
ent->client->newweapon = FindItem ("Hands");
}

Find

Code: Select all

item = FindItem("Blaster");
client->pers.selected_item = ITEM_INDEX(item);
client->pers.inventory[client->pers.selected_item] = 1;

Replace with

Code: Select all

item = FindItem("Hands");
client->pers.selected_item = ITEM_INDEX(item);
client->pers.inventory[client->pers.selected_item] = 1;

There you go! Now go punch some Strogg, and go punch and humiliate your foes.

* I may have a been a bit bored.
QuakeWiki
getButterfly - WordPress Support Services
Roo Holidays

Fear not the dark, but what the dark hides.
franqutrass
Posts: 69
Joined: Wed Dec 30, 2009 6:29 pm
Location: peru
Contact:

Re: MODDB tutorial

Post by franqutrass »

Ohh, you're a god thanks
hello
Post Reply