protected override bool TickCore(realm.RealmTime time) { object obj; SpawnState state = null; if (!Host.StateStorage.TryGetValue(Key, out obj) || (state = (SpawnState)obj).remainingTick <= 0) { Entity[] originalChildren = null; if (state != null) originalChildren = state.children; state = new SpawnState() { remainingTick = 10000, children = new Entity[5] }; double angleInc = (2 * Math.PI) / 5; for (int i = 0; i < 5; i++) { Entity entity = Entity.Resolve(0x0951); entity.Move( Host.Self.X + (float)Math.Cos(angleInc * i) * 4, Host.Self.Y + (float)Math.Sin(angleInc * i) * 4); state.children[i] = entity; Host.Self.Owner.BroadcastPacket(new ShowEffectPacket() { EffectType = EffectType.Throw, Color = new ARGB(0xffffbf00), TargetId = Host.Self.Id, PosA = new Position() { X = entity.X, Y = entity.Y } }, null); } Host.StateStorage[Key] = state; Host.Self.Owner.Timers.Add(new WorldTimer(1500, (world, t) => { if (originalChildren != null) foreach (var i in originalChildren) { if (i.Owner != null) i.Owner.LeaveWorld(i); } foreach (var i in state.children) world.EnterWorld(i); })); return false; } else { state.remainingTick -= time.thisTickTimes; if (state.remainingTick <= 0 || (state.remainingTick < 8000 && state.children.Sum(_ => _.Owner == null ? 0 : 1) < 3)) state.remainingTick = 0; } return false; }
protected override void OnStateEntry(realm.Entity host, realm.RealmTime time, ref object state) { state = new SwirlState() { Center = targeted ? Vector2.Zero : new Vector2(host.X, host.Y), Acquired = !targeted, }; }
protected override void OnStateEntry(realm.Entity host, realm.RealmTime time, ref object state) { state = new OrbitState() { Speed = speed + speedVariance * (float)(Random.NextDouble() * 2 - 1), Radius = radius + radiusVariance * (float)(Random.NextDouble() * 2 - 1) }; }
protected override void BehaveCore(BehaviorCondition cond, realm.RealmTime? time, object state) { Enemy entity = Entity.Resolve(objType) as Enemy; Enemy parent = Host as Enemy; entity.Move(parent.X, parent.Y); entity.Terrain = (Host as Enemy).Terrain; parent.DamageCounter.Corpse = entity.DamageCounter; parent.Owner.EnterWorld(entity); }
protected override void BehaveCore(BehaviorCondition cond, realm.RealmTime? time, object state) { int c = rand.Next(minCount, maxCount + 1); for (int i = 0; i < c; i++) { Entity entity = Entity.Resolve(objType); Entity parent = Host as Entity; entity.Move(parent.X, parent.Y); (entity as Enemy).Terrain = (Host as Enemy).Terrain; parent.Owner.EnterWorld(entity); } }
protected override void BehaveCore(BehaviorCondition cond, realm.RealmTime? time, object state) { if (new Random().Next(1, 100) <= percent) { Portal entity = Entity.Resolve(objType) as Portal; Entity parent = Host as Entity; entity.Move(parent.X, parent.Y); parent.Owner.EnterWorld(entity); World w = RealmManager.GetWorld(Host.Self.Owner.Id); w.Timers.Add(new WorldTimer(30 * 1000, (world, t) => //default portal close time * 1000 { try { w.LeaveWorld(entity); } catch //couldn't remove portal, Owner became null. Should be fixed with RealmManager implementation { Console.Out.WriteLine("Couldn't despawn portal."); } })); } }
protected override void BehaveCore(BehaviorCondition cond, realm.RealmTime? time, object state) { float dist = 2; var entity = GetNearestEntity(ref dist, null); if (entity != null) { var chr = Host as Character; var angleInc = (2 * Math.PI) / 12; var desc = chr.ObjectDesc.Projectiles[0]; byte prjId = 0; Position prjPos = new Position() { X = chr.X, Y = chr.Y }; var dmg = chr.Random.Next(desc.MinDamage, desc.MaxDamage); for (int i = 0; i < 12; i++) { var prj = chr.CreateProjectile( desc, chr.ObjectType, dmg, time.Value.tickTimes, prjPos, (float)(angleInc * i)); chr.Owner.EnterWorld(prj); if (i == 0) prjId = prj.ProjectileId; } chr.Owner.BroadcastPacket(new MultiShootPacket() { BulletId = prjId, OwnerId = Host.Self.Id, BulletType = (byte)desc.BulletType, Position = prjPos, Angle = 0, Damage = (short)dmg, NumShots = 12, AngleIncrement = (float)angleInc, }, null); chr.Owner.LeaveWorld(chr); } }