private static void EnterWorld(object source, System.Timers.ElapsedEventArgs e) { timer.Enabled = false; GlobalVars.log.InfoFormat("enterworld function in bot man"); var request = new OperationRequest { OperationCode = (byte)OperationCode.EnterWorld, Parameters = new Dictionary <byte, object>() }; request.Parameters.Add((byte)ParameterCode.WorldName, world.Name); request.Parameters.Add((byte)ParameterCode.Username, "botmn"); request.Parameters.Add((byte)ParameterCode.Position, new Vector(500, 500)); request.Parameters.Add((byte)ParameterCode.ViewDistanceEnter, new Vector(400f, 400f)); request.Parameters.Add((byte)ParameterCode.ViewDistanceExit, new Vector(800f, 800f)); SendParameters sp = MmoActorOperationHandler.GetDefaultSP(); // sp.Unreliable = false; ((MmoInitialOperationHandler)serverPeer.CurrentOperationHandler).OperationEnterWorld( serverPeer, request, sp, true); timer = new System.Timers.Timer(); timer.Elapsed += new System.Timers.ElapsedEventHandler(Update); timer.Interval = 50; // 50ms timer.Enabled = true; watch = new Stopwatch(); watch.Start(); }
private static void SpawnMobHelper(Mob newMob) { mobTable.Add(newMob.mobItem.Id, newMob); newMob.mobItem.World.ItemCache.AddItem(newMob.mobItem); newMob.mobItem.UpdateRegionSimple(); GlobalVars.log.InfoFormat("adding bot to botman"); // send event var eventInstance = new BotSpawn { ItemId = newMob.mobItem.Id, Position = newMob.mobItem.Position, Rotation = newMob.mobItem.Rotation, }; SendParameters sp = MmoActorOperationHandler.GetDefaultSP(); // sp.Unreliable = false; var eventData = new EventData((byte)EventCode.BotSpawn, eventInstance); var message = new ItemEventMessage(newMob.mobItem, eventData, sp); newMob.mobItem.EventChannel.Publish(message); ((MmoActorOperationHandler)serverPeer.CurrentOperationHandler).AddItem(newMob.mobItem); //todo add bot to radar, just check that the world is the right one // ((World)this.World).Radar.AddItem(item, operation.Position); }
public static void MobFireBullet(Item mob) { GlobalVars.log.InfoFormat("mob" + mob.Id + "firing"); var request = new OperationRequest { OperationCode = (byte)OperationCode.FireBullet, Parameters = new Dictionary <byte, object>() }; request.Parameters.Add((byte)ParameterCode.ItemId, mob.Id); request.Parameters.Add((byte)ParameterCode.Rotation, mob.Rotation); request.Parameters.Add((byte)ParameterCode.Position, mob.Position); SendParameters sp = MmoActorOperationHandler.GetDefaultSP(); ((MmoActorOperationHandler)serverPeer.CurrentOperationHandler).OperationFireBullet(serverPeer, request, sp); }
public void Regenerate(float elapsedSec) { if (hp >= GlobalVars.MotherHP) { return; } hpAccumulated += elapsedSec * HPregenPerSec; if (hpAccumulated > hpRegainAmount) { int hpToAdd = (int)hpAccumulated; hp += hpToAdd; hpAccumulated = hpAccumulated - (float)Math.Floor(hpAccumulated); var eventInstance1 = new HpEvent { ItemId = this.mobItem.Id, HpChange = -hpToAdd, }; var eventData1 = new EventData((byte)EventCode.HpEvent, eventInstance1); var message1 = new ItemEventMessage(target.Avatar, eventData1, MmoActorOperationHandler.GetDefaultSP()); mobItem.EventChannel.Publish(message1); } }
private static void Update(object source, System.Timers.ElapsedEventArgs e) { watch.Stop(); // sets elapsed time to time since watch.Start() was called TimeSpan ts = watch.Elapsed; float msElapsed = (float)ts.Milliseconds; float elapsedSeconds = msElapsed / 1000f; if (timeTillMotherSpawn > 0) { timeTillMotherSpawn -= elapsedSeconds; } if (motherMobs.Count < GlobalVars.MaxMotherBots && timeTillMotherSpawn <= 0) { Vector pos = GetRandomCentralPosition(); AddMotherBotHelper(pos, world); timeTillMotherSpawn = GlobalVars.SecForMotherToRespawn; } foreach (MobMother mm in motherMobs) { mm.Regenerate(elapsedSeconds); if (mm.isDead && mm.childMobs.Count == 0) { motherMobs.Remove(mm); break; } mm.timeTillNextSpawn -= elapsedSeconds; // if its time to spawn next mob if (!mm.isDead && mm.timeTillNextSpawn <= 0 && mm.childMobs.Count < GlobalVars.MaxSwarmPerMother) { // spawn next mob Vector displacement = MathHelper.GetRandomVector(GlobalVars.SpawnDistFromMother); Vector mobPos = mm.mobItem.Position + displacement; AddMobToMotherrHelper(mobPos, mm, world); float t = (float)mm.childMobs.Count / (float)GlobalVars.MaxSwarmPerMother; mm.timeTillNextSpawn = MathHelper.Lerp(GlobalVars.SecMinForSwarmSpawn, GlobalVars.SecMaxForSwarmSpawn, t); } mm.CheckCollisions(elapsedSeconds, Sp, serverPeer); foreach (Mob mob in mm.childMobs) { // update positions of all children (also sends itemmoved event) mob.UpdatePosition(elapsedSeconds, MmoActorOperationHandler.GetDefaultSP()); mob.CheckCollisions(elapsedSeconds, Sp, serverPeer); mob.UpdateState(elapsedSeconds); } RemoveDeadMobsFromMother(mm); } // Asteroid spawner update: //if (timeSinceLastMake > timeToMake) //{ // int numAsteroids = asteroids.Length; // int randIndex = Random.Range(0, numAsteroids - 1); // Transform asteroidTransform = this.transform; // Vector3 astPos = // new Vector3(transform.position.x + Random.RandomRange(-xradius, xradius), transform.position.y, transform.position.z); // GameObject newAsteroid = Instantiate(asteroids[randIndex], astPos, Quaternion.identity); // float xVel = speedX + Random.RandomRange(-speedVarianceX, speedVarianceX); // float yVel = speedY + Random.RandomRange(-speedVarianceY, speedVarianceY); // Vector3 asteroidVel = new Vector3(xVel, 0, yVel); // newAsteroid.GetComponent<Rigidbody>().velocity = asteroidVel; // newAsteroid.GetComponent<Rigidbody>().AddTorque( // Random.RandomRange(-torqueRange, torqueRange), Random.RandomRange(-torqueRange, torqueRange), Random.RandomRange(-torqueRange, torqueRange)); // timeSinceLastMake = 0; // rb.asteroids.Add(newAsteroid.GetComponent<Asteroid>()); //} watch = Stopwatch.StartNew(); }
//; checks the ship item for collision with a potential projectile item, actor can be passed as // null if this ship is an npc. returns whether or not to delete the projectile public static bool CheckItemCollisionAgainstProjectile(Item ship, Item projectile, ref int hitPoints, SendParameters sp, MmoActorOperationHandler actor, float shipRadiusSq, float shipRadius) { // if its a bullet and it's not my own bullet if ((byte)projectile.Type == (byte)ItemType.Bullet && (actor == null || !actor.ContainsItem(projectile.Id))) { //Vector bulletPos = projectile.GetRewindedPos(Peer.RoundTripTime / 2); float distanceToBullet2 = (projectile.Position - ship.Position).Len2; // GlobalVars.log.InfoFormat("checkin coll " + projectile.Id.ToString() + "dist: " + distanceToBullet2.ToString()); if (distanceToBullet2 < shipRadiusSq) { GlobalVars.log.InfoFormat(ship.Id + " COLLISION with: " + (ItemType)projectile.Type); //if (removeList == null) // removeList = new List<Tuple<Item, Region>>(); //removeList.Add(new Tuple<Item, Region>(projectile, reg)); // set bullet to be removed // sp.Unreliable = false; var eventInstance = new HpEvent { ItemId = ship.Id, HpChange = GlobalVars.bulletDamage }; var eventData = new EventData((byte)EventCode.HpEvent, eventInstance); var message = new ItemEventMessage(ship, eventData, sp); ship.EventChannel.Publish(message); hitPoints -= GlobalVars.bulletDamage; if (hitPoints < 0) { // send itemdestroyed message for player's ship item } ((Bullet)projectile).SetDead(); // projectile.SetPos(new Vector(-60000, -60000)); // projectile.UpdateRegionSimple(); return(true); } } else if ((byte)projectile.Type == (byte)ItemType.Bomb) { if (actor != null && actor.isSaberOut) { Vector saberstartPt = new Vector(); Vector saberendPt = new Vector(); saberstartPt = ship.Position + ship.Rotation * GlobalVars.saberStart; saberendPt = ship.Position + ship.Rotation * GlobalVars.saberLength; Vector offset = new Vector(); if (MathHelper.Intersects(saberstartPt, saberendPt, projectile.Position, shipRadiusSq, ref offset, shipRadius, null, true)) { GlobalVars.log.InfoFormat("saber collide with a bomb"); projectile.SetPos(projectile.Position + offset * 2.1f); // move over instantly to uncollided position // set bomb velocity using 'collision impact' with saber projectile.Velocity = projectile.Velocity + (offset / offset.Len) * ship.GetCumulativeDotProducts(8) * 90f; } } // if this is not my bomb, check if i collide with it if ((actor != null && !actor.ContainsItem(projectile.Id)) || actor == null) { Vector difference = (projectile.Position - ship.Position); float distanceToBomb2 = difference.Len2; if (distanceToBomb2 < (shipRadiusSq + GlobalVars.bombBallRadius2)) { GlobalVars.log.InfoFormat("player + " + ship.Id.Substring(0, 3) + " collision with: " + projectile.Id.ToString()); //if (removeList == null) // removeList = new List<Tuple<Item, Region>>(); //removeList.Add(new Tuple<Item, Region>(projectile, reg)); // set bomb to be removed float t = (GlobalVars.bombRadius2 - distanceToBomb2) / GlobalVars.bombRadius2; int damageToPlayer = (int)Math.Floor(t * GlobalVars.bombDmg); hitPoints -= damageToPlayer; // sp.Unreliable = false; var eventInstance = new HpEvent { ItemId = ship.Id, HpChange = damageToPlayer, }; var eventData = new EventData((byte)EventCode.HpEvent, eventInstance); var message = new ItemEventMessage(ship, eventData, sp); ship.EventChannel.Publish(message); float force = GlobalVars.bombForce * t; difference = difference / (float)Math.Sqrt(distanceToBomb2); ship.wasBursted = true; ship.secSinceBursted = GlobalVars.timeForBurstToLast; ship.Velocity = ship.Velocity + difference * force; return(true); } } } return(false); }