/// <summary> /// Checks requirements for trading between two characters /// </summary> /// <param name="initChr">possible initiator of trading</param> /// <param name="targetChr">possible target of trading</param> public static bool MayProposeTrade(Character initChr, Character targetChr) { TradeStatus tradeStatus; if (targetChr == null || !targetChr.IsInContext) { tradeStatus = TradeStatus.PlayerNotFound; return false; } else if (initChr.IsLoggingOut || targetChr.IsLoggingOut) { tradeStatus = TradeStatus.LoggingOut; } else if (!initChr.IsAlive) { tradeStatus = TradeStatus.PlayerDead; } else if (!targetChr.IsInRadius(initChr, MaxTradeRadius)) { tradeStatus = TradeStatus.TooFarAway; } else if (!targetChr.IsAlive) { tradeStatus = TradeStatus.TargetDead; } else if (targetChr.IsStunned) { tradeStatus = TradeStatus.TargetStunned; } else if (targetChr.IsIgnoring(initChr)) { tradeStatus = TradeStatus.PlayerIgnored; } else if (targetChr.TradeWindow != null) { tradeStatus = TradeStatus.AlreadyTrading; } else if (targetChr.Faction.Group != initChr.Faction.Group && !initChr.Role.IsStaff) { tradeStatus = TradeStatus.WrongFaction; } else if (targetChr.IsLoggingOut) { tradeStatus = TradeStatus.TargetLoggingOut; } else { tradeStatus = TradeStatus.Proposed; return true; } TradeHandler.SendTradeStatus(initChr, tradeStatus); return false; }
/// <summary> /// Check whether the given inviter may invite the given target /// </summary> public static GroupResult CheckInvite(Character inviter, out Character target, string targetName) { GroupResult err; var inviterMember = inviter.GroupMember; var group = inviterMember != null ? inviterMember.Group : null; if (group != null && group.IsFull) { // your group is full err = GroupResult.GroupIsFull; target = null; targetName = string.Empty; } else if ((inviterMember != null && !inviterMember.IsAtLeastAssistant)) { target = null; err = GroupResult.DontHavePermission; } else { target = World.GetCharacter(targetName, false); if (target == null || inviter == target || (target.Role.IsStaff && !inviter.Role.IsStaff)) // cannot invite staff members without authorization { // Character is offline or doesn't exist err = GroupResult.OfflineOrDoesntExist; } else if (inviter.Faction.Group != target.Faction.Group) { // you can't invite anyone from another faction err = GroupResult.TargetIsUnfriendly; } else if (target.Group != null || target.IsInvitedToGroup) { err = GroupResult.AlreadyInGroup; } else if (target.IsIgnoring(inviter) && !inviter.Role.IsStaff) { err = GroupResult.TargetIsIgnoringYou; } else { return GroupResult.NoError; } } SendResult(inviter.Client, err, 0, targetName); return err; }