MMORPG Tutorial article 3 part 2 of 2 Gone Fishin!
by Dreamer · 04/13/2005 (3:38 pm) · 55 comments
In Dream, I decided to make a tradeskill system that is entirely item dependant, to do that I first had to implement weapons which were of a melee type.
If you haven't already done so please start with this tutorial
www.garagegames.com/index.php?sec=mg&mod=resource&page=view&qid=7514
I didn't like the current Server Side Melee tutorial, since I wanted Melee to be roll based and not dependant upon bounding box collisions and how fast you can click you mouse.
However we do need melee animations so go to the Server Side Melee tutorial and get the animations and orc model...
www.garagegames.com/index.php?sec=mg&mod=resource&page=view&qid=5377
Go on I'll wait.
Ok after getting the animations and model and placing them where they belong we have to modify the server/scripts/weapons.cs for now just replace it with this.
Now create a file named Sword.cs in the same directory and use this code.
Now if you add a sword to your player you will notice he has a Melee animation, (by the way you are remembering to exec all of these scripts right?)
Anyways we want a roll based Melee system, but I before we implement that we need to remember our fish!
So create a nice looking fishingpole in blender or just use the sword model and add these files to your server/scripts directory
FishItem.cs
Next we need to add our fishinpole.cs file
While we are developing fishsuccess will always be true.
Now to fish all we have to do is grab up a pole and some bait (looks like ammo) then head to the water, target a fish (making sure he is in the targetingGUI), leave target mode and fire anywhere at the water.
You will recieve a fish in your inventory!
Next tutorial will go over finishing up the with the roll based Melee implementation.
If you haven't already done so please start with this tutorial
www.garagegames.com/index.php?sec=mg&mod=resource&page=view&qid=7514
I didn't like the current Server Side Melee tutorial, since I wanted Melee to be roll based and not dependant upon bounding box collisions and how fast you can click you mouse.
However we do need melee animations so go to the Server Side Melee tutorial and get the animations and orc model...
www.garagegames.com/index.php?sec=mg&mod=resource&page=view&qid=5377
Go on I'll wait.
Ok after getting the animations and model and placing them where they belong we have to modify the server/scripts/weapons.cs for now just replace it with this.
//-----------------------------------------------------------------------------
// Torque Game Engine
//
// Copyright (c) 2001 GarageGames.Com
//-----------------------------------------------------------------------------
// This file contains Weapon and Ammo Class/"namespace" helper methods
// as well as hooks into the inventory system. These functions are not
// attached to a specific C++ class or datablock, but define a set of
// methods which are part of dynamic namespaces "class". The Items
// include these namespaces into their scope using the ItemData and
// ItemImageData "className" variable.
// All ShapeBase images are mounted into one of 8 slots on a shape.
// This weapon system assumes all primary weapons are mounted into
// this specified slot:
$WeaponSlot = 0;
//----------------------------d-------------------------------------------------
// Audio profiles
datablock AudioProfile(WeaponUseSound)
{
filename = "~/data/sound/weapon_switch.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(WeaponPickupSound)
{
filename = "~/data/sound/weapon_pickup.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(AmmoPickupSound)
{
filename = "~/data/sound/ammo_pickup.wav";
description = AudioClose3d;
preload = true;
};
//-----------------------------------------------------------------------------
// Weapon Class
//-----------------------------------------------------------------------------
function Weapon::onUse(%data,%obj)
{
// Default behavoir for all weapons is to mount it into the
// this object's weapon slot, which is currently assumed
// to be slot 0
if (%obj.getMountedImage($WeaponSlot) != %data.image.getId()) {
ServerPlay3D(WeaponUseSound,%obj.getTransform());
%obj.mountImage(%data.image, $WeaponSlot);
//if (%data.itemType $= "melee")
//commandToClient(%obj.client, 'force3rdPerson', 1);
//else
//commandToClient(%obj.client, 'force3rdPerson', 0);
}
}
function Weapon::onPickup(%this, %obj, %shape, %amount)
{
// The parent Item method performs the actual pickup.
// For player's we automatically use the weapon if the
// player does not already have one in hand.
if (Parent::onPickup(%this, %obj, %shape, %amount)) {
ServerPlay3D(WeaponPickupSound,%obj.getTransform());
if (%shape.getClassName() $= "Player" &&
%shape.getMountedImage($WeaponSlot) == 0) {
%shape.use(%this);
}
}
}
function Weapon::onInventory(%this,%obj,%amount)
{
// Weapon inventory has changed, make sure there are no weapons
// of this type mounted if there are none left in inventory.
if (!%amount && (%slot = %obj.getMountSlot(%this.image)) != -1)
%obj.unmountImage(%slot);
}
//-----------------------------------------------------------------------------
// Weapon Image Class
//-----------------------------------------------------------------------------
// phdana hth ->
// a 'hand to hand attack' is a sequence that gets played
// as a "play once look anim". Hand to Hand weapons, such
// as an axe, can have one or more 'hand to hand attacks'
// that they can play
datablock GameBaseData(OneHandedAttackSwing)
{
seqName = "h1swing";
timeScale = 1.5;
damageAmount = 30;
//startDamage = 0.2;
//endDamage = 0.6;
startDamage = 0.2;
endDamage = 1.3;
};
datablock GameBaseData(OneHandedAttackSlice)
{
seqName = "h1slice";
timeScale = 1.0;
damageAmount = 30;
//startDamage = 0.3;
//endDamage = 0.7;
startDamage = 0.1;
endDamage = 0.9;
};
datablock GameBaseData(OneHandedAttackThrust)
{
seqName = "h1thrust";
timeScale = 1.0;
damageAmount = 30;
//startDamage = 0.4;
//endDamage = 0.8;
startDamage = 0.1;
endDamage = 0.9;
};
//datablock GameBaseData(OneHandedJumpAttack)
//{
//seqName = "h1jumpattack";
//timeScale = 1.0;
//damageAmount = 30;
//startDamage = 0.4;
//endDamage = 0.8;
//startDamage = 0.1;
//endDamage = 0.9;
//};
// this is the default function to call when firing a hand-to-hand weapon
function WeaponImage::onFireHandToHand(%this, %obj, %slot)
{
%actnum = getRandom(1,3);
if(%actnum ==1){
%action = "h1swing";
}
if(%actnum ==2){
%action = "h1slice";
}
if(%actnum == 3){
%action = "h1thrust";
}
if(%actnum < 1 || %actnum >3){
%action = "h1swing";
}
%obj.setActionThread(%action);
// %obj.setArmThread("look");
}
// phdana stun ->
// call when %victim is hit with %attack but does not die
function stunPlayer(%vplayer, %attack)
{
// for now we stun every time...
// get the player for this object
//if (!%victim.client || !%victim.client.player)
if(!%vplayer.getType() & $TypeMasks::PlayerObjectType)
{
error("ATTEMPTING to STUN a non-player");
return;
}
// if this player is in the middle of a hth swing themself, then
// their swing is aborted. firstly we have to make sure they dont
// do any damage, secondly we must blend their swing anim into
// the stun anim
if (%vplayer.hthDamageSeqPlaying)
{
// make sure they wont do damage....
%vplayer.hthDamageSeqPlaying = false;
// blend into the stun animation
//error("STUN: victim: " @ %vplayer @ " DOING transition once...");
%vplayer.setArmThreadTransitionOnce("h1stun");
}
else
{
// just start the stun animation
//error("STUN: victim: " @ %vplayer @ " only doing a playonce...");
if(%vplayer.shielded)// not while stuned!
%vplayer.setImageTrigger(1,false);
%vplayer.setArmThreadPlayOnce("h1stun");
}
// the victim is now in a stun state
//%vplayer.hthStunSequencePlaying = true;
%vplayer.hthStun = true;
schedule(1000, %vplayer, "resetStun", %vplayer);
//%vplayer.hthStunStartMS = $sim::Time;
}
function resetStun(%obj)
{
%obj.hthStun = false;
}
function pushPlayerBack(%victim, %pos, %attacker, %attack)
{
// the push back is relative to the attacker
// a straight push back would be along the attackers
// Y axis....
// right now we always push the victim at his center
// we could explore what happnes if we push at the
// point of contact instead (might turn or do something intersting)
// get the usual direction to push...we could get the Y axis of
// the attacker with getTransform() then grabbing the rotation part
// and passing that to VectorOrthoBasis() and then using column 1
// whichi would be words 3,4,5 (couting from 0)...but that's overkill
// for something that can be approximated pretty good by a line drawn
// from attacker to victim...so let's use that instead
%vpos = %victim.getWorldBoxCenter();
%pushDirection = VectorSub(%vpos,%attacker.getWorldBoxCenter());
%pushDirection = VectorNormalize(%pushDirection);
// hardoded impluse
%impulse = 15.0;
// ok apply impulse to victim's center
%mass = %victim.getDataBlock().mass;
%pushVec = VectorScale(%pushDirection,%impulse * %mass);
//error("Applying, to player " @ %victim @ " of mass " @ %mass @ ", an impulseVec: " @ %pushVec);
%victim.applyImpulse(%vpos, %pushVec);
}
// <- phdana hth
function WeaponImage::onMount(%this,%obj,%slot)
{
// Images assume a false ammo state on load. We need to
// set the state according to the current inventory.
if (%obj.getInventory(%this.ammo))
%obj.setImageAmmo(%slot,true);
%obj.setArmThread("look");
}
//-----------------------------------------------------------------------------
// Ammmo Class
//-----------------------------------------------------------------------------
function Ammo::onPickup(%this, %obj, %shape, %amount)
{
// The parent Item method performs the actual pickup.
if (Parent::onPickup(%this, %obj, %shape, %amount)) {
ServerPlay3D(AmmoPickupSound,%obj.getTransform());
}
}
function Ammo::onInventory(%this,%obj,%amount)
{
// The ammo inventory state has changed, we need to update any
// mounted images using this ammo to reflect the new state.
for (%i = 0; %i < 8; %i++) {
if ((%image = %obj.getMountedImage(%i)) > 0)
if (isObject(%image.ammo) && %image.ammo.getId() == %this.getId())
%obj.setImageAmmo(%i,%amount != 0);
}
}Now create a file named Sword.cs in the same directory and use this code.
//--------------------------------------------------------------------------
// Weapon Item. This is the item that exists in the world, i.e. when it's
// been dropped, thrown or is acting as re-spawnable item. When the weapon
// is mounted onto a shape, the CrossbowImage is used.
datablock ItemData(Sword)
{
// Mission editor category
category = "Weapon";
// Hook into Item Weapon class hierarchy. The weapon namespace
// provides common weapon handling functions in addition to hooks
// into the inventory system.
className = "Weapon";
// Basic Item properties
shapeFile = "~/data/shapes/sword/rune_blade01.dts";
mass = 1;
elasticity = 0.2;
friction = 0.6;
emap = true;
// Dynamic properties defined by the scripts
pickUpName = "a sword";
image = SwordImage;
itemType="melee";
trayIcon = "sword01.png";
};
//--------------------------------------------------------------------------
// Crossbow image which does all the work. Images do not normally exist in
// the world, they can only be mounted on ShapeBase objects.
// phdana hth ->
datablock ShapeBaseImageData(SwordImage)
{
// Basic Item properties
shapeFile = "~/data/shapes/fishpole/fishpole.dts";
emap = true;
// Specify mount point & offset for 3rd person, and eye offset
// for first person rendering.
mountPoint = 0;
eyeOffset = "11 11 1";
// When firing from a point offset from the eye, muzzle correction
// will adjust the muzzle vector to point to the eye LOS point.
// Since this weapon doesn't actually fire from the muzzle point,
// we need to turn this off.
correctMuzzleVector = false;
// Add the WeaponImage namespace as a parent, WeaponImage namespace
// provides some hooks into the inventory system.
className = "WeaponImage";
// Projectile && Ammo.
item = Sword;
ammo = CrossbowAmmo;
projectile = CrossbowProjectile;
projectileType = Projectile;
// we are a HAND TO HAND weapon so we have a custom look anim
//customLookAnim = "h1root"; // as a test
customLookAnim = "looknw";
// Here are the Attacks we support
hthNumAttacks = 3;
hthAttack[0] = OneHandedAttackSwing;
hthAttack[1] = OneHandedAttackSlice;
hthAttack[2] = OneHandedAttackThrust;
//jumpAttack = OneHandedJumpAttack;
// Images have a state system which controls how the animations
// are run, which sounds are played, script callbacks, etc. This
// state system is downloaded to the client so that clients can
// predict state changes and animate accordingly. The following
// system supports basic ready->fire->reload transitions as
// well as a no-ammo->dryfire idle state. In this case we are a
// HAND to HAND weapon and there is no ammo but we can use the
// reload time to limit how often the weapon can be fired
// Initial start up state
stateName[0] = "Preactivate";
stateTransitionOnLoaded[0] = "Activate";
// Activating the gun. Called when the weapon is first mounted
stateName[1] = "Activate";
stateTransitionOnTimeout[1] = "Ready";
stateTimeoutValue[1] = 0.6;
//stateSequence[1] = "Activate";
// Ready to fire, just waiting for the trigger
stateName[2] = "Ready";
stateTransitionOnTriggerDown[2] = "Fire";
// Fire the weapon. Calls the fire script which does the actual work.
stateName[3] = "Fire";
stateTransitionOnTimeout[3] = "Reload";
stateTimeoutValue[3] = 0.2;
stateFire[3] = true;
stateAllowImageChange[3] = false;
//stateSequence[3] = "Fire";
stateScript[3] = "onFire";
//stateSound[3] = CrossbowFireSound;
// Play the relead animation, and transition into
stateName[4] = "Reload";
stateTransitionOnTimeout[4] = "Ready";
stateTimeoutValue[4] = 0.8;
stateAllowImageChange[4] = false;
//stateSequence[4] = "Reload";
stateEjectShell[4] = false;
//stateSound[4] = CrossbowReloadSound;
};
//-----------------------------------------------------------------------------
function SwordImage::onFire(%this, %obj, %slot)
{
// default hand to hand weapon code
WeaponImage::onFireHandToHand(%this, %obj, %slot);
return;
}Now if you add a sword to your player you will notice he has a Melee animation, (by the way you are remembering to exec all of these scripts right?)
Anyways we want a roll based Melee system, but I before we implement that we need to remember our fish!
So create a nice looking fishingpole in blender or just use the sword model and add these files to your server/scripts directory
FishItem.cs
datablock ItemData(Fish)
{
// Mission editor category, this datablock will show up in the
// specified category under the "shapes" root category.
category = "Food";
name="Fish";
// Basic Item properties
shapeFile = "~/data/shapes/fish/fish.dts";
mass = 1;
friction = 1;
elasticity = 0.3;
// Dynamic properties defined by the scripts
pickupName = "a yummy fish";
repairAmount = 50;
};
function Fish::onUse(%this,%user)
{
// Apply some health to whoever uses it, the health kit is only
// used if the user is currently damaged.
if (%user.getDamageLevel() != 0) {
%user.decInventory(%this,1);
%user.applyRepair(%this.repairAmount);
if (%user.client)
messageClient(%user.client, 'MsgHealthKitUsed', '\c2You ate a fish');
}
}For now fish and food will just function like Healthkits remember to make sure the model is in the right place, and to exec the file.Next we need to add our fishinpole.cs file
datablock ItemData(Bait)
{
// Mission editor category
category = "Ammo";
// Add the Ammo namespace as a parent. The ammo namespace provides
// common ammo related functions and hooks into the inventory system.
className = "Ammo";
// Basic Item properties
shapeFile = "~/data/shapes/crossbow/ammo.dts";
mass = 1;
elasticity = 0.2;
friction = 0.6;
// Dynamic properties defined by the scripts
pickUpName = "Bait";
maxInventory = 20;
};
datablock ItemData(FishPole)
{
// Mission editor category
category = "Weapon";
// Hook into Item Weapon class hierarchy. The weapon namespace
// provides common weapon handling functions in addition to hooks
// into the inventory system.
className = "Weapon";
// Basic Item properties
shapeFile = "~/data/shapes/FishPole/FishPole.dts";
mass = 1;
elasticity = 0.2;
friction = 0.6;
emap = true;
// Dynamic properties defined by the scripts
pickUpName = "a Fishing Pole";
image = FishPoleImage;
};
//--------------------------------------------------------------------------
// Crossbow image which does all the work. Images do not normally exist in
// the world, they can only be mounted on ShapeBase objects.
datablock ShapeBaseImageData(FishPoleImage)
{
// Basic Item properties
shapeFile = "~/data/shapes/FishPole/FishPole.dts";
emap = true;
// Specify mount point & offset for 3rd person, and eye offset
// for first person rendering.
mountPoint = 0;
eyeOffset = ".5 .5 -3";
// When firing from a point offset from the eye, muzzle correction
// will adjust the muzzle vector to point to the eye LOS point.
// Since this weapon doesn't actually fire from the muzzle point,
// we need to turn this off.
correctMuzzleVector = false;
// Add the WeaponImage namespace as a parent, WeaponImage namespace
// provides some hooks into the inventory system.
className = "WeaponImage";
// Projectile && Ammo.
item = FishPole;
ammo = Bait;
projectile = CrossbowProjectile;
projectileType = Projectile;
// Images have a state system which controls how the animations
// are run, which sounds are played, script callbacks, etc. This
// state system is downloaded to the client so that clients can
// predict state changes and animate accordingly. The following
// system supports basic ready->fire->reload transitions as
// well as a no-ammo->dryfire idle state.
// Initial start up state
stateName[0] = "Preactivate";
stateTransitionOnLoaded[0] = "Activate";
stateTransitionOnNoAmmo[0] = "NoAmmo";
// Activating the gun. Called when the weapon is first
// mounted and there is ammo.
stateName[1] = "Activate";
stateTransitionOnTimeout[1] = "Ready";
stateTimeoutValue[1] = 0.6;
stateSequence[1] = "Activate";
// Ready to fire, just waiting for the trigger
stateName[2] = "Ready";
stateTransitionOnNoAmmo[2] = "NoAmmo";
stateTransitionOnTriggerDown[2] = "Fire";
// Fire the weapon. Calls the fire script which does
// the actual work.
stateName[3] = "Fire";
stateTransitionOnTimeout[3] = "Reload";
stateTimeoutValue[3] = 0.2;
stateFire[3] = true;
stateRecoil[3] = LightRecoil;
stateAllowImageChange[3] = false;
stateSequence[3] = "Fire";
stateScript[3] = "onFire";
stateSound[3] = CrossbowFireSound;
// Play the relead animation, and transition into
stateName[4] = "Reload";
stateTransitionOnNoAmmo[4] = "NoAmmo";
stateTransitionOnTimeout[4] = "Ready";
stateTimeoutValue[4] = 0.8;
stateAllowImageChange[4] = false;
stateSequence[4] = "Reload";
stateEjectShell[4] = true;
stateSound[4] = CrossbowReloadSound;
// No ammo in the weapon, just idle until something
// shows up. Play the dry fire sound if the trigger is
// pulled.
stateName[5] = "NoAmmo";
stateTransitionOnAmmo[5] = "Reload";
stateSequence[5] = "NoAmmo";
stateTransitionOnTriggerDown[5] = "DryFire";
// No ammo dry fire
stateName[6] = "DryFire";
stateTimeoutValue[6] = 1.0;
stateTransitionOnTimeout[6] = "NoAmmo";
stateSound[6] = CrossbowFireEmptySound;
};
//-----------------------------------------------------------------------------
function FishPoleImage::onFire(%this, %obj, %slot)
{
WeaponImage::onFireHandToHand(%this, %obj, %slot);
echo(%obj.client.player@" is fishing");
if(FindObject(%obj.client,$TypeMasks::WaterObjectType,50,1)){
FishRoll(%obj);
%projectile = %this.projectile;
// Decrement inventory ammo. The image's ammo state is update
// automatically by the ammo inventory hooks.
//%obj.decInventory(%this.ammo,1);
// Determine initial projectile velocity based on the
// gun's muzzle point and the object's current velocity
%muzzleVector = %obj.getMuzzleVector(%slot);
%objectVelocity = %obj.getVelocity();
%muzzleVelocity = VectorAdd(
VectorScale(%muzzleVector, %projectile.muzzleVelocity),
VectorScale(%objectVelocity, %projectile.velInheritFactor));
// Create the projectile object
%p = new (%this.projectileType)() {
dataBlock = %projectile;
initialVelocity = %muzzleVelocity;
initialPosition = %obj.getMuzzlePoint(%slot);
sourceObject = %obj;
sourceSlot = %slot;
client = %obj.client;
};
MissionCleanup.add(%p);
return %p;
}else{
MessageToClient(%obj.client,'TradeSkill','You need to be closer to water to fish');
}
}
function FishRoll(%obj){
%client = %obj.client;
echo("Fishroll and client ="@%client);
%ChanceToFish = getRandom(1,20) + %client.Skills[Fishing];
if(%ChanceToFish >= 15){
FishSuccess(%obj);
}else{
FishSuccess(%obj);
//FishFailure(%client);
}
}
function FishSuccess(%playerobject){
echo("Fishsuccess! "@%playerobject);
%client = %playerobject.client;
%obj = %client.getSelectedObject();
//%obj.dump();
MessageClient(%playerobject.client,"Success!","You have successfully fished "@%obj.getShapeName());
echo("Success! You have successfully fished "@%obj.getShapeName());
%client.Skills[Fishing]++;
//schedule(1000,0,"%playerObject.incInventory","%newFish",1);
%playerobject.incInventory(%obj.getShapeName(),1);
%client.ClearSelectedObject();
CommandToClient(%playerobject.client,'UpdateTargetDialog','ClearTarget');
%obj.delete();
}
function FishFailure(%client){
MessageClient(%client,"Failure!","You spilled your beer!");
}While we are developing fishsuccess will always be true.
Now to fish all we have to do is grab up a pole and some bait (looks like ammo) then head to the water, target a fish (making sure he is in the targetingGUI), leave target mode and fire anywhere at the water.
You will recieve a fish in your inventory!
Next tutorial will go over finishing up the with the roll based Melee implementation.
About the author
#2
04/13/2005 (4:30 pm)
The spilling of the beer sounds vaguely familiar. *grin*
#3
04/13/2005 (4:38 pm)
I wanna see a pic of this =)
#4
04/13/2005 (5:24 pm)
LOL, too funny. Like Anthony said, I have to see a pic of this!
#5
Could you attach your DTS model to the resource!
I follow your tutorial to this one, 'cause i have no appropriate model, i can't see the effects!
04/14/2005 (10:35 am)
Dreamer:Could you attach your DTS model to the resource!
I follow your tutorial to this one, 'cause i have no appropriate model, i can't see the effects!
#6
Another thing you could do is just change the fish resource to use the player.dts in data/shapes/player instead of the fish model I have it pointed at.
Then you wind up with an Orc behaving much like a fish.
*Update*
Ahh what the heck, here ya go!
www.hallofworlds.com/communitystuff/Dreamer.zip
04/14/2005 (2:14 pm)
To say my modeling skills are subpar would be a compliment, however if you just go to http://www.TurboSquid.com/ and look for a fish model you like (there are a couple of free ones), then convert to .DTS you will get pretty good results.Another thing you could do is just change the fish resource to use the player.dts in data/shapes/player instead of the fish model I have it pointed at.
Then you wind up with an Orc behaving much like a fish.
*Update*
Ahh what the heck, here ya go!
www.hallofworlds.com/communitystuff/Dreamer.zip
#7
Compiling starter.fps/server/scripts/fishinpole.cs...
starter.fps/server/scripts/fishinpole.cs Line: 194 - Syntax error.
>>> Advanced script error report. Line 387.
>>> Some error context, with ## on sides of error halt:
MessageClient(%playerobject.client,"Success!","You have successfully fished "@% ##o##bj.getShapeName());
echo("Success! You have successfully fished "@%obj.getShapeName());
>>> Error report complete.
thanks
04/22/2005 (3:40 pm)
hello :) , i get this error :(Compiling starter.fps/server/scripts/fishinpole.cs...
starter.fps/server/scripts/fishinpole.cs Line: 194 - Syntax error.
>>> Advanced script error report. Line 387.
>>> Some error context, with ## on sides of error halt:
MessageClient(%playerobject.client,"Success!","You have successfully fished "@% ##o##bj.getShapeName());
echo("Success! You have successfully fished "@%obj.getShapeName());
>>> Error report complete.
thanks
#8
Look really carefully at the line in question in a text editor or something, then delete the extra line break.
Might wanna do the exact same thing on EVERY script here, since that type of thing appears to happen quite frequently :)
04/22/2005 (4:41 pm)
I see you didn't go through the code and look for incorrect line breaks due to the formatting of the wordwrap on this website.Look really carefully at the line in question in a text editor or something, then delete the extra line break.
Might wanna do the exact same thing on EVERY script here, since that type of thing appears to happen quite frequently :)
#9
04/22/2005 (5:22 pm)
I know what your saying about the line breaks but i just dont see where that line would have a break in it. none of the echose are working, not even the ones before that line of code.
#10
That line break should not be there. That needs to all be on one line.
Hope that helps, there is more than one of these I've counted about 15 across all of my tutorials, and this is just something that needs to be watched out for, not only in my tutorials, but in pretty much any of the others as well.
04/22/2005 (6:05 pm)
Look at the code posted here... You will see a line break in the file fishpole.cs in the fishsuccess function right hereMessageClient(%playerobject.client,"Success!","You have successfully fished "@% obj.getShapeName());
That line break should not be there. That needs to all be on one line.
Hope that helps, there is more than one of these I've counted about 15 across all of my tutorials, and this is just something that needs to be watched out for, not only in my tutorials, but in pretty much any of the others as well.
#11
04/22/2005 (6:22 pm)
lol, i have been fixing those but what i didint notice is that it has a space between @% and obj.getshapename lol , ill see what that does, maby it thinks its a line breatk. idk lol
#12
04/28/2005 (2:17 am)
Where do I find the other server side melee tut for the animations???
#13
and Thanks your post of the fisk Model!
04/28/2005 (2:54 am)
I fix my problem, in my Torque Demo, the "AIManager::spawn" path name is wrong, so the model can't fallow the path!and Thanks your post of the fisk Model!
#14
@Mario, you should follow the link at the top of the resource.
@Everyone if you find this helpful, please feel free to rate it,and the rest of them as a 5 or better :) *Shameless self promotion*
04/28/2005 (2:20 pm)
@Ahulo ,your very welcome@Mario, you should follow the link at the top of the resource.
@Everyone if you find this helpful, please feel free to rate it,and the rest of them as a 5 or better :) *Shameless self promotion*
#15
05/04/2005 (6:35 pm)
question as i am downloding the sword file ( 30 mins remaining) on a cable connection must be slow server. do we need to do his tutorial or we just going there for just the zip?
#16
05/04/2005 (6:46 pm)
Just get the zip, leave the rest of the Server Side Melee tutorial alone, because we are only using his objects for this... I also have a sword model that I should post if all you are lacking is the Sword itself.
#17
05/04/2005 (6:48 pm)
missing the sword and animations and orc model as it seems his zip is fubar keeps dieing after bout 40% download
#18
05/04/2005 (7:06 pm)
Dang, thats a pretty vital part, lemme tarball what I have and try to post it.
#19
05/04/2005 (7:18 pm)
pls if you can tar it up then this tut is only depenedant on the info here and not slow downloads from the other. just include any info on where things and such for the items in the zip
#20
05/04/2005 (7:20 pm)
How big of attachments can you handle? File size is 3.2 MB
Torque Owner Dreamer
www.garagegames.com/index.php?sec=mg&mod=resource&page=view&qid=7583