public static void RegisterUpdateObject(Type type) { try { object[] tmp = type.GetCustomAttributes(typeof(UpdateObjectAttribute), true); if (tmp.Length == 0) { throw new ObjectUpdateManagerException(type.ToString() + " has no UpdateObjectAttribute"); } UpdateObjectAttribute updateObjectAttribute = (UpdateObjectAttribute)tmp[0]; if (updateObjectAttribute.MaxFields == -1) { throw new ObjectUpdateManagerException("MaxFields is not set in UpdateObjectAttribute on " + type.ToString()); } Hashtable tbl = new Hashtable(); foreach (MemberValue value in MemberValue.GetMemberValues(type, typeof(UpdateValueAttribute), true, false)) { UpdateValueAttribute attrib = (UpdateValueAttribute)value.Attribute; if (!checkType(attrib, type)) { continue; } Type valueType = value.GetValueType(); if (valueType.IsArray == false) { if (!IsSubClass(valueType)) { if (attrib.Field == -1) { throw new ObjectUpdateManagerException("Field was not set on " + type.Name + value.GetName()); } if (value is IndexMemberValue) { IndexMemberValue indexValue = value as IndexMemberValue; if (valueType == typeof(ulong) || valueType == typeof(long)) { AddUpdateValue(tbl, value, attrib.Field + indexValue.Index * 2); } else { AddUpdateValue(tbl, value, attrib.Field + indexValue.Index); } } else { AddUpdateValue(tbl, value, attrib.Field); } } else { GetSubClassUpdateValues(tbl, value, attrib.Field == -1 ? 0 : attrib.Field, valueType, type); } } else { if (attrib.ArraySize == -1) { throw new ObjectUpdateManagerException("ArraySize was not set on " + type.Name + "." + value.GetName()); } if (attrib.Field == -1) { throw new ObjectUpdateManagerException("Field was not set on the array " + type.Name + "." + value.GetName()); } if (attrib.NumSubFields == -1) { throw new ObjectUpdateManagerException("NumFields was not set on the subclass array " + type.Name + "." + value.GetName()); } valueType = valueType.GetElementType(); for (int i = 0; i < attrib.ArraySize; i++) { IndexMemberValue indexValue = new IndexMemberValue(value, i); GetSubClassUpdateValues(tbl, indexValue, attrib.Field + i * attrib.NumSubFields, valueType, type); } } } if (tbl.Count == 0) { throw new ObjectUpdateManagerException("No update values in " + type.ToString()); } UpdateObjectInfo uoi = new UpdateObjectInfo(tbl, updateObjectAttribute.MaxFields); m_updateObjectInfos[type] = uoi; } catch (Exception exp) { DebugLogger.Log("", exp); } }
public void DealDamage(PlayerObject pobj, int damage) { if (!this.Dead) { if (m_agrotable[pobj.CharacterID] == null) { m_agrotable.Add(pobj.CharacterID, damage); } else { int damagedealt = (int)m_agrotable[pobj.CharacterID]; damagedealt += damage; m_agrotable[pobj.CharacterID] = damagedealt; } this.Health -= damage; if (this.Health < 1) { this.Roaming = false; EventManager.AddEvent(new CorpseDespawnEvent((UnitBase)this)); this.Health = 0; this.StandState = UNITSTANDSTATE.DEAD; this.Dead = true; this.DynamicFlags = 1; // If set to 1 there will be loot. this.LootOwner = pobj.GUID; this.UpdateData(); try { // Give xp to the right people. int exp = StatManager.CalculateExp(this, pobj); int maxdamage = 0; Hashtable expdividergroup = new Hashtable(); Hashtable expdividersolo = new Hashtable(); foreach (DictionaryEntry de in m_agrotable) { maxdamage += (int)de.Value; WorldClient aclient = WorldServer.GetClientByCharacterID((uint)de.Key); if (aclient.Player.Group == null) { expdividersolo.Add(aclient.Player.CharacterID, (int)de.Value); } else { if (expdividergroup[aclient.Player.Group.LeaderGUID] == null) { expdividergroup.Add(aclient.Player.Group.LeaderGUID, (int)de.Value); } else { int damagedealt = (int)expdividergroup[aclient.Player.Group.LeaderGUID]; damagedealt += (int)de.Value; expdividergroup[aclient.Player.Group.LeaderGUID] = damagedealt; } } } // Solo players foreach (DictionaryEntry de in expdividersolo) { float expbit = ((int)de.Value / (float)maxdamage); WorldClient aclient = WorldServer.GetClientByCharacterID((uint)de.Key); if (aclient != null) { aclient.Player.GainXp(Convert.ToInt32(exp * expbit), this.GUID); } } // Group players foreach (DictionaryEntry de in expdividergroup) { WorldClient aclient = WorldServer.GetClientByCharacterID(Convert.ToUInt32((ulong)de.Key)); if (aclient != null) { GroupObject gobj = aclient.Player.Group; float expbit = (((int)de.Value / (float)maxdamage) / (float)gobj.Size); for (int i = 0; i < gobj.Size; i++) { gobj.Members[i].GainXp(Convert.ToInt32(exp * expbit), this.GUID); } } } } catch (Exception exp) { DebugLogger.Log("", exp); } } else { this.UpdateData(); if (this.MobsRegenEvent == null) { this.MobsRegenEvent = new MobsRegenEvent(this); EventManager.AddEvent(this.MobsRegenEvent); } } } }