HelpCreateProjectile on the fly

Posts 1–8 of 8 · Page 1 of 1
CreateProjectile on the fly
Is it possible to create a projectile by passing in the relevant information?

I am trying to get the 'PetShoot.cs' to work and I have completely fixed it, the only thing that remains is replacing the 'AreaBlasts' with an actual projectile similar to prod.

It definitely has something to do with the function 'CreateProjectile'

Code:
ProjectileDesc desc = new ProjectileDesc(XElement elem);
I have tried the follow,
Code:
                    XElement prj_xml = new XElement("Projectile", new XElement("ObjectId", "Green Blob"), new XElement("Damage", 0), new XElement("Speed", 55), new XElement("LifetimeMS", 1900));

                    //<Projectile>
                    //<ObjectId>Green Blob</ObjectId>
                    //<Damage>0</Damage>
                    //<Speed>55</Speed>
                    //<LifetimeMS>1900</LifetimeMS>
                    //</Projectile>


                    ProjectileDesc desc = new ProjectileDesc(prj_xml);

                    double startAngle = Math.Atan2(host.Y - en.Y, host.X - en.X);

                    Position prjPos = new Position { X = host.X, Y = host.Y };

                    Projectile prj = host.CreateProjectile(
                        desc, host.ObjectType, Power, time.tickTimes,
                        prjPos, (float)startAngle);

                    host.Owner.EnterWorld(prj);

                    byte prjId = prj.ProjectileId;
                    

                    host.Owner.BroadcastPacket(new ShootPacket
                    {
                        BulletId = prjId,
                        OwnerId = host.Id,
                        Position = prjPos,
                        Angle = (float)startAngle,
                        Damage = (short)Power,
                        BulletType = (byte)desc.BulletType,
                        AngleInc = 0,
                        NumShots = 1,
                    }, null);
Anyone know where the problem is?
There is an object that has all the projectiles, you don't send Shoot packets, you send PlayerShoot packets. Search for the object in the same file where all the pet-related data is located
Quote Originally Posted by sgrawsreghawrhgwrhgr View Post
There is an object that has all the projectiles, you don't send Shoot packets, you send PlayerShoot packets. Search for the object in the same file where all the pet-related data is located
What is "ContainerType" for the 'PlayerShootPacket'?

- - - Updated - - -

'PlayerShootPacket' isn't used anywhere within the server so I don't have any examples to go off

- - - Updated - - -

Which object has all the projectles?
Similar to this you mean?
Code:
Dictionary<string, ushort> icdatas = new Dictionary<string, ushort>(player.Manager.GameData.IdToObjectType,
                StringComparer.OrdinalIgnoreCase);
- - - Updated - - -

Code:
Dictionary<string, ushort> icdatas = new Dictionary<string, ushort>(player.Manager.GameData.IdToObjectType,
                        StringComparer.OrdinalIgnoreCase);
                    icdatas.TryGetValue("Green Blob", out objType)
- - - Updated - - -

Idk, haven't made any progress...
XML objects (you must have them already):
Code:
 <Object id="CloseRangeAttack" type="0x8300">
      <PetProjectile/>
      <Projectile>
         <ObjectId>Pet Bullet 3</ObjectId>
         <MinDamage>7</MinDamage>
         <MaxDamage>200</MaxDamage>
         <Speed>100</Speed>
         <LifetimeMS>400</LifetimeMS>
         <Size>80</Size>
      </Projectile>
   </Object>
   <Object id="MidRangeAttack" type="0x8301">
      <PetProjectile/>
      <Projectile>
         <ObjectId>Pet Bullet 3</ObjectId>
         <MinDamage>5</MinDamage>
         <MaxDamage>150</MaxDamage>
         <Speed>100</Speed>
         <LifetimeMS>650</LifetimeMS>
         <Size>80</Size>
      </Projectile>
   </Object>
   <Object id="FarRangeAttack" type="0x8302">
      <PetProjectile/>
      <Projectile>
         <ObjectId>Pet Bullet 3</ObjectId>
         <MinDamage>3</MinDamage>
         <MaxDamage>100</MaxDamage>
         <Speed>100</Speed>
         <LifetimeMS>900</LifetimeMS>
         <Size>80</Size>
      </Projectile>
   </Object>
   <Object id="Heal" type="0x164">
      <PetBehavior/>
      <Class>PetBehavior</Class>
      <BaseBehavior id="PetHeal"/>
      <Parameters>
         <MaxHeal min="10" max="90" curve="exp_incr"/>
         <Cooldown min="10" max="1" curve="dim_returns"/>
      </Parameters>
   </Object>
   <Object id="MagicHeal" type="0x170">
      <PetBehavior/>
      <Class>PetBehavior</Class>
      <BaseBehavior id="PetMagicHeal"/>
      <Parameters>
         <MaxHeal min="1" max="45" curve="exp_incr"/>
         <Cooldown min="10" max="1" curve="dim_returns"/>
      </Parameters>
   </Object>
   <Object id="AttackClose" type="0x17f">
      <PetBehavior/>
      <Class>PetBehavior</Class>
      <BaseBehavior id="PetShoot"/>
      <Parameters>
         <ProjectileId value="CloseRangeAttack"/>
         <DamageCurve value="exp_incr"/>
         <ThreatRange value="4.5"/>
         <Delay min="5" max=".2" curve="exp_decr"/>
         <AimType value="Targeted"/>
      </Parameters>
   </Object>
   <Object id="AttackMid" type="0x180">
      <PetBehavior/>
      <Class>PetBehavior</Class>
      <BaseBehavior id="PetShoot"/>
      <Parameters>
         <ProjectileId value="MidRangeAttack"/>
         <DamageCurve value="exp_incr"/>
         <ThreatRange value="6.75"/>
         <Delay min="5" max=".2" curve="exp_decr"/>
         <AimType value="Targeted"/>
      </Parameters>
   </Object>
   <Object id="AttackFar" type="0x181">
      <PetBehavior/>
      <Class>PetBehavior</Class>
      <BaseBehavior id="PetShoot"/>
      <Parameters>
         <ProjectileId value="FarRangeAttack"/>
         <DamageCurve value="exp_incr"/>
         <ThreatRange value="9"/>
         <Delay min="5" max=".2" curve="exp_decr"/>
         <AimType value="Targeted"/>
      </Parameters>
   </Object>
   <Object id="ElectricZap" type="0x182">
      <PetBehavior/>
      <Class>PetBehavior</Class>
      <BaseBehavior id="PetZap"/>
      <Parameters>
         <Color value="0xffffff"/>
         <Damage min="5" max="300" curve="exp_incr"/>
         <DamageRange min="5" max="50" curve="linear"/>
         <Delay min="1" max="0" curve="dim_returns"/>
         <ThreatRange min="0.35" max="2" curve="linear"/>
         <Effect>
            <Type value="Paralyzed"/>
            <Probability min="0" max=".2" curve="linear"/>
            <Duration min=".4" max="4" curve="dim_returns"/>
         </Effect>
      </Parameters>
   </Object>
   <Object id="PetSavage" type="0x183">
      <PetBehavior/>
      <Class>PetBehavior</Class>
      <BaseBehavior id="PetSavage"/>
      <Parameters>
         <Tiles min="2.5" max="8" curve="dim_returns"/>
         <Frequency min="8" max=".8" curve="exp_incr"/>
      </Parameters>
   </Object>
   <Object id="PetDecoy" type="0x184">
      <PetBehavior/>
      <Class>PetBehavior</Class>
      <BaseBehavior id="PetDecoy"/>
      <Parameters>
         <Radius min="3" max="12" curve="dim_returns"/>
         <Duration min="3" max="8" curve="exp_incr"/>
         <Cooldown min="10" max="3" curve="exp_decr"/>
      </Parameters>
   </Object>
   <Object id="PetRisingFury" type="0x185">
      <PetBehavior/>
      <Class>PetBehavior</Class>
      <BaseBehavior id="PetRisingFury"/>
      <Parameters>
         <MaxChargeTime min="5" max="2" curve="linear"/>
         <MaxDamage min="100" max="1500" curve="exp_incr"/>
         <Cooldown min="3.6" max="0.2" curve="exp_decr"/>
         <Radius min="3" max="8" curve="exp_incr"/>
      </Parameters>
   </Object>
Example of ServerPlayerShoot:
Code:
            for (var i = 0; i < this._numShots; i++)
                msgs.Add(new ServerPlayerShoot()
                {
                    BulletId = proj.Id,
                    OwnerId = this._player.Id,
                    ContainerType = placeHolder.ObjectType,
                    StartingPos = Pos,
                    Angle = (float)(i * (Math.PI * 2) / this._numShots),
                    Damage = (short)dmg
                });
Quote Originally Posted by sgrawsreghawrhgwrhgr View Post
XML objects (you must have them already):
Code:
 <Object id="CloseRangeAttack" type="0x8300">
      <PetProjectile/>
      <Projectile>
         <ObjectId>Pet Bullet 3</ObjectId>
         <MinDamage>7</MinDamage>
         <MaxDamage>200</MaxDamage>
         <Speed>100</Speed>
         <LifetimeMS>400</LifetimeMS>
         <Size>80</Size>
      </Projectile>
   </Object>
   <Object id="MidRangeAttack" type="0x8301">
      <PetProjectile/>
      <Projectile>
         <ObjectId>Pet Bullet 3</ObjectId>
         <MinDamage>5</MinDamage>
         <MaxDamage>150</MaxDamage>
         <Speed>100</Speed>
         <LifetimeMS>650</LifetimeMS>
         <Size>80</Size>
      </Projectile>
   </Object>
   <Object id="FarRangeAttack" type="0x8302">
      <PetProjectile/>
      <Projectile>
         <ObjectId>Pet Bullet 3</ObjectId>
         <MinDamage>3</MinDamage>
         <MaxDamage>100</MaxDamage>
         <Speed>100</Speed>
         <LifetimeMS>900</LifetimeMS>
         <Size>80</Size>
      </Projectile>
   </Object>
   <Object id="Heal" type="0x164">
      <PetBehavior/>
      <Class>PetBehavior</Class>
      <BaseBehavior id="PetHeal"/>
      <Parameters>
         <MaxHeal min="10" max="90" curve="exp_incr"/>
         <Cooldown min="10" max="1" curve="dim_returns"/>
      </Parameters>
   </Object>
   <Object id="MagicHeal" type="0x170">
      <PetBehavior/>
      <Class>PetBehavior</Class>
      <BaseBehavior id="PetMagicHeal"/>
      <Parameters>
         <MaxHeal min="1" max="45" curve="exp_incr"/>
         <Cooldown min="10" max="1" curve="dim_returns"/>
      </Parameters>
   </Object>
   <Object id="AttackClose" type="0x17f">
      <PetBehavior/>
      <Class>PetBehavior</Class>
      <BaseBehavior id="PetShoot"/>
      <Parameters>
         <ProjectileId value="CloseRangeAttack"/>
         <DamageCurve value="exp_incr"/>
         <ThreatRange value="4.5"/>
         <Delay min="5" max=".2" curve="exp_decr"/>
         <AimType value="Targeted"/>
      </Parameters>
   </Object>
   <Object id="AttackMid" type="0x180">
      <PetBehavior/>
      <Class>PetBehavior</Class>
      <BaseBehavior id="PetShoot"/>
      <Parameters>
         <ProjectileId value="MidRangeAttack"/>
         <DamageCurve value="exp_incr"/>
         <ThreatRange value="6.75"/>
         <Delay min="5" max=".2" curve="exp_decr"/>
         <AimType value="Targeted"/>
      </Parameters>
   </Object>
   <Object id="AttackFar" type="0x181">
      <PetBehavior/>
      <Class>PetBehavior</Class>
      <BaseBehavior id="PetShoot"/>
      <Parameters>
         <ProjectileId value="FarRangeAttack"/>
         <DamageCurve value="exp_incr"/>
         <ThreatRange value="9"/>
         <Delay min="5" max=".2" curve="exp_decr"/>
         <AimType value="Targeted"/>
      </Parameters>
   </Object>
   <Object id="ElectricZap" type="0x182">
      <PetBehavior/>
      <Class>PetBehavior</Class>
      <BaseBehavior id="PetZap"/>
      <Parameters>
         <Color value="0xffffff"/>
         <Damage min="5" max="300" curve="exp_incr"/>
         <DamageRange min="5" max="50" curve="linear"/>
         <Delay min="1" max="0" curve="dim_returns"/>
         <ThreatRange min="0.35" max="2" curve="linear"/>
         <Effect>
            <Type value="Paralyzed"/>
            <Probability min="0" max=".2" curve="linear"/>
            <Duration min=".4" max="4" curve="dim_returns"/>
         </Effect>
      </Parameters>
   </Object>
   <Object id="PetSavage" type="0x183">
      <PetBehavior/>
      <Class>PetBehavior</Class>
      <BaseBehavior id="PetSavage"/>
      <Parameters>
         <Tiles min="2.5" max="8" curve="dim_returns"/>
         <Frequency min="8" max=".8" curve="exp_incr"/>
      </Parameters>
   </Object>
   <Object id="PetDecoy" type="0x184">
      <PetBehavior/>
      <Class>PetBehavior</Class>
      <BaseBehavior id="PetDecoy"/>
      <Parameters>
         <Radius min="3" max="12" curve="dim_returns"/>
         <Duration min="3" max="8" curve="exp_incr"/>
         <Cooldown min="10" max="3" curve="exp_decr"/>
      </Parameters>
   </Object>
   <Object id="PetRisingFury" type="0x185">
      <PetBehavior/>
      <Class>PetBehavior</Class>
      <BaseBehavior id="PetRisingFury"/>
      <Parameters>
         <MaxChargeTime min="5" max="2" curve="linear"/>
         <MaxDamage min="100" max="1500" curve="exp_incr"/>
         <Cooldown min="3.6" max="0.2" curve="exp_decr"/>
         <Radius min="3" max="8" curve="exp_incr"/>
      </Parameters>
   </Object>
Example of ServerPlayerShoot:
Code:
            for (var i = 0; i < this._numShots; i++)
                msgs.Add(new ServerPlayerShoot()
                {
                    BulletId = proj.Id,
                    OwnerId = this._player.Id,
                    ContainerType = placeHolder.ObjectType,
                    StartingPos = Pos,
                    Angle = (float)(i * (Math.PI * 2) / this._numShots),
                    Damage = (short)dmg
                });
Oh that's what they were called... I was search for 'Petattackclose' etc. lol

Thought you were talking about 'PlayerShootPacket' lol

- - - Updated - - -

How do I use pet projectiles?

- - - Updated - - -

I don't have the 'ServerPlayerShoot' packet :S

- - - Updated - - -

I don't think any current pet abilities even make use of these XMLs...

- - - Updated - - -

All I need to do is get the projectile sprite to enter world then move from pet position to enemy position at a set speed. I have already coded all the range, damage, cooldown getters, etc.
You must have the packet, perhaps named differently.
You essentially need to get the projectile data out of the object XMLs, use the object type for the container type of the packet, and create projectile instances using the data you have extracted from the XMLs

- - - Updated - - -

The XMLs provide the sprite, which is why you should use them. You don't have to use them for the damage/calculations
Yes exactly! But I don't know how to extract the projectile's data

Forget the pet projectile XMLs, those are incompatible with FSOD I think cause they weren't used for electric or any pet abilities. I will use an enemy's projectile for the moment.

Code:
ushort objType;
Dictionary<string, ushort> icdatas = new Dictionary<string, ushort>(host.Manager.GameData.IdToObjectType, StringComparer.OrdinalIgnoreCase);
icdatas.TryGetValue("Green Blob", out objType);
So 'objType' now stores the 'Id' associated with the 'Green Blob' projectile.
To get this projectile's data I thought of using "Items prj = host.Manager.GameData.Items[objType]", but it's not an item, so I tried "ObjectDescs prj = host.Manager.GameData.ObjectDescs[objType]"...
I don't know how to extract the data... It should be "ProjectileDesc prj = host.Manager.GameDate.ProjectileDesc[objType]" but this is undefined :'(
###

Although...

Looking at,
Code:
BulletId = proj.Id,
OwnerId = this._player.Id,
ContainerType = placeHolder.ObjectType,
StartingPos = Pos,
Angle = (float)(i * (Math.PI * 2) / this._numShots),
Damage = (short)dmg
I can set 'Damage', 'Angle', 'StartingPos', 'ContainerType' and 'OwnerId' without any XML data extraction.
What is 'BulletId'?

- - - Updated - - -

Quote Originally Posted by sgrawsreghawrhgwrhgr View Post
The XMLs provide the sprite, which is why you should use them.
That's their only use to me lol

- - - Updated - - -

Why is it not 'ShootPacket'? 'Shoot.cs' makes use of it...

- - - Updated - - -

I have no idea

- - - Updated - - -

Any idea how to create a projectile instance?
Tried below but doesn't work -_-
Code:
                    ushort objType;
                    Dictionary<string, ushort> icdatas = new Dictionary<string, ushort>(host.Manager.GameData.IdToObjectType, StringComparer.OrdinalIgnoreCase);
                    icdatas.TryGetValue("Elemental Detonation Spell", out objType);
                    Item itemprj = host.Manager.GameData.Items[objType];

                    ProjectileDesc prjDesc = itemprj.Projectiles[0];

                    double startAngle = Math.Atan2(host.Y - en.Y, host.X - en.X);
                    double shootAngle = Math.Atan2(host.Y - en.Y, host.X - en.X);
                    Position prjPos = new Position { X = host.X, Y = host.Y };
                    int Ncount = 1;

                    Projectile prj = host.CreateProjectile(prjDesc, objType, Power, time.tickTimes, prjPos, (float)startAngle);
                    host.Owner.EnterWorld(prj);

                    host.Owner.BroadcastPacket(new ShootPacket
                    {
                        BulletId = prj.ProjectileId,
                        OwnerId = host.Id,
                        Position = prjPos,
                        Angle = (float)startAngle,
                        Damage = (short)Power,
                        BulletType = (byte)prjDesc.BulletType,
                        AngleInc = (float)shootAngle,
                        NumShots = (byte)Ncount,
                    }, null);
- - - Updated - - -

Please help me!
Posts 1–8 of 8 · Page 1 of 1

Post a Reply

Similar Threads

Tags for this Thread

None

Talk with us