//Set given proc to true and send packet if this is a player // todo: hidden status effects for timing when the procs fall off public void SetProc(int procId, bool val = true) { charaWork.battleTemp.timingCommandFlag[procId] = val; uint effectId = (uint)StatusEffectId.EvadeProc + (uint)procId; //If a proc just occurred, add a hidden effect effect if (val) { StatusEffect procEffect = Server.GetWorldManager().GetStatusEffect(effectId); procEffect.SetDuration(5); procEffect.SetSilent(true); statusEffects.AddStatusEffect(procEffect, this, true, true); } //Otherwise we're reseting a proc, remove the status else { statusEffects.RemoveStatusEffect(statusEffects.GetStatusEffectById((uint)effectId)); } if (this is Player) { var propPacketUtil = new ActorPropertyPacketUtil("charaWork/timingCommand", this); propPacketUtil.AddProperty(String.Format("charaWork.battleTemp.timingCommandFlag[{0}]", procId)); ((Player)this).QueuePackets(propPacketUtil.Done()); } }
public override void PostUpdate(DateTime tick, List <SubPacket> packets = null) { if (updateFlags != ActorUpdateFlags.None) { packets = packets ?? new List <SubPacket>(); if ((updateFlags & ActorUpdateFlags.Appearance) != 0) { packets.Add(new SetActorAppearancePacket(modelId, appearanceIds).BuildPacket(actorId)); } if ((updateFlags & ActorUpdateFlags.State) != 0) { packets.Add(SetActorStatePacket.BuildPacket(actorId, currentMainState, 0x0)); packets.Add(CommandResultX00Packet.BuildPacket(actorId, 0x72000062, 0)); packets.Add(CommandResultX01Packet.BuildPacket(actorId, 0x7C000062, 21001, new CommandResult(actorId, 0, 1))); updateFlags &= ~ActorUpdateFlags.State; //DoBattleAction(21001, 0x7C000062, new BattleAction(this.actorId, 0, 1, 0, 0, 1)); //Attack Mode } if ((updateFlags & ActorUpdateFlags.SubState) != 0) { packets.Add(SetActorSubStatePacket.BuildPacket(actorId, currentSubState)); packets.Add(CommandResultX00Packet.BuildPacket(actorId, 0x72000062, 0)); packets.Add(CommandResultX01Packet.BuildPacket(actorId, 0x7C000062, 21001, new CommandResult(actorId, 0, 1))); updateFlags &= ~ActorUpdateFlags.SubState; //DoBattleAction(21001, 0x7C000062, new BattleAction(this.actorId, 0, 1, 0, 0, 1)); //Attack Mode } if ((updateFlags & ActorUpdateFlags.Status) != 0) { List <SubPacket> statusPackets = statusEffects.GetStatusPackets(); packets.AddRange(statusPackets); statusPackets.Clear(); updateFlags &= ~ActorUpdateFlags.Status; } if ((updateFlags & ActorUpdateFlags.StatusTime) != 0) { packets.AddRange(statusEffects.GetStatusTimerPackets()); statusEffects.ResetPropPacketUtil(); updateFlags &= ~ActorUpdateFlags.StatusTime; } if ((updateFlags & ActorUpdateFlags.HpTpMp) != 0) { var propPacketUtil = new ActorPropertyPacketUtil("charaWork/stateAtQuicklyForAll", this); propPacketUtil.AddProperty("charaWork.parameterSave.hp[0]"); propPacketUtil.AddProperty("charaWork.parameterSave.hpMax[0]"); propPacketUtil.AddProperty("charaWork.parameterSave.mp"); propPacketUtil.AddProperty("charaWork.parameterSave.mpMax"); propPacketUtil.AddProperty("charaWork.parameterTemp.tp"); packets.AddRange(propPacketUtil.Done()); } base.PostUpdate(tick, packets); } }
public void UpdateUiState(int index, sbyte value) { guildleveWork.uiState[index] = value; ActorPropertyPacketUtil propertyBuilder = new ActorPropertyPacketUtil("guildleveWork/infoVariable", this); propertyBuilder.AddProperty(String.Format("guildleveWork.uiState[{0}]", index)); SendPacketsToPlayers(propertyBuilder.Done()); }
public void SyncAllInfo() { ActorPropertyPacketUtil propertyBuilder = new ActorPropertyPacketUtil("guildleveWork/infoVariable", this); if (guildleveWork.aimNum[0] != 0) { propertyBuilder.AddProperty("guildleveWork.aimNum[0]"); } if (guildleveWork.aimNum[1] != 0) { propertyBuilder.AddProperty("guildleveWork.aimNum[1]"); } if (guildleveWork.aimNum[2] != 0) { propertyBuilder.AddProperty("guildleveWork.aimNum[2]"); } if (guildleveWork.aimNum[3] != 0) { propertyBuilder.AddProperty("guildleveWork.aimNum[3]"); } if (guildleveWork.aimNumNow[0] != 0) { propertyBuilder.AddProperty("guildleveWork.aimNumNow[0]"); } if (guildleveWork.aimNumNow[1] != 0) { propertyBuilder.AddProperty("guildleveWork.aimNumNow[1]"); } if (guildleveWork.aimNumNow[2] != 0) { propertyBuilder.AddProperty("guildleveWork.aimNumNow[2]"); } if (guildleveWork.aimNumNow[3] != 0) { propertyBuilder.AddProperty("guildleveWork.aimNumNow[3]"); } if (guildleveWork.uiState[0] != 0) { propertyBuilder.AddProperty("guildleveWork.uiState[0]"); } if (guildleveWork.uiState[1] != 0) { propertyBuilder.AddProperty("guildleveWork.uiState[1]"); } if (guildleveWork.uiState[2] != 0) { propertyBuilder.AddProperty("guildleveWork.uiState[2]"); } if (guildleveWork.uiState[3] != 0) { propertyBuilder.AddProperty("guildleveWork.uiState[3]"); } SendPacketsToPlayers(propertyBuilder.Done()); }
public void UpdateMarkers(int markerIndex, float x, float y, float z) { guildleveWork.markerX[markerIndex] = x; guildleveWork.markerY[markerIndex] = y; guildleveWork.markerZ[markerIndex] = z; ActorPropertyPacketUtil propertyBuilder = new ActorPropertyPacketUtil("guildleveWork/marker", this); propertyBuilder.AddProperty(String.Format("guildleveWork.markerX[{0}]", markerIndex)); propertyBuilder.AddProperty(String.Format("guildleveWork.markerY[{0}]", markerIndex)); propertyBuilder.AddProperty(String.Format("guildleveWork.markerZ[{0}]", markerIndex)); SendPacketsToPlayers(propertyBuilder.Done()); }
public void EndGuildleve(bool wasCompleted) { if (isEnded) { return; } isEnded = true; completionTime = Utils.UnixTimeStampUTC() - guildleveWork.startTime; if (wasCompleted) { foreach (Actor a in GetPlayerMembers()) { Player player = (Player)a; player.MarkGuildleve(guildleveId, true, true); player.PlayAnimation(0x02000002, true); player.ChangeMusic(81); player.SendGameMessage(Server.GetWorldManager().GetActor(), 50023, 0x20, (object)(int)guildleveId); player.SendDataPacket("attention", Server.GetWorldManager().GetActor(), "", 50023, (object)(int)guildleveId); } } foreach (Actor a in GetNpcMembers()) { Npc npc = (Npc)a; npc.Despawn(); RemoveMember(a); } guildleveWork.startTime = 0; guildleveWork.signal = -1; ActorPropertyPacketUtil propertyBuilder = new ActorPropertyPacketUtil("guildleveWork/signal", this); propertyBuilder.AddProperty("guildleveWork.signal"); propertyBuilder.NewTarget("guildleveWork/start"); propertyBuilder.AddProperty("guildleveWork.startTime"); SendPacketsToPlayers(propertyBuilder.Done()); if (wasCompleted) { Npc aetheryteNode = zone.SpawnActor(1200040, String.Format("{0}:warpExit", guildleveOwner.actorName), guildleveOwner.positionX, guildleveOwner.positionY, guildleveOwner.positionZ); AddMember(aetheryteNode); foreach (Actor a in GetPlayerMembers()) { Player player = (Player)a; player.SendGameMessage(Server.GetWorldManager().GetActor(), 50029, 0x20); player.SendGameMessage(Server.GetWorldManager().GetActor(), 50032, 0x20); } } }
//This logic isn't correct, order of GetStatusEffects() is not necessarily the same as the actual effects in game. Also sending every time at once isn't needed public List <SubPacket> GetActorStatusPackets() { var propPacketUtil = new ActorPropertyPacketUtil("charaWork/status", this); var i = 0; foreach (var effect in statusEffects.GetStatusEffects()) { if (!effect.GetHidden()) { propPacketUtil.AddProperty(String.Format("charaWork.statusShownTime[{0}]", i)); propPacketUtil.AddProperty(String.Format("charaWork.statusShownTime[{0}]", i)); i++; } } return(propPacketUtil.Done()); }
public override void PostUpdate(DateTime tick, List <SubPacket> packets = null) { // todo: should probably add another flag for battleTemp since all this uses reflection packets = new List <SubPacket>(); if ((updateFlags & ActorUpdateFlags.HpTpMp) != 0) { var propPacketUtil = new ActorPropertyPacketUtil("charaWork/stateAtQuicklyForAll", this); propPacketUtil.AddProperty("charaWork.parameterSave.state_mainSkill[0]"); propPacketUtil.AddProperty("charaWork.parameterSave.state_mainSkillLevel"); propPacketUtil.AddProperty("charaWork.battleTemp.castGauge_speed[0]"); propPacketUtil.AddProperty("charaWork.battleTemp.castGauge_speed[1]"); packets.AddRange(propPacketUtil.Done()); } base.PostUpdate(tick, packets); }
public void SetCurrentContentGroup(ContentGroup group) { if (group != null) { charaWork.currentContentGroup = group.GetTypeId(); } else { charaWork.currentContentGroup = 0; } currentContentGroup = group; ActorPropertyPacketUtil propPacketUtil = new ActorPropertyPacketUtil("charaWork/currentContentGroup", this); propPacketUtil.AddProperty("charaWork.currentContentGroup"); zone.BroadcastPacketsAroundActor(this, propPacketUtil.Done()); }
//Reset procs. Only send packet if any procs were actually reset. //This assumes you can't use weaponskills between getting a proc and using the procced ability public void ResetProcs() { var propPacketUtil = new ActorPropertyPacketUtil("charaWork/timingCommand", this); bool shouldSend = false; for (int i = 0; i < 4; i++) { if (charaWork.battleTemp.timingCommandFlag[i]) { shouldSend = true; charaWork.battleTemp.timingCommandFlag[i] = false; propPacketUtil.AddProperty(String.Format("charaWork.battleTemp.timingCommandFlag[{0}]", i)); } } if (shouldSend && this is Player) { ((Player)this).QueuePackets(propPacketUtil.Done()); } }
//This might need more work //I think there migh be something that ties mobs to parties //and the client checks if any mobs are tied to the current party //and bases the color on that. Adding mob to party obviously doesn't work //Based on depictionjudge script: //HATE_TYPE_NONE is for passive //HATE_TYPE_ENGAGED is for aggroed mobs //HATE_TYPE_ENGAGED_PARTY is for claimed mobs, client uses occupancy group to determine if mob is claimed by player's party //for now i'm just going to assume that occupancygroup will be BattleNpc's currentparties when they're in combat, //so if party isn't null, they're claimed. public SubPacket GetHateTypePacket(Player player) { npcWork.hateType = NpcWork.HATE_TYPE_NONE; if (player != null) { if (aiContainer.IsEngaged()) { npcWork.hateType = NpcWork.HATE_TYPE_ENGAGED; if (this.currentParty != null) { npcWork.hateType = NpcWork.HATE_TYPE_ENGAGED_PARTY; } } } npcWork.hateType = 3; var propPacketUtil = new ActorPropertyPacketUtil("npcWork/hate", this); propPacketUtil.AddProperty("npcWork.hateType"); return(propPacketUtil.Done()[0]); }
public void StartGuildleve() { foreach (Actor p in GetPlayerMembers()) { Player player = (Player)p; //Set music if (guildleveData.location == 1) { player.ChangeMusic(22); } else if (guildleveData.location == 2) { player.ChangeMusic(14); } else if (guildleveData.location == 3) { player.ChangeMusic(26); } else if (guildleveData.location == 4) { player.ChangeMusic(16); } //Show Start Messages player.SendGameMessage(Server.GetWorldManager().GetActor(), 50022, 0x20, guildleveId, selectedDifficulty); player.SendDataPacket("attention", Server.GetWorldManager().GetActor(), "", 50022, guildleveId, selectedDifficulty); player.SendGameMessage(Server.GetWorldManager().GetActor(), 50026, 0x20, (object)(int)guildleveData.timeLimit); } guildleveWork.startTime = Utils.UnixTimeStampUTC(); ActorPropertyPacketUtil propertyBuilder = new ActorPropertyPacketUtil("guildleveWork/start", this); propertyBuilder.AddProperty("guildleveWork.startTime"); SendPacketsToPlayers(propertyBuilder.Done()); }
public List <SubPacket> GetStatusTimerPackets() { return(statusTimerPropPacketUtil.Done()); }
public override List <SubPacket> GetInitPackets() { ActorPropertyPacketUtil propPacketUtil = new ActorPropertyPacketUtil("/_init", this); //Potential propPacketUtil.AddProperty("charaWork.battleSave.potencial"); //Properties for (int i = 0; i < charaWork.property.Length; i++) { if (charaWork.property[i] != 0) { propPacketUtil.AddProperty(String.Format("charaWork.property[{0}]", i)); } } //Parameters propPacketUtil.AddProperty("charaWork.parameterSave.hp[0]"); propPacketUtil.AddProperty("charaWork.parameterSave.hpMax[0]"); propPacketUtil.AddProperty("charaWork.parameterSave.mp"); propPacketUtil.AddProperty("charaWork.parameterSave.mpMax"); propPacketUtil.AddProperty("charaWork.parameterTemp.tp"); if (charaWork.parameterSave.state_mainSkill[0] != 0) { propPacketUtil.AddProperty("charaWork.parameterSave.state_mainSkill[0]"); } if (charaWork.parameterSave.state_mainSkill[1] != 0) { propPacketUtil.AddProperty("charaWork.parameterSave.state_mainSkill[1]"); } if (charaWork.parameterSave.state_mainSkill[2] != 0) { propPacketUtil.AddProperty("charaWork.parameterSave.state_mainSkill[2]"); } if (charaWork.parameterSave.state_mainSkill[3] != 0) { propPacketUtil.AddProperty("charaWork.parameterSave.state_mainSkill[3]"); } propPacketUtil.AddProperty("charaWork.parameterSave.state_mainSkillLevel"); //Status Times for (int i = 0; i < charaWork.statusShownTime.Length; i++) { if (charaWork.statusShownTime[i] != 0) { propPacketUtil.AddProperty(String.Format("charaWork.statusShownTime[{0}]", i)); } } //General Parameters for (int i = 3; i < charaWork.battleTemp.generalParameter.Length; i++) { if (charaWork.battleTemp.generalParameter[i] != 0) { propPacketUtil.AddProperty(String.Format("charaWork.battleTemp.generalParameter[{0}]", i)); } } propPacketUtil.AddProperty("npcWork.hateType"); if (npcWork.pushCommand != 0) { propPacketUtil.AddProperty("npcWork.pushCommand"); if (npcWork.pushCommandSub != 0) { propPacketUtil.AddProperty("npcWork.pushCommandSub"); } propPacketUtil.AddProperty("npcWork.pushCommandPriority"); } return(propPacketUtil.Done()); }