排除了代码过多的原因,其他同样的行数的单元就很好,就这个很卡,恳请大佬帮忙指点指点,谢谢
====================================================================================================
unit ObjPlayer;
interface
uses
Windows, Classes, SysUtils, UInt64Lib, StrUtils, Grobal2, EDcode, Envir, ObjBase, ObjPetBooth,GameDB_SQL, WinlicenseSDK, MapPoint,
VersionManage, ObjPlayer_0_Base, PacketManageUnit, DateUtils;
type
//玩家对象
TPlayObject = class(TBasePlayObject)
m_DearHuman: TPlayObject;
m_MasterHuman: TPlayObject;
m_GetWhisperHuman: TPlayObject;
//ai参数
m_boAI : Boolean;
m_RunPos: TRunPos;
m_boAIStart: Boolean;
m_ManagedEnvir: TEnvirnoment; //挂机地图
m_nPostion: Integer;
m_PointManager: TPointManager;
m_Path: TPath;
start_x,start_y:Integer ;
m_nMoveFailCount:Integer ;
m_nround:Integer ;
//new转移
m_GuildTowerInfo: TGuildTowerInfo;
m_dwStopMagic: array[1..199] of Integer; //禁止人物释放技能
m_btBuffArr: array[1..MAX_BUFF_TICK] of Byte; //Buff效果持续时间标记
m_dwBuffArrTick: array[1..MAX_BUFF_TICK] of LongWord;
m_ErgumCount: TErgumCount;
m_DealCreat: TBaseObject; //交易的主动方
m_boSuitSub: array[0..500] of Boolean; //套装属性
m_ExemptHurt: TExemptHurt;
m_ReduceSkillLevel: array[0..40] of byte; //41个魂佑技能等级
m_ReduceSkillPoint: array[0..40] of byte; //41个魂佑技能点数 灵兽装备增加的
private
procedure ClientAddFriend(FriendName: string);
procedure ClientDelFriend(FriendName: string);
procedure ClientRespAddFriend(nRespCode: word; FriendName: string);
procedure AddToFriendList(FriendName: string);
procedure DelFromFriendList(FriendName: string);
function ClientDropGold(nGold: Integer): Boolean;
procedure ClientQueryBagItems();
procedure ClientSendBagOrder();
function ClientRide: Boolean;
procedure ClearFree();
function GetAmbitStatus(): Integer; override;
function GetMagicExStatus(): byte; override;
function GetFeature(BaseObject: TBaseObject): Integer; override;
function GetFeatureEx(): byte; override;
procedure StruckDamage(nDamage: Integer); override;
public
procedure KillMonsterFunc();
procedure KillPlayerFunc();
procedure CheckProwlMagic(); //检查是否有潜行
procedure SendPetInfo(State: byte);
procedure ClientRideOff;
procedure SendMeOnlineState(State: byte; b: ShortInt = -1);
procedure MakeWeaponUnlock();
function PetStoreAddExp(nPetItemIdx, nExp, nDay: Integer; boEat: Boolean): Boolean; override;
procedure SendTigerItem();
procedure CheckStoreBagDupeItem;
private
m_sQueryName: string;
function CheckEatItems(StdItem: pTStdItem): Boolean;
procedure ClientQueryUserSet(ProcessMsg: pTProcessMessage);
function IsDownPetItem(nMakeIndex: Integer): Boolean;
function ClientDropItem(sItemName: string; nItemIdx: Integer): Boolean;
procedure ClientQueryUserState(BaseObject: TBaseObject; nX, nY: Integer);
function PetPickUpItem(nX, nY: Integer): Boolean;
procedure ClientOpenDoor(nX, nY: Integer);
function ClientTakeOnItems(btWhere: byte; nItemIdx: Integer; sItemName: string; boFlag: Boolean): Boolean;
procedure ClientTakeOffItems(btWhere: byte; nItemIdx: Integer; sItemName: string);
procedure ClientUseItems(nItemIdx: Integer; sItemName: string; nPackIdx: Integer);
function UseStdmodeFunItem(StdItem: pTStdItem; boNew: Boolean = False): Boolean;
procedure RefMyStatus;
function ClientGetButchItem(BaseObject: TBaseObject; nX, nY: Integer; btDir: byte; var dwDelayTime: LongWord): Boolean;
procedure ClientChangeMagicKey(nSkillIdx, nKey: Integer);
procedure ClientMerchantDlgSelect(nParam1: Integer; sMsg: string; nType: Integer = 0);
procedure ClientNamedStore(nParam1: Integer; nMakeIndex: Integer);
procedure ClientSplitItem(nMakeIndex: Integer; nCount: Integer; boScript: Boolean);
procedure RecordHomeXY(nParam1: Integer; nMapIdx: Integer); overload;
procedure RecordHomeXY(nParam1: Integer; sMsg: string); overload;
procedure ClientPerfectStoreMoveHome(nParam1: Integer; nMapIdx: Integer);
procedure ClientQuerySlaverState;
procedure ClientInput(nParam1: Integer; Data: string);
procedure ClientMerchantQuerySellPrice(nParam1, nMakeIndex: Integer; sMsg: string);
procedure ClientUserSellItem(nParam1, nMakeIndex: Integer; sMsg: string);
procedure ClientUserBuyItem(nIdent, nParam1, nInt, nZz: Integer; sMsg: string; nType: Integer = 0);
procedure ClientQueryRepairCost(nParam1, nInt: Integer; nRepairType: Integer; sMsg: string);
procedure ClientRepairItem(nParam1, nInt: Integer; nRepairType: Integer; sMsg: string);
function FindViewHum(PlayObject: TObject): TPlayObject;
procedure ClientGropuClose();
procedure ClientCreateGroup(sHumName: string);
procedure ClientAddGroupMember(sHumName: string);
procedure ClientDelGroupMember(sHumName: string);
procedure ClientDealTry(sHumName: string);
procedure ClientAddDealItem(nItemIdx: Integer; sItemName: string);
procedure ClientDelDealItem(nItemIdx: Integer; sItemName: string);
procedure ClientCancelDeal();
procedure ClientChangeDealGold(nGold, nGameGold: Integer);
procedure ClientDealEnd();
procedure ClientStorageItem(NPC: TObject; nItemIdx: Integer; boFast:
Boolean; sMsg: string);
procedure ClientTakeBackStorageItem(NPC: TObject; nItemIdx: Integer; boFast:
Boolean; sMsg: string);
procedure ClientGetMinMap();
procedure ClientMakeDrugItem(NPC: TObject; nItemName: string);
procedure ClientOpenGuildDlg();
procedure ClientGuildHome();
procedure ClientGuildAddMember(sHumName: string);
procedure ClientGuildDelMember(sHumName: string);
procedure ClientGuildUpdateNotice(sNotict: string);
procedure ClientGuildUpdateRankInfo(sRankInfo: string);
procedure ClientGuildAlly();
procedure ClientGuildBreakAlly(sGuildName: string);
procedure ClientAdjustBonus(nPoint: Integer; sMsg: string);
function ClientChangeDir(wIdent: word; nX, nY, nDir: Integer; var
dwDelayTime: LongWord): Boolean;
function ClientWalkXY(wIdent: word; nX, nY: Integer; boLateDelivery:
Boolean; var dwDelayTime: LongWord): Boolean;
// function ClientHorseRunXY(wIdent: word; nX, nY: Integer; boLateDelivery:
// Boolean; var dwDelayTime: LongWord): Boolean;
function ClientRunXY(wIdent: word; nX, nY: Integer; nFlag: Integer; var dwDelayTime: LongWord): Boolean;
function ClientHitXY(wIdent: word; nX, nY, nDir, nMagicID: Integer;
boLateDelivery: Boolean; var dwDelayTime: LongWord): Boolean;
function ClientSitDownHit(nX, nY, nDir: Integer; var dwDelayTime: LongWord): Boolean;
function ClientSpellXY(wIdent: word; nKey: Integer; nTargetX, nTargetY:
Integer; TargeTBaseObject: TBaseObject; boLateDelivery: Boolean; var dwDelayTime: LongWord): Boolean;
procedure ClientSetBagOrder(nItemCount: Integer; sData: string);
procedure ClientCatchEvil(EvilObject: TBaseObject; nMakeIndex: Integer);
procedure ClientAddEvilToItem(nWhere: word; nMakeIndex, BottleIndex: Integer);
procedure ClientAddAntiEvilPower(nWhere: word; nMakeIndex, nAntiEvilItem: Integer);
function GetEvilRecByMakeIndex(nItemMakeIndex: Integer): pTEvil;
procedure DelEvilRec(nItemMakeIndex: Integer; DisMem: Boolean = True);
procedure ClientRequest(wIdent: word; nOp, nOpCode: Integer);
procedure ClientEvoluTion(wParam: word; nMainMakeIndex, nAuxMakeIndex, nMakeIndex: Integer);
procedure ClientPetMakeBaby(nMaleMakeIndex, nFemaleMakeIndex: Integer);
procedure ClientUPGradeTreasureBox(nCount: Integer; sBuf: string);
procedure ClientEnlargeTreasureBox();
procedure ClientInjectPowerToTreasureBox(nPoint: Integer);
procedure ClientActivationTreasureBox();
procedure ClientTakeItemToTreasureBox(nItemID: Integer);
procedure ClientTakeItemOutTreasureBox(nItemID: Integer);
function MagDoBatfly(UserMagic: pTUserMagic; nTargetX, nTargetY: Integer): Boolean; //化身蝙蝠、移形换影、遁地
procedure SendPetBagItems;
procedure HorseHide;
procedure PetHide(nMakeIndex: Integer);
procedure SendDelDealItem(UserItem: pTUserItem);
procedure SendAddDealItem(UserItem: pTUserItem);
procedure OpenDealDlg(BaseObject: TBaseObject);
function EatItems(StdItem: pTStdItem): Boolean;
function EatUseItems(nShape: Integer): Boolean;
function DayBright(): byte;
procedure BaseObjectMove(sMAP, sX, sY: string);
function RepairWeapon(): Boolean;
function SuperRepairWeapon(): Boolean;
function SuperRepairUseItems(): Boolean;
function WinLottery(): Boolean;
procedure ChangeServerMakeSlave(SalveInfo: pTSlaveInfo);
function WeaptonMakeLuck(): Boolean;
function PileStones(nX, nY: Integer): Boolean;
procedure MakeMine();
function GetRangeHumanCount(): Integer;
procedure GetStartPoint();
procedure MobPlace(sX, sY, sMonName, sCount: string);
function PetDoShopCanSellCount: Integer; //计算豹子能摆摊几个物品
procedure LogonTimcCost;
procedure QuerySubAbility;
procedure SendNotice();
procedure SendLogon();
function CheckUserItemTimeOut(UserItem: pTUserItem; StdItem: pTStdItem): Boolean;
function IsGotoLabel(sMapName: string; nX, nY, nRange, nQuestFalgStatus: Integer;
boQuestFalgStatus: Boolean; sItemName1, sItemName2: string; boNeedGroup: Boolean; nRandomCount: Integer): Boolean;
procedure StartMapEventOfDropItem(sItemName: string);
procedure StartMapEventOfPickUpItem(sItemName: string);
procedure StartMapEventOfMine();
procedure StartMapEventOfWalk();
procedure StartMapEventOfRun();
procedure StartMapEventOfButch();
{客户端操作}
function CheckCanOperate(Action: TClientAction; nKey: Integer = 0): Boolean;
procedure ClientQueryUserName(Target: TBaseObject; X, Y: Integer);
procedure ClientRequestPetDoShop(); //请求摆摊
procedure ClientDoShop(shopItemCount: word; sMsg: string);
procedure ClientPetDoShop(nPet: Integer; shopItemCount: word; sMsg: string);
procedure ClientGetbackPetShopItem();
procedure ClientGetbackPetMoney();
procedure ClientUpdatePetShop(nPet: Integer; nOpCode: Integer; sMsg: string);
procedure ClientPetStopDoShop(); //宠物收摊
procedure ClientPersonalSet(Parm1, Parm2, Parm3: Word; sMsg: string);
procedure ClientStorageItemToPetBag(nItemIdx: Integer);
procedure ClientOpenHuanjing(nItemIdx: Integer; nOpCode: Integer; nCount: Integer);
procedure ClientEvilOp(nOpCode: Integer; nEvilMonID: Integer; nMakeIndex: Integer);
procedure ClientErnie(nOpCode: word);
procedure ClientTakebackPetItem(nItemIdx: Integer);
function ClientOpPneumaBagItem(sData: string): Boolean;
function ClientOpPneumaGold(sData: string): Boolean;
procedure ClientFelementOrderFlag(nMakeIndex, nMon: Integer);
procedure ClientReCallGuarder(nMakeIndex, nX, nY: Integer);
procedure ClientCreateSoul(nParm1, nParm2, nParm3: Integer);
procedure ClientPhoenixSearch(nPetItem, nParm2: Integer);
procedure ClientAllotGuildGold(sName: string; nGold: Integer);
procedure ClientCtrlMental(wOpCode: word);
procedure ClientTakeOnTigerItem(nWhere, nMakeIndex: Integer);
procedure ClientTakeOffTigerItem(nWhere, nMakeIndex: Integer);
procedure ClientTakeOnInosculatePneumaItem(nWhere, nMakeIndex: Integer);
procedure ClientTakeOffInosculatePneumaItem(nWhere, nMakeIndex: Integer);
procedure ClientTakeOnPetSoulItem(nWhere, nMakeIndex: Integer; wIndex: word);
procedure ClientTakeOffPetSoulItem(nWhere, nMakeIndex: Integer; wIndex: word);
procedure ClientDECOMPOSE(nParam, nMakeIndex: Integer);
procedure ClientGEMREMOVE(nWhere, nMakeIndex: Integer);
procedure ClientYiWangDan(nMakeIndex: Integer; sSkillName: string);
procedure SendUseitems();
procedure SendUseMagic();
procedure SendSaveItemList(nBaseObject: Integer; boFast: Boolean);
procedure SendDelItemList(ItemList: TStringList);
procedure SendAdjustBonus();
procedure SendChangeGuildName();
procedure ShowMapInfo(sMAP, sX, sY: string);
procedure ReadAllBook;
function CheckItemsNeed(StdItem: pTStdItem): Boolean;
function CheckItemBindUse(UserItem: pTUserItem): Boolean;
function CheckActionStatus(wIdent: word; var dwDelayTime: LongWord): Boolean;
procedure RecalcAdjusBonus;
procedure RecalcAdditionalAbil;
procedure RecalcAddInosculatePneumaAbil;
procedure RecalcAddProvisionalAbil;
procedure RecalcAddPetAbil;
procedure RecalcPetSoulAbilitys;
procedure CheckMarry();
procedure CheckMaster();
procedure ProcessClientPassword(ProcessMsg: pTProcessMessage);
function CheckDenyLogon: Boolean;
procedure ProcessSpiritSuite;
function HorseRunTo(btDir: byte; boFlag: Boolean): Boolean;
procedure SendTaskList;
procedure ClientQueryBaoshi;
procedure ClientSendBlessMsg(NPC: Integer; MsgFlag: Integer; sMsg: string);
procedure ClientGemSmelt(nState: Integer; RedBaoshi, BlueBaoshi, GreenBaoshi: Integer; sItems: string);
procedure ClientGemItems(NPC: Integer; nType: Integer; nItemCount: Integer; nState: Integer; sData: string);
procedure ClientRefineItems(nType: Integer; nItemIdx, nItemIdx2: Integer; sData: string);
procedure ClientOriginalStoneSmelt(nItemIdx, nType, nState: Integer; sData: string);
procedure ClientEntopticSmelt(nState: Integer; sData: string);
procedure ClientfuseequipItem(nState: Integer; nItemIdx, nItemIdx2: Integer; sData: string);
procedure ChangePneumaState;
procedure MakeFlagOwner(nflagType: Integer; ItemIdx: Integer; nX, nY: Integer; sData: string);
procedure AddFlagComment(nflagType: Integer; NPCID: Integer; nMsgLen: Integer; sMsg: string);
procedure ClickQueryMsg(NPCID: Integer; btnid: Integer);
procedure GetTreasureBoxItem(wParam: word; nParam1, nParam2, nParam3: Integer; sMsg: string);
procedure SendNearbyGuildMemberList();
procedure ClientAskForGuildOfficial(nRankNo: Integer; sData: string);
procedure ClientGuildOfficial(nCode, nRankNo: Integer; sChiefName: string);
procedure SendTreasurePavilion();
procedure SendNonSuchPavilion(nSerial: Integer);
procedure ClientCallTiger();
procedure ClientSetTigerTarget(nMonID, nOp, nX, nY: Integer);
procedure ClientQueryMapLotusInfo();
function ClientTakeOnEntopticItems(btWhere: byte; nItemIdx: Integer): Boolean; //装备元神内视装备
function ClientTakeOffEntopticItems(btWhere: byte; nItemIdx: Integer): Boolean; //取下元神内视装备
function ClientIllumeHeartPoint(btWhere, btPlace: byte): Boolean; //点亮心命点
procedure SendHeartFatePoint();
procedure SendEntopticItems();
procedure ClientQueryGuildClanList();
procedure ClientClanOperate(nOpCode: Integer; sMsg: string);
procedure ClientClanReQuery(nOpCode: Integer; sMsg: string);
procedure MagFieryDragonRun();
procedure ClientCatapultAttackTarget(nOpCode, nX, nY: Integer);
procedure ClientQueryPetSoulInfo; //发送魂佑灵兽信息
procedure ClientQueryPetSoulItem(nMakeIndex: Integer; wIndex: word); //查询魂佑灵兽装备
procedure ClientMagOfPetBeast(nMakeIndex: Integer);
procedure ClientCheckVerifyCode(sVerifyCode: string; boOutTime: Boolean = False);
procedure ClientQueryAbility();
protected
procedure RecalcAbilitysEx(); override;
public
m_boInNonSuchPavilion: Boolean;
procedure CheckPackPetShop();
procedure ClientClickNPC(NPC: Integer);
procedure SendMapDescription();
procedure SendBagItemsPetInfo();
procedure SendPetAttribute(PlayObject: TPlayObject; btWhere: byte; UserItem: pTUserItem); //发送灵兽石附加属性
procedure SendAddPetSoulInfo(nMakeIndex: Integer);
procedure SendGuildTowerInfo();
procedure SendGuildTowerRes();
procedure RecalcTowerAbility();
procedure SendTigerInfo();
procedure RecalcTigerLevelAbilitys;
procedure RecalcTigerAbility();
procedure TigerDefendMaster(var nDamage: Integer);
procedure TigerTransferDamage(var nDamage: Integer);
procedure SlaveTransferDamage(var nDamage: Integer);
procedure BaoBaoTransferDamage(var nDamage: Integer); //宝宝斗转
procedure PneumaLogin;
procedure PetShow(nMakeIndex: Integer);
function CancelGroup(): Boolean;
procedure ClientQueryTreasureBoxItems(const boSend: Boolean = True);
procedure ClientReCallTiger();
procedure ClientSwitchPneuma();
procedure ClientInosculatePneuma();
procedure ClientQueryMentalAbilitys(PlayObject: TPlayObject);
procedure ClientBuyShopItem(Play: TBaseObject; sItemName: string; nInt: Integer);
procedure RecalcMentalLevelAbilitys;
procedure SendWenPeiJH(); //发送纹佩精华
procedure ClientAchievementSystem(boWenPei: Boolean = False); //成就系统
procedure RecalcPerHealthSpell(); override;
procedure ClientMakeWenPei(btZW, btJW, btDW, btBW: byte); //制做纹佩
procedure ClientGetWenPeiDemand(nMakeIndex, nCode: Integer);
procedure ClientTakeWenPei(nMakeIndex, nCode: Integer); //强化 或 拆解 纹佩
procedure ClientCollectSuits(nCJIdx, nCount: Integer; sData: string); //成就之收集套装
procedure ClientPetEquipUp(nPetItemIdx, nStoreItemIdx: Integer; sData: string); //升级灵兽装备
function TrainingPetSkill(const StdItem: pTStdItem): Boolean; //学习灵兽抵抗技能
procedure RecalcAddSuiteAbil(Idx: Integer; boPercent: Boolean);
public
constructor Create(); override;
destructor Destroy; override;
procedure ClearUp(btFree: Boolean = False); override;
procedure SendSocket(DefMsg: pTDefaultMessage; sMsg: string); override;
procedure SendDefMessage(wIdent: word; nRecog: Integer; nParam, nTag, nSeries: word; sMsg: string; boEn: Boolean = False); override;
procedure SendFiendList(const b: ShortInt = -1);
procedure SearchViewRange(); override;
procedure OnEnvirnomentChanged(OldEnvir: TEnvirnoment; boChanged: Boolean = True); override;
procedure PKDie(PlayObject: TPlayObject);
procedure CreatePneumaEnd(btFlag: Integer; sNewName: string; nSex, btHumKind: byte);
procedure GameTimeChanged();
procedure RunNotice();
//AI动作
function gotopoint(smapName: string;nx,ny:integer): Boolean;
function WalkToNext(nX, nY: Integer): Boolean;
function RunToNext(nX, nY: Integer): Boolean;
procedure Stop;
function GetBagItemCount(sItemName: string): Integer;
function Think(): Boolean;
procedure GotoTargetXYRange();
function GotoNextOne(nX, nY: Integer; boRun: Boolean): Boolean;
function GetMagicSpell(UserMagic: pTUserMagic): Integer;
procedure Attack(TargeTBaseObject: TBaseObject; nDir: Integer); overload;
function actAttackTarget(): Boolean;
procedure GotoTargetXY;
procedure SetTargetXY(nX, nY: Integer); virtual; //FFF0
function CheckTargetXYCount(nX, nY, nRange: Integer): Integer;
function CheckTargetXYCountOfDirection(nX, nY, nDir, nRange: Integer): Integer;
function AutoAvoid(): Boolean;
function canatackTarget(BaseObject:TBaseObject): Boolean;
procedure UpdatenoatcktActors(BaseObject: TBaseObject);
procedure Wondering();
procedure SearchTarget;
function GetMyStatus(): Integer;
procedure MoveToHome();
procedure MoveToHomeRandom();
procedure SendAddMagic(UserMagic: pTUserMagic);
procedure SendDelMagic(UserMagic: pTUserMagic);
procedure SendAddItem(UserItem: pTUserItem); override;
procedure SendAddPetItem(UserItem: pTUserItem);
procedure SendDelItems(UserItem: pTUserItem); override;
procedure Whisper(whostr, saystr: string; nType: Integer = 1);
function ClientPickUpItem(nX, nY, nType: Integer): Boolean;
function IsBlockWhisper(sName: string): Boolean;
function QuestCheckItem(sItemName: string; var nCount: Integer; var nParam:
Integer; var nDura: Integer): pTUserItem;
function QuestCheckItemEx(sItemName: string; nDura: Integer; boParam: Boolean): Integer;
function QuestCheckItemX(sItemName: string; var nCount: Integer; var nParam:
Integer; var nDura: Integer): pTUserItem;
function GetCheckItemValue(nMakeIndex: Integer; sName: string): string;
function GetItemValueSum(sItemName: string; sValName: string): Integer;
function GetItemCountWithValue(sItemName: string; sValName: string; nValue: Integer): Integer;
function QuestTakeCheckItem(CheckItem: pTUserItem): Boolean;
procedure GainExp(dwExp: LongWord; dwMilitaryExp: LongWord; dwRepressDemonExp: LongWord);
function GetExploit(PlayObject: TBaseObject): Boolean;
function GetBeadExp(): Boolean;
function GetWingExp(): Boolean;
procedure GetExp(nExp: UInt64; nMilitaryExp: UInt64; nRepressDemon: UInt64; bScritpExp: Boolean = False; boShareMilitaryExp: Boolean = False; boShareRepressDemon: Boolean = False);
procedure GetExpProc(nGetExp: UInt64; nGetMilitaryExp: UInt64; nGetRepressDemonExP: UInt64; bScritpExp: Boolean = False);
procedure WinExp(nExp: UInt64; nMilitaryExp: UInt64; nRepressDemonExp: UInt64);
procedure ClientGuildMemberList();
procedure Run(); override;
function Operate(ProcessMsg: pTProcessMessage): Boolean; override;
procedure SendStruckMsg(wIdent: word; BaseObject, Attacker: TBaseObject; nDamage: Integer; wEffect: word);
procedure RecalcAbilitys(boAction: Boolean = False); override;
procedure DealCancel();
procedure DealCancelA();
function GetShowName(): string; override;
procedure GetBackDealItems();
procedure Disappear(); override;
procedure GoldChange(sChrName: string; nGold: Integer);
procedure ProcessUserLineMsg(sData: string; MsgType: word);
procedure ProcessSayMsg(sData: string; nMsgType: Integer); override;
procedure ClearStatusTime();
procedure UserLogon(); virtual;
procedure RefRankInfo(nRankNo: Integer; sRankName: string);
procedure RefUserState;
procedure SendGroupMembers();
procedure JoinGroup(PlayObject: TPlayObject);
function GeTBaseObjectInfo(): string;
function GetHitMsgCount(): Integer;
function GetSpellMsgCount(): Integer;
function GetWalkMsgCount(): Integer;
function GetRunMsgCount(): Integer;
function GetTurnMsgCount(): Integer;
function GetSiteDownMsgCount(): Integer;
function GetDigUpMsgCount(): Integer;
procedure SetScriptLabel(sLabel: string);
procedure GetScriptLabel(sMsg: string; boLeft: Boolean);
procedure SendScriptItemPic(sMsg: string; nParam: Integer);
function LableIsCanJmp(sLabel: string; boLeft: Boolean): Boolean;
function GetMyInfo(): string;
procedure MakeGhost; override;
procedure ScatterBagItems(ItemOfCreat: TBaseObject); override;
procedure DropUseItems(BaseObject: TBaseObject; AttackBaseObject: TBaseObject = nil); override;
function RecallHuman(sHumName: string; wRecallType: word): Boolean;
procedure CancelDoShop;
procedure UPGRADEMON(nType: Integer);
procedure ReQuestGuildWar(sGuildName: string; WarTime: Integer = 0);
procedure SendUpdateItem(UserItem: pTUserItem; boDelay: Boolean = True); override;
procedure AddEvilToItemB(nWhere: word; nMakeIndex, BottleIndex: Integer);
procedure ReleaseEvil(nMakeIndex: Integer);
procedure GetBagUseItems(var btDc: byte; var btSc: byte; var btMc: byte; var btDura: byte);
procedure CmdEndGuild();
procedure CmdMemberFunction(sCmd, sParam: string);
procedure CmdMemberFunctionEx(sCmd, sParam: string);
procedure CmdSearchDear(sCmd, sParam: string);
procedure CmdSearchMaster(sCmd, sParam: string);
procedure CmdDearRecall(sCmd, sParam: string);
procedure CmdMasterRecall(sCmd, sParam: string);
procedure CmdFriendRecall(sCmd, sParam: string);
procedure CmdSbkDoorControl(sCmd, sParam: string);
procedure CmdClearBagItem(Cmd: pTGameCmd; sHumanName: string);
procedure CmdShowUseItemInfo(Cmd: pTGameCmd; sHumanName: string);
procedure CmdBindUseItem(Cmd: pTGameCmd; sHumanName, sItem, sType: string);
procedure CmdUnBindUseItem(Cmd: pTGameCmd; sHumanName, sItem, sType: string);
procedure CmdLockLogin(Cmd: pTGameCmd);
procedure CmdViewDiary(sCmd: string; nFlag: Integer);
procedure CmdUserMoveXY(sCmd, sX, sY: string);
procedure CmdSearchHuman(sCmd, sHumanName: string);
procedure CmdGroupRecall(sCmd: string; AllRecall: Boolean = False);
procedure CmdAllowGroupReCall(sCmd, sParam: string);
procedure CmdGuildRecall(sCmd, sParam: string);
procedure CmdChangeAttackMode(nMode: Integer);
procedure CmdChangeSalveStatus();
procedure CmdChangeTigerStatus;
procedure CmdTakeOnHorse(sCmd, sParam: string);
procedure CmdTakeOffHorse(sCmd, sParam: string);
procedure CmdPrvMsg(sCmd: string; nPermission: Integer; sHumanName: string);
procedure CmdHumanLocal(Cmd: pTGameCmd; sHumanName: string);
procedure CmdMapMove(Cmd: pTGameCmd; sMapName: string);
procedure CmdPositionMove(Cmd: pTGameCmd; sMapName, sX, sY: string);
procedure CmdHumanInfo(Cmd: pTGameCmd; sHumanName: string);
procedure CmdReLoadAdmin(sCmd: string);
procedure CmdReloadNpc(sParam: string);
procedure CmdReloadManage(Cmd: pTGameCmd; sParam: string);
procedure CmdReloadRobotManage;
procedure CmdReloadRobot;
procedure CmdReloadMonItems();
procedure CmdAdjustExp(human: TPlayObject; nExp: Integer);
procedure CmdAddGuild(Cmd: pTGameCmd; sGuildName, sGuildChief: string);
procedure CmdDelGuild(Cmd: pTGameCmd; sGuildName: string);
procedure CmdGuildWar(sCmd, sGuildName: string);
procedure CmdChangeSabukLord(Cmd: pTGameCmd; sCASTLENAME, sGuildName: string; boFlag: Boolean);
procedure CmdForcedWallconquestWar(Cmd: pTGameCmd; sCASTLENAME: string);
procedure CmdOPTraining(sHumanName, sSkillName: string; nLevel: Integer);
procedure CmdOPDeleteSkill(sHumanName, sSkillName: string);
procedure CmdReloadGuildAll();
procedure CmdReAlive(Cmd: pTGameCmd; sHumanName: string);
procedure CmdAdjuestLevel(Cmd: pTGameCmd; sHumanName: string; nLevel: Integer);
procedure CmdAdjuestExp(Cmd: pTGameCmd; sHumanName, sExp: string);
procedure CmdBackStep(sCmd: string; nType, nCount: Integer);
procedure CmdFreePenalty(Cmd: pTGameCmd; sHumanName: string);
procedure CmdPKpoint(Cmd: pTGameCmd; sHumanName: string);
procedure CmdIncPkPoint(Cmd: pTGameCmd; sHumanName: string; nPoint: Integer);
procedure CmdHunger(sCmd, sHumanName: string; nHungerPoint: Integer);
procedure CmdHair(Cmd: pTGameCmd; sHumanName: string; nHair: Integer);
procedure CmdTrainingSkill(Cmd: pTGameCmd; sHumanName, sSkillName: string; nLevel: Integer);
procedure CmdTrainingMagic(Cmd: pTGameCmd; sHumanName, sSkillName: string; nLevel: Integer);
procedure CmdDelSkill(Cmd: pTGameCmd; sHumanName, sSkillName: string);
procedure CmdDeleteItem(Cmd: pTGameCmd; sHumanName, sItemName: string; nCount: Integer);
procedure CmdClearMission(Cmd: pTGameCmd; sHumanName: string);
procedure CmdTraining(sSkillName: string; nLevel: Integer);
procedure CmdChangeJob(Cmd: pTGameCmd; sHumanName, sJobName: string);
procedure CmdChangeGender(Cmd: pTGameCmd; sHumanName, sSex: string);
procedure CmdMission(Cmd: pTGameCmd; sX, sY: string);
procedure CmdMobPlace(Cmd: pTGameCmd; sX, sY, sMonName, sCount: string);
procedure CmdMobLevel(Cmd: pTGameCmd; Param: string);
procedure CmdMobCount(Cmd: pTGameCmd; sMapName: string);
procedure CmdHumanCount(Cmd: pTGameCmd; sMapName: string);
procedure CmdDisableFilter(sCmd, sParam1: string);
procedure CmdChangeUserFull(sCmd, sUserCount: string);
procedure CmdChangeZenFastStep(sCmd, sFastStep: string);
procedure CmdReconnection(sCmd, sIPaddr, sPort: string);
procedure CmdContestPoint(Cmd: pTGameCmd; sGuildName: string);
procedure CmdStartContest(Cmd: pTGameCmd; sParam1: string);
procedure CmdEndContest(Cmd: pTGameCmd; sParam1: string);
procedure CmdAnnouncement(Cmd: pTGameCmd; sGuildName: string);
procedure CmdKill(Cmd: pTGameCmd; sHumanName: string);
procedure CmdMakeItem(Cmd: pTGameCmd; sItemName: string; nCount: Integer);
procedure CmdSmakeItem(Cmd: pTGameCmd; nWhere, nValueType: Integer; sOpCode: string; nValue: Integer);
procedure CmdBonuPoint(Cmd: pTGameCmd; sHumName: string; nCount: Integer);
procedure CmdDelBonuPoint(Cmd: pTGameCmd; sHumName: string);
procedure CmdRestBonuPoint(Cmd: pTGameCmd; sHumName: string);
procedure CmdFireBurn(nInt, nTime, nn: Integer);
procedure CmdTestFire(sCmd: string; nRange, nType, nTime, nPoint: Integer);
procedure CmdTestStatus(sCmd: string; nType, nTime: Integer);
procedure CmdDelGold(Cmd: pTGameCmd; sHumName: string; nCount: Integer);
procedure CmdAddGold(Cmd: pTGameCmd; sHumName: string; nCount: Integer);
procedure CmdGameGold(Cmd: pTGameCmd; sHumanName: string; sCtr: string; nGold: Integer);
procedure CmdGamePoint(Cmd: pTGameCmd; sHumanName: string; sCtr: string; nPoint: Integer);
procedure CmdBindGold(Cmd: pTGameCmd; sHumanName: string; sCtr: string; nGold: Integer);
procedure CmdBindGameGold(Cmd: pTGameCmd; sHumanName: string; sCtr: string; nGold: Integer);
procedure CmdCreditPoint(Cmd: pTGameCmd; sHumanName: string; sCtr: string; nPoint: Integer);
procedure CmdMob(Cmd: pTGameCmd; sMonName: string; nCount, nLevel: Integer; sShowName: string);
procedure CmdRefineWeapon(Cmd: pTGameCmd; nDc, nMc, nSc, nHit: Integer);
procedure CmdRecallMob(Cmd: pTGameCmd; sMonName: string; nCount, nLevel, nAutoChangeColor, nFixColor: Integer);
procedure CmdLuckPoint(sCmd: string; nPermission: Integer; sHumanName, sCtr, sPoint: string);
procedure CmdLotteryTicket(sCmd: string; nPermission: Integer; sParam1: string);
procedure CmdReloadGuild(sCmd: string; nPermission: Integer; sParam1: string);
procedure CmdReloadLineNotice(sCmd: string; nPermission: Integer; sParam1: string);
procedure CmdReloadAbuse(sCmd: string; nPermission: Integer; sParam1: string);
procedure CmdMobNpc(sCmd: string; nPermission: Integer; sParam1, sParam2, sParam3, sParam4: string);
procedure CmdNpcScript(sCmd: string; nPermission: Integer; sParam1, sParam2, sParam3: string);
procedure CmdDelNpc(sCmd: string; nPermission: Integer; sParam1: string);
procedure CmdKickHuman(Cmd: pTGameCmd; sHumName: string);
procedure CmdTing(Cmd: pTGameCmd; sHumanName: string);
procedure CmdSuperTing(Cmd: pTGameCmd; sHumanName, sRange: string);
procedure CmdMapMoveHuman(Cmd: pTGameCmd; sSrcMap, sDenMap: string);
procedure CmdShutup(Cmd: pTGameCmd; sHumanName, sTime: string);
procedure CmdShowMapInfo(Cmd: pTGameCmd; sParam1: string);
procedure CmdShutupRelease(Cmd: pTGameCmd; sHumanName: string; boAll: Boolean);
procedure CmdShutupList(Cmd: pTGameCmd; sParam1: string);
procedure CmdShowSbkGold(Cmd: pTGameCmd; sCASTLENAME, sCtr, sGold: string);
procedure CmdRecallHuman(Cmd: pTGameCmd; sHumanName: string);
procedure CmdReGotoHuman(Cmd: pTGameCmd; sHumanName: string);
procedure CmdShowHumanFlag(sCmd: string; nPermission: Integer; sHumanName, sFlag: string);
procedure CmdShowHumanUnitOpen(sCmd: string; nPermission: Integer; sHumanName, sUnit: string);
procedure CmdShowHumanUnit(sCmd: string; nPermission: Integer; sHumanName, sUnit: string);
procedure CmdChangeAdminMode(sCmd: string; nPermission: Integer; sParam1: string; boFlag: Boolean);
procedure CmdChangeObMode(sCmd: string; nPermission: Integer; sParam1: string; boFlag: Boolean);
procedure CmdChangeSuperManMode(sCmd: string; nPermission: Integer; sParam1: string; boFlag: Boolean);
procedure CmdChangeLevel(Cmd: pTGameCmd; sParam1: string);
procedure CmdChangeDearName(Cmd: pTGameCmd; sHumanName: string; sDearName: string);
procedure CmdChangeMasterName(Cmd: pTGameCmd; sHumanName: string; sMasterName, sIsMaster: string);
procedure ChangeMasterName(sHumanName, sMasterName: string; boMaster: Boolean);
procedure CmdStartQuest(Cmd: pTGameCmd; sQuestName, sMapName: string);
procedure CmdSetPermission(Cmd: pTGameCmd; sHumanName, sPermission: string);
procedure CmdClearMapMonster(Cmd: pTGameCmd; sMapName, sMonName, sItems, sGhost: string);
procedure CmdReNewLevel(Cmd: pTGameCmd; sHumanName, sLevel: string);
procedure CmdDenyIPaddrLogon(Cmd: pTGameCmd; sIPaddr, sFixDeny: string);
procedure CmdDelDenyIPaddrLogon(Cmd: pTGameCmd; sIPaddr, sFixDeny: string);
procedure CmdShowDenyIPaddrLogon(Cmd: pTGameCmd; sIPaddr, sFixDeny: string);
procedure CmdDenyAccountLogon(Cmd: pTGameCmd; sAccount, sFixDeny: string);
procedure CmdDelDenyAccountLogon(Cmd: pTGameCmd; sAccount, sFixDeny: string);
procedure CmdShowDenyAccountLogon(Cmd: pTGameCmd; sAccount, sFixDeny: string);
procedure CmdDenyCharNameLogon(Cmd: pTGameCmd; sCharName, sFixDeny: string);
procedure CmdDelDenyCharNameLogon(Cmd: pTGameCmd; sCharName, sFixDeny: string);
procedure CmdShowDenyCharNameLogon(Cmd: pTGameCmd; sCharName, sFixDeny: string);
procedure CmdViewWhisper(Cmd: pTGameCmd; sCharName, sParam2: string);
procedure CmdSpirtStart(sCmd: string; sParam1: string);
procedure CmdSpirtStop(sCmd: string; sParam1: string);
procedure CmdSetMapMode(sCmd: string; sMapName, sMapMode, sParam1, sParam2: string);
procedure CmdShowMapMode(sCmd: string; sMapName: string);
procedure CmdClearHumanPassword(sCmd: string; nPermission: Integer; sHumanName: string);
procedure CmdChangeItemName(sCmd, sMakeIndex, sItemIndex, sItemName: string);
procedure CmdDisableSendMsg(Cmd: pTGameCmd; sHumanName: string);
procedure CmdEnableSendMsg(Cmd: pTGameCmd; sHumanName: string);
procedure CmdDisableSendMsgList(Cmd: pTGameCmd);
procedure CmdTestGetBagItems(Cmd: pTGameCmd; sParam: string);
procedure CmdMobFireBurn(Cmd: pTGameCmd; sMAP, sX, sY, sType, sTime, sPoint: string);
procedure CmdTestSpeedMode(Cmd: pTGameCmd; nWhere, nType: Integer);
function ProcessUserCmd(sCmd, sParam1, sParam2, sParam3, sParam4, sParam5, sParam6, sParam7: string): Boolean;
function ExecuteScript(ScriptObj: TObject; sLabel: string): Boolean; override;
function GetTaskVal(const TaskID: Integer; ValID: Integer): Integer;
function GetTaskStr(const TaskID: Integer; ValID: Integer): string;
function GetColorTaskCount(): Integer;
function GetTaskStep(const TaskID: Integer): Integer;
function UpdateTaskStep(const TaskID: Integer; nStep: Integer): Integer;
procedure RefreshTask(const TaskID, nStep: Integer);
procedure SendColorTask(const TaskID, Color: Integer);
procedure ClientDelTask(const TaskID: Integer);
procedure ClientQueryEvilFollower;
procedure ClearEvilFollower(nCode: Integer);
function CheckMapRideOn(Envir: TEnvirnoment): Boolean;
procedure DelPneuma(nIdx: Integer);
procedure DelPneumaEnd(nIdx, btSex, btCount: byte);
procedure TakeItemOn(sItemName: string; btWhere: Integer);
procedure SendMagic_LvExp_Msg(const UserMagic: pTUserMagic; dwDelay: LongWord); override;
procedure SendShopItems(BaseObject: TBaseObject; opcode: word); override;
procedure SendShopResult(); override;
function IsShop(): Boolean; override; //是否摆摊
procedure GetUserShop(const pUserShop: PTUserShop); override; //取摆摊状态
function GetPetSoulItem(const nMakeIndex: Integer; boNew: Boolean = False): pTPetSoulItem; //取一个魂佑装备位
function GetAchievementInfo(const wIndex: word): PTAchievementInfo;
procedure SendBroadVehicle(btCreatorType: Byte; VehicleExp: TVehicleExp);
procedure SendWishAwardInfo();
published
property m_nPetShopSize: Integer read PetDoShopCanSellCount;
end;
implementation
uses
Math, WolShare, Guild, HUtil32, ObjNpc, IdSrvClient, ItmUnit, Event, ObjMon, RandomEngine, aiplayer,
LocalDB, Castle, svMain, Magic, ObjMon3, ObjGoblin, EnvirMirror;
{ TPlayObject }
constructor TPlayObject.Create; //004C9860
begin
inherited;
m_DelayCall := TList.Create;
m_MasterList := TList.Create;
//跑位魔法间隔
m_DynamicVarList := TList.Create;
m_ArrowList := TStringList.Create;
m_PetSoulItemsList := TList.Create;
m_CustomTableList := TList.Create;
m_AchievementList := TList.Create;
m_KnockEggList := TList.Create;
m_CheckCondition := TList.Create;
end;
destructor TPlayObject.Destroy; //004C9B54
var
i, nCheckCode : Integer;
resourcestring
sExceptionMsg = '[Exception] TPlayObject::Destroy Code:=%d';
begin
nCheckCode := 0;
try
//清空
ClearFree;
nCheckCode := 1;
m_MasterList.free;
nCheckCode := 2;
m_DynamicVarList.free;
nCheckCode := 3;
m_DelayCall.free;
nCheckCode := 4;
m_ArrowList.free;
m_PetSoulItemsList.free;
FreeAndNil(m_CustomTableList);
FreeAndNil(m_AchievementList);
FreeAndNil(m_KnockEggList);
FreeAndNil(m_CheckCondition);
except
on E: Exception do begin
MainOutMessage(Format(sExceptionMsg, [nCheckCode]));
MainOutMessage(E.Message);
end;
end;
inherited;
end;
procedure TPlayObject.ClearUp(btFree: Boolean = False);
begin
inherited ClearUp(btFree);
m_btRaceServer := RC_PLAYOBJECT;
m_boEmergencyClose := False;
m_boSwitchData := False;
m_boReconnection := False;
m_boKickUserSessInfo := False;
m_boBagSend := False;
m_boKickFlag := False;
m_boSoftClose := False;
m_boReadyRun := False;
// bo698 := False;
m_dwHuanjingTick := GetTickCount;
m_nAnserIdx := -1;
// n69C := 0;
m_nHuanjingIdx := 0;
m_dwSaveRcdTick := GetTickCount();
m_boWantRefMsg := True;
m_boRcdSaved := False;
m_boDieInFight3Zone := False;
m_boTimeRecall := False;
m_sMoveMap := '';
m_nMoveX := 0;
m_nMoveY := 0;
m_dwRunTick := 0; //最后处理人物消息时间
m_nRunTime := 100; //处理人物消息间隔 延时设置
m_dwSearchTime := 1000;
m_dwSearchTick := 0;
m_nViewRange := 12;
m_boNewHuman := False;
m_boLoginNoticeOK := False;
// bo6AB := False;
m_boSendNotice := False;
m_boRideOn := False;
m_boRideFightOn := False;
m_btHorseType := 0;
m_Horse := nil;
m_Pet := nil;
m_PackPet := nil;
FillChar(m_PetInfo, SizeOf(m_PetInfo), #0);
m_dwPneumaChangeTick := 0;
m_dwDoMotaeboMoveTick := GetTickCount();
m_dwEatTalismanTick := 0;
m_dwCheckDupObjTick := GetTickCount();
dwTick578 := GetTickCount();
m_boInSafeArea := False;
m_boInSafezone := False;
m_dwCheckSafeArea := GetTickCount();
m_dwMagicAttackTick := GetTickCount();
m_dwMagicAttackInterval := 0;
m_dwAttackTick := GetTickCount();
m_dwMoveTick := GetTickCount();
m_dwTurnTick := GetTickCount();
m_dwActionTick := GetTickCount();
m_dwAttackCount := 0;
m_dwAttackCountA := 0;
m_dwMagicAttackCount := 0;
m_dwMoveCount := 0;
m_dwMoveCountA := 0;
m_nOverSpeedCount := 0;
m_sOldSayMsg := '';
m_dwSayMsgTick := 0;
m_boDisableSayMsg := False;
m_dwDisableSayMsgTick := GetTickCount();
// n584 := 0;
// n588 := 0;
m_boSwitchData := False;
m_boSwitchDataSended := False;
m_nWriteChgDataErrCount := 0;
m_dwShowLineNoticeTick := GetTickCount();
m_nShowLineNoticeIdx := 0;
m_sMasterName[1] := '';
m_sMasterName[2] := '';
m_sMasterName[3] := '';
m_nKillMonExpRate := 100;
m_wKillMonExpRate := 100;
m_dwKillMonBurstRateTime := 0;
m_dwKillMonExpRateTime := 0;
m_dwRateTick := GetTickCount();
m_dwDecAntvPowerTick := GetTickCount();
m_nPowerRate := 100;
m_dwPowerRateTime := 0;
m_nDefenceRate := 100;
m_dwDefenceRateTime := 0;
m_boSetStoragePwd := False;
m_boReConfigPwd := False;
m_boCheckOldPwd := False;
m_boUnLockPwd := False;
m_boUnLockStoragePwd := False;
m_boPasswordLocked := False; //锁仓库
m_btPwdFailCount := 0;
m_sTempPwd := '';
m_sStoragePwd := '';
m_boFilterSendMsg := False;
m_DearHuman := nil;
m_MasterHuman := nil;
m_sStoreName := '';
m_nStoreMakeIndex := 0;
m_boCanMasterRecall := False;
m_boCanDearRecall := False;
m_dwDearRecallTick := GetTickCount();
m_dwMasterRecallTick := GetTickCount();
m_btReColorIdx := 0;
m_GetWhisperHuman := nil;
m_wContribution := 0;
m_sRankLevelName := g_sRankLevelName;
m_boFixedHideMode := True;
m_boFilterSendMsg := False;
m_boCanDeal := False;
m_boCanDrop := False;
m_boCanGetBackItem := False;
m_boCanWalk := False;
m_boCanRun := False;
m_boCanHit := False;
m_boCanSpell := False;
m_boCanUseItem := False;
m_nClientFlagMode := -1;
m_dwAutoGetExpTick := GetTickCount;
m_nAutoGetExpPoint := 0;
m_AutoGetExpEnvir := nil;
m_dwHitIntervalTime := g_Config.dwHitIntervalTime; //攻击间隔
m_dwMagicHitIntervalTime := g_Config.dwMagicHitIntervalTime; //魔法间隔
m_dwRunIntervalTime := g_Config.dwRunIntervalTime; //走路间隔
m_dwWalkIntervalTime := g_Config.dwWalkIntervalTime; //走路间隔
m_dwTurnIntervalTime := g_Config.dwTurnIntervalTime; //换方向间隔
m_dwActionIntervalTime := g_Config.dwActionIntervalTime; //组合操作间隔
m_dwRunLongHitIntervalTime := g_Config.dwRunLongHitIntervalTime;
//组合操作间隔
m_dwRunHitIntervalTime := g_Config.dwRunHitIntervalTime; //组合操作间隔
m_dwWalkHitIntervalTime := g_Config.dwWalkHitIntervalTime; //组合操作间隔
m_dwRunMagicIntervalTime := g_Config.dwRunMagicIntervalTime;
m_SessInfo := nil;
m_boTestSpeedMode := False;
m_boLockLogon := True;
m_boLockLogoned := False;
m_dwLastPersonalSetTick := GetTickCount - 60000;
m_dwLastRide := GetTickCount() - 3000;
m_dwWalkTick := 0;
m_boStickMode := False;
m_nMaxTaskCount := 10; //最大任务总数
m_nAchievement := 0; //活动任务
m_nTotalTaskCount := 0; //总任务数
m_dwLastBuyShopitemTick := 0;
m_dwNextBannerNoticeTime := GetTickCount;
m_nBannerNoticeIdx := 0;
m_boHideBannerNotice := False;
m_boOfflineGetGamePoint := False;
m_boOfflineResume := False;
m_dwUseStoreTick := 0;
m_wGemCount[0] := 0;
m_wGemCount[1] := 0;
m_wGemCount[2] := 0;
m_wGemCount[3] := 0;
m_wGemCount[4] := 0; //红宝石、蓝宝石、绿宝石数量
m_nRefinePoint := 0;
m_nSpotDlgMode := 0;
m_nPetTargetX := -1;
m_nPetTargetY := -1;
m_sOffLineLabel := '';
m_nRunCount := 0;
m_FirstRunTick := GetTickCount;
m_sHorseName := '';
m_btSetHorseType := 0;
m_dwCallPneumaTick := 0;
m_nEatItemMakeIndex := 0;
m_nRandomGiveStep := 0;
m_nAutoOpenTreasureBox := 0;
m_dwTimerTick := 0;
m_dwTimerLong := 0;
m_sTimerLabel := '';
m_boSafeZoneOnLine := False;
m_boSaveKillMonExpRate := False;
m_btLastOutStatus := 0;
m_sLastMapName := '';
m_nLastCurrX := 0;
m_nLastCurrY := 0;
FillChar(m_Dan, SizeOf(TSoulBabyORDemonDanInfo), #0);
FillChar(m_ProvisionalAbil, SizeOf(TProvisionalAbil), #0);
FillChar(m_dwTimer, SizeOf(m_dwTimer), #0);
m_dwRideFightSkillTick := 0;
m_boInNonSuchPavilion := False;
m_wTotemStatus := 0;
m_boNeedKneel := False;
m_btRulerLevel := 0;
m_boCtrlMental := False;
m_Tiger := nil;
FillChar(m_TorDDM, SizeOf(TTigerORDemonDanMagic), #0);
m_boCreatePneuma := False;
m_pSwitchPneuma := nil;
m_nPneumaLastX := -1;
m_boInosculatePneuma := False;
m_dwInosculateTick := GetTickCount;
m_wCurFightValue := 0; //当前元神战斗值
m_wInnerPneumaLevel := 0; //内部元神战斗值
m_InosculatePneumaHP := 0;
m_InosculatePneumaMP := 0;
m_dwFieryDragonRunTick := 0;
m_sQueryName := '';
m_dwEatItemTick := 0;
m_dwEatDurgHPTick := 0;
m_dwEatDurgMPTick := 0;
m_boUnWater := False;
m_boQueryReLive := False;
FillChar(m_CustomValue, SizeOf(TCustomValue), #0);
FillChar(m_LimitValue, SizeOf(TLimitValue), #0);
m_boCatapultMode := False;
m_boCatapultAttackMode := False;
m_dwCatapultAttackTick := GetTickCount;
m_wCatapultHP := 0;
m_wCatapultMaxHP := 0;
FillChar(m_Shop, SizeOf(TShop), #0);
m_wShopItemCount := 0;
m_wShopKind := 0;
m_btShopBanner := 0;
m_nBannerColor := 0;
m_sMachineid := '';
m_btStorageSize := 39;
m_VersionManage := nil; //客户端版本API控制
FillChar(m_SpiritInfo, SizeOf(TSpiritInfo), #0); //神魂融合信息
m_nAllIncReply := 0;
m_boBeast := False;
FillChar(m_ReduceSkillLevel, SizeOf(m_ReduceSkillLevel), #0);
FillChar(m_ReduceSkillPoint, SizeOf(m_ReduceSkillPoint), #0);
m_ReduceSkillRate := 0;
m_FelementReduce := 0;
m_FelementRedouble := 0;
m_dwWenPeiJH := 0; //纹佩精华
FillChar(m_WenPeiBox, SizeOf(TWenPeiBox), 0); //纹佩宝盒
m_wAchievePoint := 0;
m_nGatherExp := 0;
m_dwGatherExpTick := GetTickCount();
m_wPrenticeCount := 0;
m_boRideDragonMode := False;
m_dwTotalDamage := 0;
m_boOfficerGodWings := False;
m_wCentsOfficerLevel := 0; //仙官等级
m_nCentsOfficerExp := 0; //仙官经验
FillChar(m_VerifyCodeInfo, SizeOf(TVerifyCodeInfo), #0);
m_btComboPoint := 0; //连击点
m_btComboTime := 0; //连击点增加时间
m_btBroilHotStatuTime := 0; //炙热效果
m_btRandomDanceTime := 0;
m_btGodRunTime := 0; //神行
m_nMeatQuality := 0;
FillChar(m_UserConstellation, SizeOf(TUserConstellation), #0);
FillChar(m_GemSourcePow, SizeOf(TGemSourcePow), #0);
FillChar(m_GemLvInfo, SizeOf(TGemLvInfo), #0);
m_boSecretMode := False;
m_sSecretName := '';
m_btSecretDress := 0;
m_btSecretWeapon := 0;
m_btWalkLotus := 0;
m_nBodyLeathery := 0;
m_nSlaveType := 0;
m_boVehicleMaterial := False;
m_boRideOrthrusMode := False;
m_boFirstCarpenter := False; //天下第一匠神
m_boGameManage := False; //显示GM封号
m_boSoaring := False; //显示渡劫飞升封号
m_btKingTitle := 0; //王爵封号
m_btLoverTitle := 0; //情人节封号
m_btColorSkill := 0; //彩色技能
m_btLoverEvents := 0;
m_boBianShen := False;
m_nHiContribution := 0;
m_nCurContribution := 0;
FillChar(m_btSelfCreated, SizeOf(TSelfCreated), #0); //自创材料
FillChar(m_SecretInfo, SizeOf(TSecretInfo), #0);
m_nDreamsType := 0;
m_nKillMonExpLoitRate := 100;
m_dwKillMonExpLoitRateTime := 0;
m_nKillMonRepressDemonRate := 100;
m_dwKillMonRepressDemonRateTime := 0;
FillChar(m_DreamsPass, SizeOf(TDreamsPass), 0);
FillChar(m_ExpeditionBox, SizeOf(TExpeditionBox), #0);
m_MagicOrder := '';
m_btMagicOrder := 0;
m_boComboMagic := false;
m_ConsignClass := 0;
m_GuildOfficial := 0;
m_KnockEggCount := 0;
FillChar(m_HumanDisarm, SizeOf(TDisarmInfo), #0);
FillChar(m_GuildSkill, SizeOf(TGuildManorSkill), #0);
FillChar(m_ScratchCard, SizeOf(TScratchCard), #0);
FillChar(m_VehicleExp, SizeOf(TVehicleExp), #0);
FillChar(m_RedPacket, SizeOf(TRedPacketsInfo), #0);
FillChar(m_ClanInsignia, SizeOf(TClanInsignia), #0);
FillChar(m_ButchItem, SizeOf(TButchItem), #0);
FillChar(m_RepressDemon, SizeOf(TRepressDemon), #0);
FillChar(m_HumWingInfo, SizeOf(THumWingInfo), #0);
FillChar(m_HumEquipsInfo, SizeOf(TRepressDemonEquipsInfo), #0);
m_boRulerhalo := false;
m_boUnSafeZone := False;
m_btDemonMode := 0;
m_btDemonForce := 0;
m_wMasterGeneral := 0;
FillChar(m_HumanDecLucky, SizeOf(TDisarmInfo), #0);
FillChar(m_dwStopMagic, SizeOf(m_dwStopMagic), 0);
FillChar(m_ErgumCount, SizeOf(TErgumCount), 0);
m_DealCreat := nil;
FillChar(m_boSuitSub, SizeOf(m_boSuitSub), 0);
FillChar(m_ExemptHurt, SizeOf(m_ExemptHurt), 0);
if btFree then
ClearFree();
end;
procedure TPlayObject.ClearFree();
var
i, nCheckCode : Integer;
resourcestring
sExceptionMsg = '[Exception] TPlayObject::Destroy Code:=%d';
begin
nCheckCode := 0;
try
nCheckCode := 1;
m_MasterList.Clear;
nCheckCode := 2;
for i := 0 to m_DynamicVarList.Count - 1 do begin
Dispose(pTDynamicVar(m_DynamicVarList.Items[i]));
end;
m_DynamicVarList.Clear;
nCheckCode := 3;
for i := 0 to m_DelayCall.Count - 1 do begin
Dispose(pTDelayCall(m_DelayCall.Items[i]));
end;
m_DelayCall.Clear;
nCheckCode := 4;
for i := 0 to m_ArrowList.Count - 1 do begin
Dispose(pTArrowRec(m_ArrowList.Objects[i]));
end;
m_ArrowList.Clear;
for i := 0 to m_PetSoulItemsList.Count - 1 do begin
Dispose(pTPetSoulItem(m_PetSoulItemsList.Items[i]));
end;
m_PetSoulItemsList.Clear;
if m_pSwitchPneuma <> nil then
Dispose(m_pSwitchPneuma);
m_pSwitchPneuma := nil;
//纹佩宝盒
for i := 0 to m_AchievementList.Count - 1 do begin
Dispose(PTAchievementInfo(m_AchievementList.Items[i]));
end;
m_AchievementList.Clear;
//自定义变量
for i := 0 to m_CustomTableList.Count - 1 do begin
TSQLiteTable(m_CustomTableList.Items[i]).free;
end;
m_CustomTableList.Clear;
if m_KnockEggList.Count > 0 then begin
for I := 0 to m_KnockEggList.Count - 1 do begin
if pTKnockEggItem(m_KnockEggList.Items[i]) <> nil then
Dispose(pTKnockEggItem(m_KnockEggList.Items[i]));
end;
end;
m_KnockEggList.Clear;
if m_CheckCondition.Count > 0 then begin
for I := 0 to m_CheckCondition.Count - 1 do begin
if pTCondition(m_CheckCondition.Items[i]) <> nil then
Dispose(pTCondition(m_CheckCondition.Items[i]));
end;
end;
m_CheckCondition.Clear;
except
on E: Exception do begin
MainOutMessage(Format(sExceptionMsg, [nCheckCode]));
MainOutMessage(E.Message);
end;
end;
end;
//执行消息命令
function TPlayObject.Operate(ProcessMsg: pTProcessMessage): Boolean;
var
CharDescEx : TCharDescEx;
CharDesc : TCharDesc;
UserShop : TUserShop;
nObjCount : Integer;
nArrItem : array[0..2] of Integer;
s1C, sName, sData, sTmp, sGuildName : string;
MessageBodyWL : TMessageBodyWL;
MessageBodyW : TMessageBodyW;
ShortMessage : TShortMessage;
CombineSkillEffect : TCombineSkillEffect;
dwDelayTime : LongWord;
nMsgCount : Integer;
Magic : pTMagic;
i : Integer;
AttackObject : TBaseObject;
NewMagicEff : TNewMagicEff;
HealthEffect : THealthEffect;
MagicEffect : TMagicEffect;
nX, nY, n18, n1C : Integer;
StdItem : pTStdItem;
btShiEld, btRShape : byte;
btType : Byte;
boBindGameGold : Boolean;
ColorItem : TColorItem;
UserItem : pTUserItem;
resourcestring
sHint1 = '神奇的力量凝聚,你的元神分身被唤醒了。';
sHint2 = '目前不能摆摊!!!';
sHint3 = '目前不支持拍卖,请选择原地摆摊';
sHint4 = '神奇的力量散去,你的元神分身开始沉睡。';
sHint5 = '地图对象为空,无法处理地图切换!';
sSpeedExcept = '速度异常 Ident: %d Time: %d';
sOpDelay = '操作延迟 Ident: %d Time: %d';
begin
Result := True;
case ProcessMsg.wIdent of
RM_TURN,
RM_PUSH,
RM_RUSH,
RM_RUSHKUNG,
RM_PUSH_LION: begin
if (ProcessMsg.BaseObject <> nil) and ((TBaseObject(ProcessMsg.BaseObject) <> Self) or (ProcessMsg.wIdent = RM_PUSH) or
(ProcessMsg.wIdent = RM_RUSH) or (ProcessMsg.wIdent = RM_RUSHKUNG) or (ProcessMsg.wIdent = RM_PUSH_LION)) then begin
case ProcessMsg.wIdent of
RM_PUSH:
m_defMsg := MakeDefaultMsg(SM_BACKSTEP,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1 {x},
ProcessMsg.nParam2 {y},
MakeWord(ProcessMsg.wParam {dir},
TBaseObject(ProcessMsg.BaseObject).m_btGender {light}));
RM_RUSH:
m_defMsg := MakeDefaultMsg(SM_RUSH,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.wParam);
RM_RUSHKUNG:
m_defMsg := MakeDefaultMsg(SM_RUSHKUNG,
Integer(ProcessMsg.BaseObject), ProcessMsg.nParam1,
ProcessMsg.nParam2, MakeWord(ProcessMsg.wParam,
TBaseObject(ProcessMsg.BaseObject).m_btGender));
RM_PUSH_LION:
m_defMsg := MakeDefaultMsg(SM_LIONCRSH,
Integer(ProcessMsg.BaseObject), ProcessMsg.nParam1,
ProcessMsg.nParam2, MakeWord(ProcessMsg.wParam,
TBaseObject(ProcessMsg.BaseObject).m_btGender));
else begin
m_defMsg := MakeDefaultMsg(SM_TURN,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1,
ProcessMsg.nParam2,
MakeWord(ProcessMsg.wParam, TBaseObject(ProcessMsg.BaseObject).m_btGender));
end;
end;
if ProcessMsg.wIdent = RM_PUSH_LION then begin
CharDesc.Feature := TBaseObject(ProcessMsg.BaseObject).GetFeature(Self);
CharDesc.Status := TBaseObject(ProcessMsg.BaseObject).m_nCharStatus;
CharDesc.Featurex := ProcessMsg.nParam3;
s1C := EnCodeBuffer(@CharDesc, SizeOf(TCharDesc));
end else begin
CharDescEx.Feature := TBaseObject(ProcessMsg.BaseObject).GetFeature(Self);
CharDescEx.Status := TBaseObject(ProcessMsg.BaseObject).m_nCharStatus;
CharDescEx.Featurex := GetMaxHPCent(TBaseObject(ProcessMsg.BaseObject));
s1C := EnCodeBuffer(@CharDescEx, SizeOf(TCharDescEx));
end;
if (ProcessMsg.wIdent <> RM_PUSH_LION) then begin
if (ProcessMsg.sMsg <> '') then begin
nObjCount := GetCharColor(TBaseObject(ProcessMsg.BaseObject));
sTmp := ProcessMsg.sMsg + '/' + IntToStr(nObjCount) + TBaseObject(ProcessMsg.BaseObject).GetCharTurnMsg;
s1C := s1C + EnCodeBuffer(@sTmp[1], Length(sTmp)); //sTmp[1]不包含字符串长度
end else if ProcessMsg.BaseObject <> nil then begin
if (CheckSPCode(TBaseObject(Self).m_dwRuleCtrlCode, SP_MON_DARKENMONSTER)) or (TBaseObject(ProcessMsg.BaseObject).m_btRaceServer = 23) then begin
nObjCount := GetCharColor(TBaseObject(ProcessMsg.BaseObject));
sTmp := TBaseObject(ProcessMsg.BaseObject).GetShowName() + '/' + IntToStr(nObjCount) + TBaseObject(ProcessMsg.BaseObject).GetCharTurnMsg;
s1C := s1C + EnCodeBuffer(@sTmp[1], Length(sTmp));
end;
end;
end;
SendSocket(@m_defMsg, s1C);
if (ProcessMsg.wIdent = RM_TURN) and (ProcessMsg.sMsg <> '') then begin
if (TBaseObject(ProcessMsg.BaseObject).m_btRaceServer = RC_PLAYOBJECT) then begin
//发送Featur的消息
i := TBaseObject(ProcessMsg.BaseObject).GetFeatureToLong(Self);
m_defMsg := MakeDefaultMsg(SM_FEATURECHANGED,
Integer(ProcessMsg.BaseObject),
LoWord(i),
HiWord(i),
TBaseObject(ProcessMsg.BaseObject).GetGender);
SendSocket(@m_defMsg, TBaseObject(ProcessMsg.BaseObject).GetFeatureChangedMsg());
//金刚护体、风影盾等
if (TBaseObject(ProcessMsg.BaseObject).m_nMagicStatus in [0..255]) then
SendDefMessage(SM_FENGHAO,
Integer(ProcessMsg.BaseObject),
TBaseObject(ProcessMsg.BaseObject).m_nMagicStatus,
TBaseObject(ProcessMsg.BaseObject).m_nCharStatus,
0, '');
//幻彩、幻影套装
if TBaseObject(ProcessMsg.BaseObject).m_wHuancaiSuite > 0 then
SendDefMessage(SM_FENGHAO,
Integer(ProcessMsg.BaseObject),
16,
TBaseObject(ProcessMsg.BaseObject).m_wHuancaiSuite,
0, '');
//发送封号和翅膀
if (TBaseObject(ProcessMsg.BaseObject).m_wExtraLevel > 0) or
(TBaseObject(ProcessMsg.BaseObject).m_btAmbitLevel > 0) then begin
if (TBaseObject(ProcessMsg.BaseObject).m_btRaceServer = RC_PLAYOBJECT) then
SendDefMessage(SM_FENGHAO,
Integer(ProcessMsg.BaseObject),
MakeWord(8, LoByte(TBaseObject(ProcessMsg.BaseObject).m_wExtraLevel)), //元神境界
TBaseObject(ProcessMsg.BaseObject).GetPneumaAmbit,
HiByte(TBaseObject(ProcessMsg.BaseObject).m_wExtraLevel),
TBaseObject(ProcessMsg.BaseObject).GetExtraLevelName)
else if (TBaseObject(ProcessMsg.BaseObject).m_wExtraLevel = 2) then
SendDefMessage(SM_FENGHAO,
Integer(ProcessMsg.BaseObject),
MakeWord(8, _Max(0,
TBaseObject(ProcessMsg.BaseObject).m_wExtraLevel - 1)),
0,
0,
'');
end;
if TBaseObject(ProcessMsg.BaseObject).m_wBianshenAppr <> 0 then begin
SendDefMessage(SM_FENGHAO,
Integer(ProcessMsg.BaseObject),
64,
TBaseObject(ProcessMsg.BaseObject).m_wBianshenImg,
TBaseObject(ProcessMsg.BaseObject).m_wBianshenAppr, '');
end;
//金刚护体,护身真气 绿色血条
if (TBaseObject(ProcessMsg.BaseObject).m_wStatusTimeArr[STATE_HUSHENZHENQI] > 0) then
SendDefMessage(SM_HIDE,
Integer(ProcessMsg.BaseObject),
CalcCent(TBaseObject(ProcessMsg.BaseObject).m_nHushenDura,
TBaseObject(ProcessMsg.BaseObject).m_nHushenDuraMax),
100,
g_HushenLvColor[Min(TBaseObject(ProcessMsg.BaseObject).m_btMagHuShenDefenceLevel, 7)],
'')
else if (TBaseObject(ProcessMsg.BaseObject).m_wStatusTimeArr[STATE_JINGANGHUTI] > 0) then
SendDefMessage(SM_HIDE,
Integer(ProcessMsg.BaseObject),
CalcCent(TBaseObject(ProcessMsg.BaseObject).m_nHushenDura,
TBaseObject(ProcessMsg.BaseObject).m_nHushenDuraMax),
100,
g_HushenLvColor[Min(TBaseObject(ProcessMsg.BaseObject).m_btMagJingangDefenceLevel, 7)],
'');
//融合元神的神魂值
if TBaseObject(ProcessMsg.BaseObject).m_boPneuma and (ProcessMsg.BaseObject is TPlayObject) then begin
if TPlayObject(ProcessMsg.BaseObject).m_boInosculatePneuma and TPlayObject(ProcessMsg.BaseObject).m_SpiritInfo.boMag then begin
if (TPlayObject(ProcessMsg.BaseObject).m_PneumaObject = Self) then begin
m_defMsg := MakeDefaultMsg(SM_SPIRITHP,
Integer(ProcessMsg.BaseObject),
TPlayObject(ProcessMsg.BaseObject).m_SpiritInfo.wCurHP,
TPlayObject(ProcessMsg.BaseObject).m_SpiritInfo.wMaxHP,
0);
end else begin
m_defMsg := MakeDefaultMsg(SM_SPIRITHP,
Integer(ProcessMsg.BaseObject),
CalcCent(TPlayObject(ProcessMsg.BaseObject).m_SpiritInfo.wCurHP,
TPlayObject(ProcessMsg.BaseObject).m_SpiritInfo.wMaxHP),
100,
0);
end;
n18 := 0;
SendSocket(@m_defMsg, EnCodeBuffer(@n18, 2));
end;
end;
//技能效果
m_defMsg := MakeDefaultMsg(SM_CHARSTATUSCHANGED,
Integer(ProcessMsg.BaseObject),
LoWord(TBaseObject(ProcessMsg.BaseObject).m_nCharStatus),
HiWord(TBaseObject(ProcessMsg.BaseObject).m_nCharStatus),
TBaseObject(ProcessMsg.BaseObject).m_nHitSpeed);
SendSocket(@m_defMsg, TBaseObject(ProcessMsg.BaseObject).GetCharStatusMsg);
//发送心魔、人类 攻击值
{$IF DEMONSERVER = 1}
if m_btDemonMode > 0 then begin
g_PacketManage3.Init;
g_PacketManage3.WriteByte(1);
g_PacketManage3.WriteByte(m_btDemonForce);
g_PacketManage3.WriteInteger(Integer(Self));
g_PacketManage3.WriteInteger(0);
SendRefMsg(RM_DEMONHIT, 0, Integer(Self), 0, 0, g_PacketManage3.GetMsg);
if (m_btDemonForce = 0) then begin
m_btDemonMode := 0;
end;
end;
{$IFEND}
end;
//元神灵珠模式
if TBaseObject(ProcessMsg.BaseObject).m_boPneuma and
(TBaseObject(ProcessMsg.BaseObject).m_boPneumaEffMode) then
SendDefMessage(3082, Integer(ProcessMsg.BaseObject), 1, 0, 0, '');
//发送摆摊状态
if TBaseObject(ProcessMsg.BaseObject).IsShop then begin
TBaseObject(ProcessMsg.BaseObject).GetUserShop(@UserShop);
//发送操作结果和商店名称
if (TBaseObject(ProcessMsg.BaseObject).m_btRaceServer = RC_PLAYOBJECT) then
m_defMsg := MakeDefaultMsg(SM_USERDOSHOP,
Integer(ProcessMsg.BaseObject),
TBaseObject(ProcessMsg.BaseObject).m_nCurrX,
TBaseObject(ProcessMsg.BaseObject).m_nCurrY,
TBaseObject(ProcessMsg.BaseObject).m_btDirection)
else
m_defMsg := MakeDefaultMsg(SM_PETDOSHOP,
Integer(ProcessMsg.BaseObject),
TBaseObject(ProcessMsg.BaseObject).m_nHomeX,
TBaseObject(ProcessMsg.BaseObject).m_nHomeY,
TBaseObject(ProcessMsg.BaseObject).m_btJob);
SendSocket(@m_defMsg, EnCodeBuffer(@UserShop, 62));
end;
//弓箭手下跪
if m_boNeedKneel then begin
if (TBaseObject(ProcessMsg.BaseObject).m_btRaceServer in [RC_GUARD, RC_ARCHERGUARD]) then begin
TBaseObject(ProcessMsg.BaseObject).m_btDirection := GetNextDirection(TBaseObject(ProcessMsg.BaseObject).m_nCurrX,
TBaseObject(ProcessMsg.BaseObject).m_nCurrY,
m_nCurrX,
m_nCurrY);
TBaseObject(ProcessMsg.BaseObject).SendRefMsg(RM_HIT,
MakeWord(TBaseObject(ProcessMsg.BaseObject).m_btDirection, 1),
TBaseObject(ProcessMsg.BaseObject).m_nCurrX,
TBaseObject(ProcessMsg.BaseObject).m_nCurrY,
0,
TBaseObject(ProcessMsg.BaseObject).GetShowName);
end;
end;
//灵魂墙
if TBaseObject(ProcessMsg.BaseObject).m_boSpiritWall then begin
SendMsg(TBaseObject(ProcessMsg.BaseObject), RM_GHOST, 0, 0, 0, 0, '');
end;
//投石车 1140 1137
end;
end;
end;
CM_WALK: begin //3011 //行走 //---------------
if ClientWalkXY(ProcessMsg.wIdent, ProcessMsg.nParam1 {x}, ProcessMsg.nParam2 {y}, ProcessMsg.boLateDelivery, dwDelayTime) then begin
m_dwActionTick := GetTickCount;
SendSocket(nil, sSTATUS_GOOD + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
if g_Config.boStartMapEvent then begin
StartMapEventOfWalk(); //跑步事件触发
end;
//生活技能挖掘中移动中断
if (m_ButchItem.PlayObject > 0) and (m_ButchItem.BaseObject > 0) and (m_dwButchItemTime > 0) then begin
m_dwButchItemTime := 0;
g_PacketManage3.Init;
g_PacketManage3.WriteInteger(m_ButchItem.PlayObject);
g_PacketManage3.FillWrite(8, 0);
g_PacketManage3.WriteInteger($05);
g_PacketManage3.WriteByte(0);
g_PacketManage3.WriteByte(m_btDirection);
g_PacketManage3.FillWrite(6, 0);
SendDefMessage(2161, Integer(self), 0, 0, 0, g_PacketManage3.GetMsg, True);
m_sScriptParam[0] := TBaseObject(m_ButchItem.BaseObject).m_sCharName;
ExecuteScript(g_FunctionNPC, '@采集中断_' + IntToStr(m_ButchItem.nID));
end;
end else begin
if (not g_Config.boDisableM2SpeedCtrl) then begin
if dwDelayTime = 0 then begin
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end else begin
nMsgCount := GetWalkMsgCount();
if nMsgCount >= g_Config.nMaxWalkMsgCount then begin
Inc(m_nOverSpeedCount); //超速次数
if m_nOverSpeedCount > g_Config.nOverSpeedKickCount then begin
if g_Config.boKickOverSpeed then begin
SysMsg(g_sKickClientUserMsg {'请勿使用非法软件!!!'}, c_Red, t_Hint);
m_boEmergencyClose := True;
end;
if g_Config.boViewHackMessage then begin
MainOutMessage(Format(g_sWalkOverSpeed, [m_sCharName, dwDelayTime, nMsgCount]));
end;
end;
//如果超速则发送攻击失败信息
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
if m_boTestSpeedMode then
SysMsg(Format(sSpeedExcept, [ProcessMsg.wIdent, dwDelayTime]), c_Red, t_Hint);
end else begin
if (dwDelayTime > g_Config.dwDropOverSpeed) and
(g_Config.btSpeedControlMode = 1) and m_boFilterAction then begin
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
if m_boTestSpeedMode then
SysMsg(Format(sSpeedExcept, [ProcessMsg.wIdent, dwDelayTime]), c_Red, t_Hint);
end else begin
if m_boTestSpeedMode then
SysMsg(Format(sOpDelay, [ProcessMsg.wIdent, dwDelayTime]), c_Red, t_Hint);
SendDelayMsg(Self, ProcessMsg.wIdent, ProcessMsg.wParam,
ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.nParam3, '',
dwDelayTime);
Result := False;
end;
end;
end;
end else
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end;
end;
RM_WALK: begin //10002 //走
if TBaseObject(ProcessMsg.BaseObject) <> Self then begin
m_defMsg := MakeDefaultMsg(SM_WALK, Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1, ProcessMsg.nParam2, MakeWord(ProcessMsg.wParam,
TBaseObject(ProcessMsg.BaseObject).m_nLight));
CharDescEx.Feature := TBaseObject(ProcessMsg.BaseObject).GetFeature(Self);
CharDescEx.Status := TBaseObject(ProcessMsg.BaseObject).m_nCharStatus;
CharDescEx.Featurex := GetMaxHPCent(TBaseObject(ProcessMsg.BaseObject));
SendSocket(@m_defMsg, EnCodeBuffer(@CharDescEx, SizeOf(TCharDescEx)));
end;
end;
CM_RUN: begin //3013 //跑
if ClientRunXY(ProcessMsg.wIdent, ProcessMsg.nParam1 {x},
ProcessMsg.nParam2 {y}, ProcessMsg.nParam3, dwDelayTime) then begin
m_dwActionTick := GetTickCount;
SendSocket(nil, sSTATUS_GOOD + IntToStr(ProcessMsg.nParam1) + '/' + IntToStr(ProcessMsg.nParam2));
if g_Config.boStartMapEvent then begin
StartMapEventOfRun(); //跑步事件触发
end;
//生活技能挖掘中移动中断
if (m_ButchItem.PlayObject > 0) and (m_ButchItem.BaseObject > 0) and (m_dwButchItemTime > 0) then begin
m_dwButchItemTime := 0;
g_PacketManage3.Init;
g_PacketManage3.WriteInteger(m_ButchItem.BaseObject);
g_PacketManage3.FillWrite(8, 0);
g_PacketManage3.WriteInteger($05);
g_PacketManage3.WriteByte(0);
g_PacketManage3.WriteByte(m_btDirection);
g_PacketManage3.FillWrite(6, 0);
SendDefMessage(2161, Integer(self), 0, 0, 0, g_PacketManage3.GetMsg, True);
m_sScriptParam[0] := TBaseObject(m_ButchItem.BaseObject).m_sCharName;
ExecuteScript(g_FunctionNPC, '@采集中断_' + IntToStr(m_ButchItem.nID));
end;
end else begin
if (not g_Config.boDisableM2SpeedCtrl) then begin
if dwDelayTime = 0 then begin
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end else begin
nMsgCount := GetRunMsgCount();
if nMsgCount >= g_Config.nMaxRunMsgCount then begin
Inc(m_nOverSpeedCount);
if m_nOverSpeedCount > g_Config.nOverSpeedKickCount then begin
if g_Config.boKickOverSpeed then begin
SysMsg(g_sKickClientUserMsg {'请勿使用非法软件!!!'}, c_Red, t_Hint);
m_boEmergencyClose := True;
end;
if g_Config.boViewHackMessage then begin
MainOutMessage(Format(g_sRunOverSpeed, [m_sCharName, dwDelayTime, nMsgCount]));
end;
end;
//如果超速则发送攻击失败信息
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end else begin
if (dwDelayTime > g_Config.dwDropOverSpeed) and
(g_Config.btSpeedControlMode = 1) and m_boFilterAction then begin
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
if m_boTestSpeedMode then
SysMsg(Format(sSpeedExcept, [ProcessMsg.wIdent, dwDelayTime]), c_Red, t_Hint);
end else begin
if m_boTestSpeedMode then
SysMsg(Format(sOpDelay, [ProcessMsg.wIdent, dwDelayTime]), c_Red, t_Hint);
SendDelayMsg(Self, ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1, ProcessMsg.nParam2, CM_RUN, '', dwDelayTime);
Result := False;
end;
end;
end;
end else
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end;
end;
RM_RUN: begin ////跑
if TBaseObject(ProcessMsg.BaseObject) <> Self then begin
m_defMsg := MakeDefaultMsg(SM_RUN, Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1, ProcessMsg.nParam2, MakeWord(ProcessMsg.wParam,
TBaseObject(ProcessMsg.BaseObject).m_nLight));
CharDescEx.Feature := TBaseObject(ProcessMsg.BaseObject).GetFeature(Self);
CharDescEx.Status := TBaseObject(ProcessMsg.BaseObject).m_nCharStatus;
CharDescEx.Featurex := GetMaxHPCent(TBaseObject(ProcessMsg.BaseObject));
s1C := EnCodeBuffer(@CharDescEx, SizeOf(CharDescEx));
nObjCount := GetCharColor(TBaseObject(ProcessMsg.BaseObject));
if ProcessMsg.sMsg <> '' then
s1C := s1C + (EnCodeString(ProcessMsg.sMsg + '/' + IntToStr(nObjCount)));
SendSocket(@m_defMsg, s1C);
end;
end;
RM_HIT: begin ////攻击
if TBaseObject(ProcessMsg.BaseObject) <> Self then begin
m_defMsg := MakeDefaultMsg(SM_HIT, Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.wParam);
CharDescEx.Feature := TBaseObject(ProcessMsg.BaseObject).GetFeature(Self);
CharDescEx.Status := TBaseObject(ProcessMsg.BaseObject).m_nCharStatus;
SendSocket(@m_defMsg, EnCodeBuffer(@CharDescEx, 8));
end;
end;
CM_SPELL: begin //3017 004D76FD //魔法攻击
if not m_boNoAttackMode and ClientSpellXY(ProcessMsg.wIdent,
ProcessMsg.wParam, ProcessMsg.nParam1, ProcessMsg.nParam2,
TBaseObject(ProcessMsg.nParam3), ProcessMsg.boLateDelivery, dwDelayTime) then begin
m_dwActionTick := GetTickCount;
SendSocket(nil, sSTATUS_GOOD + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end else begin
if m_boNoAttackMode then
SysMsg('观众模式不能参与攻击', c_Red, t_Hint);
if (not g_Config.boDisableM2SpeedCtrl) then begin
if dwDelayTime = 0 then begin
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY)); //-----------传世行走失败
end else begin
nMsgCount := GetSpellMsgCount();
if nMsgCount >= g_Config.nMaxSpellMsgCount then begin
Inc(m_nOverSpeedCount);
if m_nOverSpeedCount > g_Config.nOverSpeedKickCount then begin
if g_Config.boKickOverSpeed then begin
SysMsg(g_sKickClientUserMsg {'请勿使用非法软件!!!'}, c_Red, t_Hint);
m_boEmergencyClose := True;
end;
if g_Config.boViewHackMessage then begin
MainOutMessage(Format(g_sSpellOverSpeed, [m_sCharName, dwDelayTime, nMsgCount]));
end;
end;
//如果超速则发送攻击失败信息
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY)); //-----------传世行走失败
end else begin
if (dwDelayTime > g_Config.dwDropOverSpeed) and
(g_Config.btSpeedControlMode = 1) and m_boFilterAction then begin
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY)); //-----------传世行走失败
if m_boTestSpeedMode then
SysMsg(Format(sSpeedExcept, [ProcessMsg.wIdent, dwDelayTime]), c_Red, t_Hint);
end else begin
if m_boTestSpeedMode then
SysMsg(Format(sOpDelay, [ProcessMsg.wIdent, dwDelayTime]), c_Red, t_Hint);
SendDelayMsg(Self, ProcessMsg.wIdent, ProcessMsg.wParam,
ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.nParam3, '', dwDelayTime);
Result := False;
end;
end;
end;
end else
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end;
end;
RM_SPELL: begin // 10007//魔法
if (TBaseObject(ProcessMsg.BaseObject) <> Self) or GetSpellToSelf(ProcessMsg.nParam3) then begin
m_defMsg := MakeDefaultMsg(SM_SPELL,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1, //X
ProcessMsg.nParam2, //Y
ProcessMsg.wParam); //btEffect
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end;
end;
RM_SPELL2: begin
if TBaseObject(ProcessMsg.BaseObject) <> Self then begin
m_defMsg := MakeDefaultMsg(SM_POWERHIT,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.wParam);
SendSocket(@m_defMsg, '');
end;
end;
RM_HEALTHSPELLCHANGED: begin //10052
if TBaseObject(ProcessMsg.BaseObject) <> Self then begin
m_defMsg := MakeDefaultMsg(SM_HEALTHSPELLCHANGED,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1,
ProcessMsg.nParam3,
ProcessMsg.nParam2);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end;
end;
CM_HIT, //3014 //攻击动作
CM_HEAVYHIT, //3015
CM_BIGHIT, //3016
CM_POWERHIT, //3018
CM_LONGHIT, //3019
CM_WIDEHIT, //3024
CM_CRSHIT,
CM_TWNHIT,
CM_FIREHIT,
CM_3026: begin //3025
// {$IF USESDK = DEBUG}
// MainOutMessage(Format('攻击动作:%s-%d-%d-%d-%d-%d %s',
// [m_sCharName, ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1,
// ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg]));
// {$IFEND}
if not m_boNoAttackMode and ClientHitXY(ProcessMsg.wIdent {ident},
ProcessMsg.nParam1 {x}, ProcessMsg.nParam2 {y}, ProcessMsg.wParam {dir},
ProcessMsg.nParam3, ProcessMsg.boLateDelivery, dwDelayTime) then begin
m_dwActionTick := GetTickCount;
SendSocket(nil, sSTATUS_GOOD + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end else begin
if m_boNoAttackMode then
SysMsg('观众模式不能参与攻击', c_Red, t_Hint);
if (not g_Config.boDisableM2SpeedCtrl) then begin
if dwDelayTime = 0 then begin
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end else begin
nMsgCount := GetHitMsgCount();
if nMsgCount >= g_Config.nMaxHitMsgCount then begin
Inc(m_nOverSpeedCount);
if m_nOverSpeedCount > g_Config.nOverSpeedKickCount then begin
if g_Config.boKickOverSpeed then begin
SysMsg(g_sKickClientUserMsg {'请勿使用非法软件!!!'}, c_Red, t_Hint);
m_boEmergencyClose := True;
end;
if g_Config.boViewHackMessage then begin
MainOutMessage(Format(g_sHitOverSpeed, [m_sCharName, dwDelayTime, nMsgCount]));
end;
end;
//如果超速则发送攻击失败信息
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end else begin
if (dwDelayTime > g_Config.dwDropOverSpeed) and
(g_Config.btSpeedControlMode = 1) and m_boFilterAction then begin
//SendUpdateMsg(Self, 65535, 0, m_nCurrX, m_nCurrY, 0, '');
SendSocket(nil, sSTATUS_GOOD + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
if m_boTestSpeedMode then
SysMsg(Format(sSpeedExcept, [ProcessMsg.wIdent, dwDelayTime]), c_Red, t_Hint);
end else begin
if m_boTestSpeedMode then begin
SysMsg(Format(sOpDelay, [ProcessMsg.wIdent, dwDelayTime]), c_Red, t_Hint);
end;
SendDelayMsg(Self, ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.nParam3, '', dwDelayTime);
Result := False;
end;
end;
end;
end else
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end;
end;
RM_ANYINGLEIDIAN: begin //显示暗影雷电的效果
ShortMessage.Ident := $12;
ShortMessage.wMsg := ProcessMsg.nParam3;
m_defMsg := MakeDefaultMsg($2BDC,
ProcessMsg.nParam1,
LoWord(ProcessMsg.nParam2),
HiWord(ProcessMsg.nParam2),
ProcessMsg.wParam);
SendSocket(@m_defMsg, EnCodeBuffer(@ShortMessage,
SizeOf(TShortMessage)));
end;
CM_3078: begin //释放了元神
DeCodeBuffer(ProcessMsg.sMsg, @nObjCount, SizeOf(Integer));
if (m_PneumaObject <> nil) and (nObjCount = Integer(m_PneumaObject)) then begin
SysMsg(sHint1, c_Red, t_Hint);
end;
{$IF USESDK = DEBUG}
MainOutMessage(Format('元神消息:%s-%d-%d-%d-%d-%d %s-%d',
[m_sCharName, ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg, nObjCount]));
{$IFEND}
end;
RM_SENDMYNAME: begin
SendDefMessage(SM_9609, Integer(Self), 0, 0, 0, m_sCharName);
end;
CM_3080: begin //释放或收起元神
PneumaLogin();
{$IF USESDK = DEBUG}
MainOutMessage(Format('元神消息:%s-%d-%d-%d-%d-%d %s-%s',
[m_sCharName, ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg,
DeCodeString(ProcessMsg.sMsg)]));
{$IFEND}
end;
CM_OPPNEUMAITEM: begin //把人物包裹物品移动到元神包裹
ClientOpPneumaBagItem(ProcessMsg.sMsg);
end;
CM_3077: begin //人物和元神之间交换金币
ClientOpPneumaGold(ProcessMsg.sMsg)
end;
CM_3079: begin //估计是寻找主人的位置消息
if m_boPneuma and (m_PneumaObject <> nil) and ((m_PEnvir <> m_PneumaObject.m_PEnvir) or
(abs(m_nCurrX - m_PneumaObject.m_nCurrX) > 15) or (abs(m_nCurrY - m_PneumaObject.m_nCurrY) > 15)) then begin
if m_PneumaObject.GetRightPosition(nX, nY) then begin
if m_PneumaObject.GetCanMovePosition(nX, nY, 3, n18, n1C) then begin
SendRefMsg(RM_SPACEMOVE_FIRE, 0, 0, 0, 0, '');
SpaceMove(m_PneumaObject.m_sMapName, n18, n1C, 0, nil);
end;
end;
end;
end;
CM_3082: begin //在灵珠模式和人形模式间切换
{$IF USESDK = DEBUG}
MainOutMessage(Format('元神灵珠消息 %d-%d-%d-%d-%d %s',
[ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg]));
{$IFEND}
ChangePneumaState();
end;
RM_YSSTATECHANGED: begin
SendDefMessage(3082, ProcessMsg.nParam1, ProcessMsg.wParam, 0, 0, '');
end;
CM_OPENRANK: begin
if (ProcessMsg.nParam2 = 0) then begin //0、自己点的; 1、服务器更新 //查看英雄榜
if not g_Config.boUseRankList then
ExecuteScript(g_ManageNPC, '@OpenRank')
else begin
if m_WAbil.level >= g_Config.nViewRankLevel then begin
{$IF DEMONSERVER = 1}
if g_Config.boNightMareServer then
SendDefMessage($9702, Integer(Self), g_Config.nUseRanking, 2, 0, '')
else
{$IFEND}
SendDefMessage($9702, Integer(Self), g_Config.nUseRanking, 1, 0, '')
end else begin
SysMsg(Format('您当前等级还没有达到%d级,无法查询排行榜', [g_Config.nViewRankLevel]), c_Red, t_Hint);
end;
end;
end;
end;
CM_SENDRANK: begin //查询对应的排行榜
if m_WAbil.level >= g_Config.nRankLevel then
g_RankManage.OnQueryRankListOrd(Self, ProcessMsg.nParam2, ProcessMsg.wParam);
end;
CM_RECALLEVIL: begin
ClientEvilOp(ProcessMsg.nParam2, ProcessMsg.nParam1,
MakeLong(ProcessMsg.nParam3, ProcessMsg.wParam));
{$IF USESDK = DEBUG}
MainOutMessage(Format('心魔控制消息 %d-%d-%d-%d-%d %s',
[ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg]));
{$IFEND}
end;
CM_ERNIE: begin
ClientErnie(ProcessMsg.nParam2);
{$IF USESDK = DEBUG}
MainOutMessage(Format('神龙献宝消息 %d-%d-%d-%d-%d %s',
[ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg]));
{$IFEND}
end;
CM_HUANJING: begin
ClientOpenHuanjing(ProcessMsg.nParam1, ProcessMsg.nParam2,
ProcessMsg.nParam3);
{$IF USESDK = DEBUG}
MainOutMessage(Format('天关幻境消息 %d-%d-%d-%d-%d %s',
[ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg]));
{$IFEND}
end;
CM_PERSONSET: begin //个性化设置
{$IF USESDK = DEBUG}
MainOutMessage(Format('内挂设置消息 %d-%d-%d-%d-%d %s',
[ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg]));
{$IFEND}
ClientPersonalSet(ProcessMsg.wParam, ProcessMsg.nParam2,
ProcessMsg.nParam3, ProcessMsg.sMsg);
end;
CM_WOLSHOP: begin
if ProcessMsg.nParam2 = 1 then begin
//滚动消息
m_defMsg := MakeDefaultMsg(SM_WOLSHOP, Integer(Self), 0, 0, 0);
SendSocket(@m_defMsg, EnCodeString(UserEngine.GetShopScrollMsg));
//热点标题
m_defMsg.Param := 10;
SendSocket(@m_defMsg, EnCodeString(UserEngine.GetShopHotTitle));
//热销排行榜
m_defMsg.Param := 1;
SendSocket(@m_defMsg, EnCodeString(UserEngine.GetHotSellItems));
//首页子栏目列表
m_defMsg.Param := 2;
s1C := UserEngine.GetBandItems('10');
SendSocket(@m_defMsg, EnCodeString(s1C));
//首页第一子栏目商品
m_defMsg.Param := 3;
s1C := UserEngine.GetSubBandItems(self, '1010');
SendSocket(@m_defMsg, EnCodeString(s1C));
end else if ProcessMsg.nParam2 = 2 then begin
//子栏目列表
m_defMsg := MakeDefaultMsg(SM_WOLSHOP, Integer(Self), 2, 0, 0);
s1C := UserEngine.GetBandItems(DeCodeString(ProcessMsg.sMsg));
SendSocket(@m_defMsg, EnCodeString(s1C));
//第一子栏目商品列表
if s1C <> '&' then begin
m_defMsg := MakeDefaultMsg(SM_WOLSHOP, Integer(Self), 3, 0, 0);
s1C := UserEngine.GetSubBandItems(Self, DeCodeString(ProcessMsg.sMsg) + '10');
SendSocket(@m_defMsg, EnCodeString(s1C));
end;
end else if ProcessMsg.nParam2 = 3 then begin //查询子栏目商品列表
s1C := DeCodeString(ProcessMsg.sMsg);
if s1C <> '&' then begin
m_defMsg := MakeDefaultMsg(SM_WOLSHOP, Integer(Self), 3, 0, 0);
s1C := UserEngine.GetSubBandItems(Self, s1C);
SendSocket(@m_defMsg, EnCodeString(s1C));
end;
end else if ProcessMsg.nParam2 = 4 then begin
//商品描述信息
s1C := UserEngine.GetStdItemDesc(Self, DeCodeString(ProcessMsg.sMsg));
m_defMsg := MakeDefaultMsg(SM_WOLSHOP, Integer(Self), 4, 0, 0);
SendSocket(@m_defMsg, EnCodeString(s1C));
end else if (ProcessMsg.nParam2 in [5, 7, 16]) or (ProcessMsg.nParam2 = $0105) then begin //购买 5=元宝 16=绑定元宝
SetLength(s1C, Round(Length(ProcessMsg.sMsg) * 3 / 4));
boBindGameGold := ProcessMsg.nParam2 = 16;
DeCodeBuffer(ProcessMsg.sMsg, @s1C[1], Length(s1C));
if s1C <> '' then begin
//商品编号 赠送人 留言
i := 1;
sData := GetToken(s1C, #0, i);
sData := GetToken(s1C, #0, i);
sTmp := GetToken(s1C, #0, i);
if Pos(#0, s1C) > 0 then Delete(s1C, Pos(#0, s1C), Length(s1C));
if ProcessMsg.nParam2 = $0105 then //传世商城
UserEngine.BuyWolShopItem(Self, sData, s1C, sTmp, boBindGameGold, False)
else //普通商品
UserEngine.BuyWolShopItem(Self, sData, s1C, sTmp, boBindGameGold, True);
{$IF USESDK = DEBUG}
MainOutMessage(Format('商城购买信息:%s-%s-%s', [sData, s1C, sTmp]));
{$IFEND}
end;
end else if (ProcessMsg.nParam2 = 6) then begin
ExecuteScript(g_ManageNPC, '@OpenWolShop' + IntToStr(ProcessMsg.wParam))
end
else begin
{$IF CHECKNEWMSG = 1}
MainOutMessage(Format('未知商城消息:%d-%d-%d-%d-%d %s',
[ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg]));
{$IFEND}
end;
end;
CM_BAGORDER: begin //人物下线之前保存的数据
ClientSetBagOrder(ProcessMsg.wParam, ProcessMsg.sMsg);
end;
CM_OPENPETBAG: begin
if not m_boBagSend then
SendDelayMsg(Self, CM_QUERYBAGITEMS, 0, 0, 0, 0, '', 1000);
m_defMsg := MakeDefaultMsg(SM_9600, DateTimeToWolTIme(Date + Time), 0, 0, 0);
SendSocket(@m_defMsg, '');
end;
CM_MOVEITEMTOPETBAG: begin
ClientStorageItemToPetBag(ProcessMsg.nParam1);
end;
CM_MOVEITMETOBAG: begin
ClientTakebackPetItem(ProcessMsg.nParam1);
end;
CM_DOSHOP: begin //摆摊
ClientDoShop(ProcessMsg.nParam2, ProcessMsg.sMsg);
end;
CM_REQUESTDOSHOP: begin
{$IF USESDK = DEBUG}
MainOutMessage(Format('摆摊消息 %d-%d-%d-%d-%d %s',
[ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg]));
{$IFEND}
if m_boRideOn or m_PEnvir.m_MapFlag.boNoDoShop or m_boArrow then
SysMsg(sHint2, c_Red, t_Hint)
else begin
case ProcessMsg.nParam2 of
0: begin
ClientPetStopDoShop(); //停止摆摊
end;
2: begin //取卖物所得
ClientGetbackPetMoney();
end;
3: begin //取摆摊物品
if (m_Pet <> nil) then ClientGetbackPetShopItem();
end;
5: begin
ClientRequestPetDoShop(); //请求摆摊
end;
7: begin
if (m_PackPet <> nil) then
SendDefMessage(34979,
0,
1,
0,
0,
Format('你的宠物豹在%s(%d:%d)为你守摊。', [m_PackPet.m_PEnvir.m_sMapDesc, m_PackPet.m_nCurrX, m_PackPet.m_nCurrY]))
else
SendDefMessage(34979, 0, 0, 0, 0, '没有守摊的豹子');
end;
end;
end;
end;
CM_UPDATESHOPITEM: begin //更新宠物摊位
ClientUpdatePetShop(ProcessMsg.nParam1, ProcessMsg.nParam3,
ProcessMsg.sMsg);
end;
CM_PETDOSHOP: begin //24245 豹子摆摊
ClientPetDoShop(ProcessMsg.nParam1, ProcessMsg.nParam2,
ProcessMsg.sMsg);
end;
RM_DOSHOP: begin
if (ProcessMsg.BaseObject <> Self) then begin
m_defMsg := MakeDefaultMsg(SM_USERDOSHOP,
Integer(ProcessMsg.BaseObject),
LoWord(ProcessMsg.nParam1),
HiWord(ProcessMsg.nParam1),
ProcessMsg.wParam);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end;
end;
RM_PETDOSHOP: begin
if (ProcessMsg.BaseObject <> Self) then begin
m_defMsg := MakeDefaultMsg(SM_PETDOSHOP,
ProcessMsg.nParam3,
LoWord(ProcessMsg.nParam1),
HiWord(ProcessMsg.nParam1),
ProcessMsg.wParam);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end;
end;
RM_SENDSHOPITEMS: begin
if m_PackPet <> nil then
m_PackPet.SendShopItems(Self, 1);
end;
CM_ADDFRIEND: begin
ClientAddFriend(ProcessMsg.sMsg);
end;
CM_DELFRIEND: begin
ClientDelFriend(ProcessMsg.sMsg);
end;
CM_RESPADDFRIEND: begin
ClientRespAddFriend(ProcessMsg.nParam1, ProcessMsg.sMsg);
end;
$E67B: begin //点彩虹客服MM,触发脚本
ExecuteScript(g_ManageNPC, '@客服功能');
end;
$9707: begin
SendDefMessage(SM_9708, 0, 256, 0, 0, '');
//SendDefMessage($FFFF, 0, m_nCurrX, m_nCurrY, 0, ''); //未知
end;
$0710: begin
ExecuteScript(g_ManageNPC, '@商城功能_' + IntToStr(ProcessMsg.wParam));
end;
3044: ; //未知消息
1811: begin
SendDefMessage(SM_MENU_OK, Integer(Self), 0, 0, 0, sHint3);
end;
192: begin //黄榜大旗放到旗座上
MakeFlagOwner(ProcessMsg.wParam, ProcessMsg.nParam1, ProcessMsg.nParam2,
ProcessMsg.nParam3, ProcessMsg.sMsg);
end;
193: begin //Ident 193 Param 1 P1 268831256 P2 1 P3 0 Msg
ClickQueryMsg(ProcessMsg.nParam1, ProcessMsg.nParam2);
end;
654: begin //黄榜大旗留言
AddFlagComment(ProcessMsg.nParam2, ProcessMsg.nParam1,
ProcessMsg.nParam3, ProcessMsg.sMsg);
end;
CM_TREASURE: begin
{$IF USESDK = DEBUG}
MainOutMessage('祈愿树(宝箱):' + Format('%d-%d-%d-%d-%d-%d %s',
[Integer(ProcessMsg.BaseObject), ProcessMsg.wIdent, ProcessMsg.wParam,
ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg]));
{$IFEND}
GetTreasureBoxItem(ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg);
end;
RM_TREASURE: begin
m_defMsg := MakeDefaultMsg(SM_627, Integer(ProcessMsg.BaseObject),
ProcessMsg.wParam, ProcessMsg.nParam1, 0);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end;
RM_SENDFRIENDLIST: begin
//好友的处理:装载并发送好友列表
SendFiendList;
//发送在线状态
SendMeOnlineState(1);
end;
CM_QUERYUSERNAME: begin //80 查询玩家名称
ClientQueryUserName(TBaseObject(ProcessMsg.nParam1), ProcessMsg.nParam2, ProcessMsg.nParam3); //004D7931
end;
CM_QUERYBAGITEMS: begin //81 查询包裹物品
ClientQueryBagItems();
ClientQueryTreasureBoxItems(True); //灵犀宝盒
end;
CM_QUERYUSERSTATE: begin //82 查询角色状态
ClientQueryUserState(TPlayObject(ProcessMsg.nParam1), ProcessMsg.nParam2, ProcessMsg.nParam3);
end;
CM_QUERYUSERSET: begin //物品快捷交易
ClientQueryUserSet(ProcessMsg);
end;
CM_64: begin //上马下马的命令
{$IF USESDK = DEBUG}
MainOutMessage('骑宠信息:' + Format('%d-%d-%d-%d-%d-%d %s',
[Integer(ProcessMsg.BaseObject), ProcessMsg.wIdent, ProcessMsg.wParam,
ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg]));
{$IFEND}
//1秒内禁止重复上下马
if (GetTickCount - m_dwLastRide < 500) or (not ClientRide) then
SendSocket(nil, sSTATUS_GOOD + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end;
CM_DROPITEM: begin //1000 丢掉物品
if ClientDropItem(ProcessMsg.sMsg, ProcessMsg.nParam1) then
SendDefMessage(SM_DROPITEM_SUCCESS, ProcessMsg.nParam1, 0, 0, 0,
ProcessMsg.sMsg)
else
SendDefMessage(SM_DROPITEM_FAIL, ProcessMsg.nParam1, 0, 0, 0,
ProcessMsg.sMsg);
end;
CM_PICKUP: begin //1001 004D78F9 捡物品
if (m_nCurrX = ProcessMsg.nParam2) and (m_nCurrY = ProcessMsg.nParam3) then
ClientPickUpItem(ProcessMsg.nParam2, ProcessMsg.nParam3, 0);
end;
CM_PETPICKUP: begin //1001 004D78F9 宠物豹捡物品
if (m_Pet <> nil) and (not m_Pet.m_boGhost) and (not m_Pet.m_boDeath)
and (not m_Pet.m_boDealOK) and (not m_Pet.IsShop) then
PetPickUpItem(ProcessMsg.nParam2, ProcessMsg.nParam3);
end;
CM_OPENDOOR: begin //1002 开门
ClientOpenDoor(ProcessMsg.nParam2, ProcessMsg.nParam3);
end;
CM_TAKEONITEM: begin //1003 戴上装备
ClientTakeOnItems(ProcessMsg.nParam2, ProcessMsg.nParam1, ProcessMsg.sMsg, False);
end;
CM_TAKEOFFITEM: begin //1004 取下装备
ClientTakeOffItems(ProcessMsg.nParam2, ProcessMsg.nParam1, ProcessMsg.sMsg);
end;
CM_TAKEENTOPTICITEM: begin //装备元神内视装备,魂骨
case LoByte(ProcessMsg.nParam2) of
0: ClientTakeOnEntopticItems(HiByte(ProcessMsg.nParam2), ProcessMsg.nParam1);
1: ClientTakeOffEntopticItems(HiByte(ProcessMsg.nParam2), ProcessMsg.nParam1);
2: ClientEntopticSmelt(HiByte(ProcessMsg.nParam2), ProcessMsg.sMsg);
end;
end;
CM_ILLUMEHEARTFATEPOINT: begin
ClientIllumeHeartPoint(LoByte(ProcessMsg.nParam3) - 1, HiByte(ProcessMsg.nParam3));
end;
CM_EAT: begin //1006 吃药、学技能
ClientUseItems(ProcessMsg.nParam1, ProcessMsg.sMsg, MakeLong(ProcessMsg.nParam2, ProcessMsg.nParam3));
end;
CM_BUTCH: begin //1007 挖肉
if not ClientGetButchItem(TBaseObject(ProcessMsg.nParam1),
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.wParam, dwDelayTime) then begin
if (not g_Config.boDisableM2SpeedCtrl) then begin
if dwDelayTime <> 0 then begin
nMsgCount := GetDigUpMsgCount();
if nMsgCount >= g_Config.nMaxDigUpMsgCount then begin
Inc(m_nOverSpeedCount);
if m_nOverSpeedCount > g_Config.nOverSpeedKickCount then begin
if g_Config.boKickOverSpeed then begin
SysMsg(g_sKickClientUserMsg {'请勿使用非法软件!!!'}, c_Red, t_Hint);
m_boEmergencyClose := True;
end;
if g_Config.boViewHackMessage then begin
MainOutMessage(Format(g_sBunOverSpeed, [m_sCharName, dwDelayTime, nMsgCount]));
end;
end;
//如果超速则发送攻击失败信息
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY)); //-----------传世行走失败
end else begin
if dwDelayTime < g_Config.dwDropOverSpeed then begin
if m_boTestSpeedMode then
SysMsg(Format('速度异常 Ident: %d Time: %d', [ProcessMsg.wIdent, dwDelayTime]), c_Red, t_Hint);
SendSocket(nil, sSTATUS_GOOD + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end else begin
SendDelayMsg(Self, ProcessMsg.wIdent, ProcessMsg.wParam,
ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.nParam3, '', dwDelayTime);
Result := False;
end;
end;
end;
end; // else
// SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end;
end;
CM_MAGICKEYCHANGE: begin //1008 设置魔法快捷键
ClientChangeMagicKey(ProcessMsg.nParam1, ProcessMsg.nParam2);
end;
CM_SOFTCLOSE: begin //小退
//if not m_boOfflineGetGamePoint then begin
m_boReconnection := True;
m_boSoftClose := True;
//end;
end;
CM_106: begin //大退
if (g_Config.boEnableOffLinePlayer or m_boSafeZoneOnLine) and not m_boDeath and not m_boGhost and InSafeZone then begin
m_boOfflineGetGamePoint := True;
m_sAutoSayMsg := g_sOffLineMsg;
m_boSuperMan := g_Config.boOffLineSuperMode;
m_boAllowDeal := False; //禁止交易
m_boAllowGuild := False; //禁止加入行会
m_boAllowGroup := False; //禁止组队
m_boCanMasterRecall := False; //禁止师徒传送
m_boCanDearRecall := False; //禁止夫妻传送
m_boAllowGuildReCall := False; //禁止行会合一
m_boAllowGroupReCall := False; //禁止天地合一
m_wStatusTimeArr[STATE_BUBBLEDEFENCEUP] := 0;
m_wStatusTimeArr[STATE_JINGANGHUTI] := 0;
m_wStatusTimeArr[STATE_HUSHENZHENQI] := 0;
m_wStatusTimeArr[STATE_FENGYINGDUN] := 0;
m_wStatusTimeArr[STATE_FIERYDRAGON] := 0;
m_boAbilMag70Defence := False;
m_boAbilMagHuShenDefence := False;
m_boAbilMagJingangDefence := False;
m_boAbilMagBubbleDefence := False;
//清除宝宝
for i := 0 to m_SlaveList.Count - 1 do begin
TBaseObject(m_SlaveList.Items[i]).MakeGhost();
end;
m_SlaveList.Clear;
end;
//if m_boOfflineGetGamePoint then m_boSoftClose := False;
end;
CM_CLICKNPC: begin //1010 点NPC
ClientClickNPC(ProcessMsg.nParam1);
end;
CM_MERCHANTDLGSELECT: //1011 商品列表选择
ClientMerchantDlgSelect(ProcessMsg.nParam1, Trim(ProcessMsg.sMsg), ProcessMsg.nParam2);
CM_MERCHANTQUERYSELLPRICE: //1012 询价
ClientMerchantQuerySellPrice(ProcessMsg.nParam1,
MakeLong(ProcessMsg.nParam2, ProcessMsg.nParam3), ProcessMsg.sMsg);
CM_USERSELLITEM: //1013 卖东西
ClientUserSellItem(ProcessMsg.nParam1, MakeLong(ProcessMsg.nParam2, ProcessMsg.nParam3), ProcessMsg.sMsg);
CM_USERBUYITEM: //1014 004D7AD4 买东西
ClientUserBuyItem(ProcessMsg.wIdent, ProcessMsg.nParam1, MakeLong(ProcessMsg.nParam2, ProcessMsg.nParam3), ProcessMsg.wParam, ProcessMsg.sMsg);
CM_USERGETDETAILITEM: //1015 004D7AB6 //取商品列表
ClientUserBuyItem(ProcessMsg.wIdent, ProcessMsg.nParam1, 0, ProcessMsg.wParam, ProcessMsg.sMsg);
CM_DROPGOLD: begin //1016 004D7AFC 丢掉金币
if ProcessMsg.nParam1 > 0 then ClientDropGold(ProcessMsg.nParam1);
end;
CM_1017: SendDefMessage(1, 0, 0, 0, 0, '');
CM_GROUPMODE: begin //1019 //改变组队模式
if ProcessMsg.nParam2 = 0 then ClientGropuClose()
else m_boAllowGroup := True;
if m_boAllowGroup then
SendDefMessage(SM_GROUPMODECHANGED, 0, 1, 0, 0, '')
else SendDefMessage(SM_GROUPMODECHANGED, 0, 0, 0, 0, '');
end;
CM_CREATEGROUP: begin //1020 //创建组队
ClientCreateGroup(Trim(ProcessMsg.sMsg));
end;
CM_ADDGROUPMEMBER: begin //1021 //增加队伍成员
ClientAddGroupMember(Trim(ProcessMsg.sMsg));
end;
CM_DELGROUPMEMBER: begin //1022 //删除队伍成员
ClientDelGroupMember(Trim(ProcessMsg.sMsg));
end;
CM_USERREPAIRITEM: begin //1023 //修理物品
ClientRepairItem(ProcessMsg.nParam1, MakeLong(ProcessMsg.nParam2,
ProcessMsg.nParam3), ProcessMsg.wParam, ProcessMsg.sMsg);
end;
CM_MERCHANTQUERYREPAIRCOST: begin //1024 //询问修理价格
ClientQueryRepairCost(ProcessMsg.nParam1, MakeLong(ProcessMsg.nParam2,
ProcessMsg.nParam3), ProcessMsg.wParam, ProcessMsg.sMsg);
end;
CM_DEALTRY: begin //1025
ClientDealTry(Trim(ProcessMsg.sMsg)); //交易尝试
end;
CM_DEALADDITEM: begin //1026 添加交易物品
ClientAddDealItem(ProcessMsg.nParam1, ProcessMsg.sMsg);
end;
CM_DEALDELITEM: begin //1027 //删除交易物品
ClientDelDealItem(ProcessMsg.nParam1, ProcessMsg.sMsg);
end;
CM_DEALCANCEL: begin //1028 //取消交易
ClientCancelDeal();
end;
CM_DEALCHGGOLD: begin //1029 //改变交易价格
if ProcessMsg.nParam2 = 0 then
ClientChangeDealGold(ProcessMsg.nParam1, 0)
else if ProcessMsg.nParam2 = 1 then
ClientChangeDealGold(0, ProcessMsg.nParam1);
end;
CM_DEALEND: begin //1030 //交易完成
ClientDealEnd();
end;
CM_USERSTORAGEITEM: begin //保存物品到仓库取回物品
ClientStorageItem(TObject(ProcessMsg.nParam1),
MakeLong(ProcessMsg.nParam2, ProcessMsg.nParam3), ProcessMsg.wParam = 1,
ProcessMsg.sMsg);
end;
CM_USERTAKEBACKSTORAGEITEM: begin //1032 //从仓库取回物品
ClientTakeBackStorageItem(TObject(ProcessMsg.nParam1),
MakeLong(ProcessMsg.nParam2, ProcessMsg.nParam3), ProcessMsg.wParam = 1,
ProcessMsg.sMsg);
end;
CM_WANTMINIMAP: begin //1033 //需要小地图
ClientGetMinMap();
end;
CM_USERMAKEDRUGITEM: begin //1034 //炼药
ClientMakeDrugItem(TObject(ProcessMsg.nParam1), ProcessMsg.sMsg);
end;
CM_OPENGUILDDLG: begin //1035 //打开行会窗口
ClientOpenGuildDlg();
end;
CM_GUILDHOME: begin //1036 //行会首页
ClientGuildHome();
end;
CM_GUILDMEMBERLIST: begin //行会成员列表
ClientGuildMemberList();
end;
CM_GUILDADDMEMBER: begin //添加行会成员
ClientGuildAddMember(ProcessMsg.sMsg);
end;
CM_GUILDDELMEMBER: begin //删除行会成员
ClientGuildDelMember(ProcessMsg.sMsg);
end;
CM_GUILDUPDATENOTICE: begin //行会公告修改
ClientGuildUpdateNotice(ProcessMsg.sMsg);
end;
CM_GUILDUPDATERANKINFO: begin //1041 //行会职位修改
ClientGuildUpdateRankInfo(ProcessMsg.sMsg);
end;
CM_GUILDEXP: begin
if m_MyGuild <> nil then begin
SendDefMessage(717, 0, TGuild(m_MyGuild).Count, 0, 0, TGuild(m_MyGuild).GuildsMsg(m_GuildExp));
end;
end;
// CM_ADJUST_BONUS: begin //调整技能点数
// ClientAdjustBonus(ProcessMsg.nParam1, ProcessMsg.sMsg);
// end;
CM_DECOMPOSE: begin
ClientDECOMPOSE(ProcessMsg.nParam2, ProcessMsg.nParam1);
end;
CM_GEMREMOVE: begin //拆除原石
ClientGEMREMOVE(ProcessMsg.nParam2, ProcessMsg.nParam1);
//1044-0-39440184-2-0
{$IF USESDK = DEBUG}
MainOutMessage(Format('%d-%d-%d-%d-%d %s',
[ProcessMsg.wIdent, ProcessMsg.wParam,
ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg]));
{$IFEND}
end;
// CM_GUILDALLY: begin //1044 //行会联盟
// ClientGuildAlly();
// end;
CM_YIWANGDAN: begin //1045 //遗忘丹
ClientYIWANGDAN(ProcessMsg.nParam1, DeCodeString(ProcessMsg.sMsg));
end;
CM_TURN: begin //3010 004D73DD //人物转身(出现)
if ClientChangeDir(ProcessMsg.wIdent, ProcessMsg.nParam1 {x},
ProcessMsg.nParam2 {y}, ProcessMsg.wParam {dir}, dwDelayTime) then begin
m_dwActionTick := GetTickCount;
SendSocket(nil, sSTATUS_GOOD + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end else begin
if (not g_Config.boDisableM2SpeedCtrl) then begin
if dwDelayTime = 0 then begin
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end else begin
nMsgCount := GetTurnMsgCount();
if nMsgCount >= g_Config.nMaxTurnMsgCount then begin
Inc(m_nOverSpeedCount);
if m_nOverSpeedCount > g_Config.nOverSpeedKickCount then begin
if g_Config.boKickOverSpeed then begin
SysMsg(g_sKickClientUserMsg, c_Red, t_Hint);
m_boEmergencyClose := True;
end;
if g_Config.boViewHackMessage then begin
MainOutMessage(Format(g_sBunOverSpeed, [m_sCharName, dwDelayTime, nMsgCount]));
end;
end;
//如果超速则发送攻击失败信息
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end else begin
if dwDelayTime < g_Config.dwDropOverSpeed then begin
SendSocket(nil, sSTATUS_GOOD + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
if m_boTestSpeedMode then
SysMsg(Format(sSpeedExcept, [ProcessMsg.wIdent, dwDelayTime]), c_Red, t_Hint);
end else begin
SendDelayMsg(Self, ProcessMsg.wIdent, ProcessMsg.wParam,
ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.nParam3, '', dwDelayTime);
Result := False;
end;
end;
end;
end else
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end;
end;
CM_STOP: begin //3020 在走 动作结束时接收到
//SendUpdateMsg(Self, 65535, 0, m_nCurrX, m_nCurrY, 0, '');
SendSocket(nil, sSTATUS_GOOD + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrX));
SendRefMsg(SM_204, 0, 0, 0, 0, '');
end;
SM_204: begin
if ProcessMsg.BaseObject <> Self then
SendDefMessage(SM_204, Integer(ProcessMsg.BaseObject), 0, 0, 0, '');
end;
CM_3021: begin //作揖动作
SendRefMsg(RM_3021, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
end;
RM_3021: begin
if ProcessMsg.BaseObject <> Self then
SendDefMessage(SM_3021, Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.wParam, '');
end;
(*
CM_HORSERUN: begin //3009 //骑马走
if ClientHorseRunXY(ProcessMsg.wIdent, ProcessMsg.nParam1 {x},
ProcessMsg.nParam2 {y}, ProcessMsg.boLateDelivery, dwDelayTime) then begin
m_dwActionTick := GetTickCount;
SendSocket(nil, sSTATUS_GOOD + IntToStr(ProcessMsg.nParam1) + '/' + IntToStr(ProcessMsg.nParam2));
end else begin
if (not g_Config.boDisableM2SpeedCtrl) then begin
if dwDelayTime = 0 then begin
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end else begin
nMsgCount := GetRunMsgCount();
if nMsgCount >= g_Config.nMaxRunMsgCount then begin
Inc(m_nOverSpeedCount);
if m_nOverSpeedCount > g_Config.nOverSpeedKickCount then begin
if g_Config.boKickOverSpeed then begin
SysMsg(g_sKickClientUserMsg {'请勿使用非法软件!!!'}, c_Red, t_Hint);
m_boEmergencyClose := True;
end;
if g_Config.boViewHackMessage then
MainOutMessage(Format(g_sRunOverSpeed, [m_sCharName, dwDelayTime, nMsgCount]));
end;
//如果超速则发送攻击失败信息
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
if m_boTestSpeedMode then
SysMsg(Format(sSpeedExcept, [ProcessMsg.wIdent, dwDelayTime]), c_Red, t_Hint);
end else begin
if m_boTestSpeedMode then
SysMsg(Format(sOpDelay, [ProcessMsg.wIdent, dwDelayTime]), c_Red, t_Hint);
SendDelayMsg(Self, ProcessMsg.wIdent, ProcessMsg.wParam,
ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.nParam3, '', dwDelayTime);
Result := False;
end;
end;
end else
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end;
end;
*)
CM_SITDOWN: begin //3012
if ClientSitDownHit(ProcessMsg.nParam1, ProcessMsg.nParam2,
ProcessMsg.wParam, dwDelayTime) then begin
m_dwActionTick := GetTickCount();
SendSocket(nil, sSTATUS_GOOD + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end else begin
if (not g_Config.boDisableM2SpeedCtrl) then begin
if dwDelayTime = 0 then begin
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end else begin
nMsgCount := GetSiteDownMsgCount();
if nMsgCount >= g_Config.nMaxSitDonwMsgCount then begin
Inc(m_nOverSpeedCount);
if m_nOverSpeedCount > g_Config.nOverSpeedKickCount then begin
if g_Config.boKickOverSpeed then begin
SysMsg(g_sKickClientUserMsg {'请勿使用非法软件!!!'}, c_Red, t_Hint);
m_boEmergencyClose := True;
end;
if g_Config.boViewHackMessage then
MainOutMessage(Format(g_sBunOverSpeed, [m_sCharName, dwDelayTime, nMsgCount]));
end;
//如果超速则发送攻击失败信息
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end else begin
if dwDelayTime < g_Config.dwDropOverSpeed then begin
SendSocket(nil, sSTATUS_GOOD + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
if m_boTestSpeedMode then
SysMsg(Format(sSpeedExcept, [ProcessMsg.wIdent, dwDelayTime]), c_Red, t_Hint);
end else begin
if m_boTestSpeedMode then
SysMsg(Format(sOpDelay, [ProcessMsg.wIdent, dwDelayTime]), c_Red, t_Hint);
SendDelayMsg(Self, ProcessMsg.wIdent, ProcessMsg.wParam,
ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.nParam3, '', dwDelayTime);
Result := False;
end;
end;
end;
end else
SendSocket(nil, sSTATUS_FAIL + IntToStr(m_nCurrX) + '/' + IntToStr(m_nCurrY));
end;
end;
RM_170: begin //化身蝙蝠
m_defMsg := MakeDefaultMsg(SM_170, Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.wParam);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end;
CM_SAY: begin //3030 //说
if ProcessMsg.sMsg <> '' then begin
ProcessUserLineMsg(ProcessMsg.sMsg, ProcessMsg.wParam);
end;
end;
CM_PASSWORD: begin //仓库密码
ProcessClientPassword(ProcessMsg);
end;
RM_HORSERUN: begin //10003 004D860A //骑马跑
if TBaseObject(ProcessMsg.BaseObject) <> Self then begin
m_defMsg := MakeDefaultMsg(SM_HORSERUN,
Integer(ProcessMsg.BaseObject), ProcessMsg.nParam1,
ProcessMsg.nParam2, MakeWord(ProcessMsg.wParam,
TBaseObject(ProcessMsg.BaseObject).m_nLight));
CharDescEx.Feature := TBaseObject(ProcessMsg.BaseObject).GetFeature(Self);
CharDescEx.Status := TBaseObject(ProcessMsg.BaseObject).m_nCharStatus;
CharDescEx.Featurex := GetMaxHPCent(TBaseObject(ProcessMsg.BaseObject));
s1C := EnCodeBuffer(@CharDescEx, SizeOf(CharDescEx));
nObjCount := GetCharColor(TBaseObject(ProcessMsg.BaseObject));
if ProcessMsg.sMsg <> '' then
s1C := s1C + (EnCodeString(ProcessMsg.sMsg + '/' +
IntToStr(nObjCount)));
SendSocket(@m_defMsg, s1C);
end;
end;
RM_HEAVYHIT: begin //004D88CD //烈火
if TBaseObject(ProcessMsg.BaseObject) <> Self then begin
m_defMsg := MakeDefaultMsg(SM_HEAVYHIT,
Integer(ProcessMsg.BaseObject), ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.wParam);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end;
end;
RM_BIGHIT: begin //004D893A //半月
if TBaseObject(ProcessMsg.BaseObject) <> Self then begin
m_defMsg := MakeDefaultMsg(SM_BIGHIT, Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.wParam);
SendSocket(@m_defMsg, '');
end;
end;
RM_POWERHIT: begin
// //if TBaseObject(ProcessMsg.BaseObject) <> Self then begin
m_defMsg := MakeDefaultMsg(SM_POWERHIT,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.wParam);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
// //end;
end;
$1213: begin //打开输入对话框
m_defMsg := MakeDefaultMsg($1213, Integer(ProcessMsg.BaseObject),
ProcessMsg.wParam, 0, 0);
SendSocket(@m_defMsg, EnCodeString(ProcessMsg.sMsg));
end;
$6891: begin //客户端输入数据保存和执行下一步代码
ClientInput(ProcessMsg.nParam1, DeCodeString(ProcessMsg.sMsg));
end;
197: begin //刻回城石 197 Param 0 P1 1073750219 P2 512 P3 0 Msg
RecordHomeXY(ProcessMsg.nParam1, HiByte(ProcessMsg.nParam2));
end;
1289: begin
RecordHomeXY(ProcessMsg.nParam1, ProcessMsg.sMsg); //完美回城仙石
end;
1300: begin
ClientPerfectStoreMoveHome(ProcessMsg.nParam1, ProcessMsg.nParam2);
end;
$8810: begin //刻回城石、存放宝石 确认等
ClientNamedStore(ProcessMsg.nParam1, MakeLong(ProcessMsg.nParam2, ProcessMsg.nParam3));
end;
$8850: begin //弹出刻回城石的对话框
m_defMsg := MakeDefaultMsg($8850, 0, 0, 0, 0);
SendSocket(@m_defMsg, EnCodeString(ProcessMsg.sMsg));
end;
$00C6: begin // 198 弹出拆分圣灵精华的对话框
{$IF USESDK = DEBUG}
MainOutMessage(Format('%d-%d-%d-%d-%d-%d %s',
[Integer(ProcessMsg.BaseObject),
ProcessMsg.wIdent,
ProcessMsg.wParam,
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.nParam3,
ProcessMsg.sMsg]));
{$IFEND}
//2014/7/23 18:23:52 220118016-198-0-14350832-2-0
if ProcessMsg.wParam = 0 then begin
if (ProcessMsg.nParam1 < 100) then begin
m_defMsg := MakeDefaultMsg($00C6,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.wParam);
SendSocket(@m_defMsg, '');
end else
ClientSplitItem(ProcessMsg.nParam1, ProcessMsg.nParam2, False);
end else
ClientSplitItem(ProcessMsg.nParam1, ProcessMsg.nParam2, True);
end;
CM_QUERYSLAVER: begin //查看宝宝属性
ClientQuerySlaverState;
end;
$9590: begin //刻石头结果
m_defMsg := MakeDefaultMsg($9590, ProcessMsg.wParam, ProcessMsg.nParam1, 0, 0);
SendSocket(@m_defMsg, EnCodeString(ProcessMsg.sMsg));
end;
CM_GEMCOUNT: begin
ClientQueryBaoshi;
end;
CM_PETEQUIPUP: begin
ClientPetEquipUp(ProcessMsg.nParam1, MakeLong(ProcessMsg.nParam3, ProcessMsg.wParam), ProcessMsg.sMsg);
end;
CM_GEMCONDENSE: begin //宝石凝练 <我要凝炼宝石/@@gemcondense>
ClientGemItems(ProcessMsg.nParam1, ProcessMsg.wParam, ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg);
end;
CM_ORIGINALSTONE: begin
ClientOriginalStoneSmelt(ProcessMsg.nParam1, ProcessMsg.wParam, ProcessMsg.nParam2, ProcessMsg.sMsg);
end;
CM_GEMSMELT: begin
ClientGemSmelt(ProcessMsg.wParam, LoByte(ProcessMsg.nParam2), HiByte(ProcessMsg.nParam2), ProcessMsg.nParam3, ProcessMsg.sMsg);
end;
CM_REFINE: begin
ClientRefineItems(ProcessMsg.nParam2, ProcessMsg.nParam1, MakeLong(ProcessMsg.nParam3, ProcessMsg.wParam), ProcessMsg.sMsg);
end;
CM_FUSEEQUIP: begin
ClientfuseequipItem(ProcessMsg.nParam2, ProcessMsg.nParam1, MakeLong(ProcessMsg.nParam3, ProcessMsg.wParam), ProcessMsg.sMsg);
end;
CM_SENDBLESS: begin
ClientSendBlessMsg(ProcessMsg.nParam1, ProcessMsg.nParam3, DeCodeString(ProcessMsg.sMsg));
end;
RM_MOVEFAIL: begin //移动失败
m_defMsg := MakeDefaultMsg(SM_MOVEFAIL, Integer(Self), m_nCurrX, m_nCurrY, m_btDirection);
CharDescEx.Feature := TBaseObject(ProcessMsg.BaseObject).GetFeature(Self);
CharDescEx.Status := TBaseObject(ProcessMsg.BaseObject).m_nCharStatus;
CharDescEx.Featurex := GetMaxHPCent(TBaseObject(ProcessMsg.BaseObject));
s1C := EnCodeBuffer(@CharDescEx, SizeOf(CharDescEx));
nObjCount := GetCharColor(TBaseObject(ProcessMsg.BaseObject));
if ProcessMsg.sMsg <> '' then
s1C := s1C + (EnCodeString(ProcessMsg.sMsg + '/' + IntToStr(nObjCount)));
SendSocket(@m_defMsg, s1C);
end;
RM_LONGHIT: begin
if TBaseObject(ProcessMsg.BaseObject) <> Self then begin
m_defMsg := MakeDefaultMsg(SM_LONGHIT, Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.wParam);
SendSocket(@m_defMsg, '');
end;
end;
RM_WIDEHIT: begin
if TBaseObject(ProcessMsg.BaseObject) <> Self then begin
m_defMsg := MakeDefaultMsg(SM_WIDEHIT, Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.wParam);
SendSocket(@m_defMsg, '');
end;
end;
RM_FIREHIT: begin
if TBaseObject(ProcessMsg.BaseObject) <> Self then begin
m_defMsg := MakeDefaultMsg(SM_FIREHIT, Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.wParam);
SendSocket(@m_defMsg, '');
end;
end;
RM_CRSHIT: begin
if TBaseObject(ProcessMsg.BaseObject) <> Self then begin
m_defMsg := MakeDefaultMsg(SM_CRSHIT, Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.wParam);
SendSocket(@m_defMsg, '');
end;
end;
RM_42: begin
if TBaseObject(ProcessMsg.BaseObject) <> Self then begin
m_defMsg := MakeDefaultMsg(SM_42, Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.wParam);
SendSocket(@m_defMsg, '');
end;
end;
RM_43: begin
if TBaseObject(ProcessMsg.BaseObject) <> Self then begin
m_defMsg := MakeDefaultMsg(SM_43, Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.wParam);
SendSocket(@m_defMsg, '');
end;
end;
RM_60: begin
if TBaseObject(ProcessMsg.BaseObject) <> Self then begin
m_defMsg := MakeDefaultMsg(SM_60, Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.wParam);
SendSocket(@m_defMsg, '');
end;
end;
RM_STRUCK, //有目标被攻击
RM_STRUCK_MAG,
RM_STRUCK_NEWMAG1: begin
if ProcessMsg.nParam1 > 0 then begin
if (ProcessMsg.BaseObject <> nil) and (TBaseObject(ProcessMsg.BaseObject) = Self) then begin //本人被攻击,处理PK标志等
if (TBaseObject(ProcessMsg.nParam3) {Attacker} <> nil) then begin
if TBaseObject(ProcessMsg.nParam3) {Attacker}.m_btRaceServer = RC_PLAYOBJECT then begin //人攻击人
SetPKFlag(TBaseObject(ProcessMsg.nParam3) {Attacker});
end;
SetLastHiter(TBaseObject(ProcessMsg.nParam3) {Attacker});
end;
if (g_CastleManager.IsCastleMember(Self) <> nil) and (TBaseObject(ProcessMsg.nParam3) {Attacker} <> nil) then begin
TBaseObject(ProcessMsg.nParam3) {Attacker}.m_boGuardCanAttack := True;
TBaseObject(ProcessMsg.nParam3) {Attacker}.m_dwGuardAttackTick := GetTickCount();
end;
m_nHealthTick := 0;
m_nSpellTick := 0;
Dec(m_nPerHealth);
Dec(m_nPerSpell);
m_dwStruckTick := GetTickCount();
end;
if ((ProcessMsg.wParam in [ET_FIRERAIN, ET_GODFIRERAIN, ET_EVILFIRERAIN]) or (g_Config.boDisableStruck)) and (ProcessMsg.wIdent <> RM_STRUCK_NEWMAG1) then begin
//火雨不发送受伤动做
end else begin
SendStruckMsg(ProcessMsg.wIdent,
TBaseObject(ProcessMsg.BaseObject),
TBaseObject(ProcessMsg.nParam3),
ProcessMsg.nParam1,
ProcessMsg.wParam);
end;
end;
end;
RM_ASSISTSKILL: if not m_boPneuma then begin
MagicEffect.nMonID := ProcessMsg.nParam1;
MagicEffect.nX := LoWord(ProcessMsg.nParam3);
MagicEffect.nY := HiWord(ProcessMsg.nParam3);
MagicEffect.nType := ProcessMsg.wParam;
m_defMsg := MakeDefaultMsg(SM_ASSISTSKILL, Integer(ProcessMsg.BaseObject), 0, 0, ProcessMsg.nParam2);
SendSocket(@m_defMsg, EnCodeBuffer(@MagicEffect, SizeOf(TMagicEffect)));
end;
RM_USEBINDLINGFU: begin
if not m_boPneuma then begin
m_defMsg := MakeDefaultMsg(SM_USEBINDLINGFU, Integer(ProcessMsg.BaseObject), ProcessMsg.wParam, ProcessMsg.nParam2, ProcessMsg.nParam3);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end;
end;
RM_25: begin
if ProcessMsg.BaseObject <> Self then begin
m_defMsg := MakeDefaultMsg(SM_25,
Integer(ProcessMsg.BaseObject),
LoWord(ProcessMsg.nParam1),
HiWord(ProcessMsg.nParam1),
ProcessMsg.wParam);
NewMagicEff.MagicID := ProcessMsg.nParam2;
NewMagicEff.ChrStatus := ProcessMsg.nParam3;
SendSocket(@m_defMsg, EnCodeBuffer(@NewMagicEff, SizeOf(TNewMagicEff)));
end;
end;
RM_DEATH: begin //死亡
CharDescEx.Feature := TBaseObject(ProcessMsg.BaseObject).GetFeature(Self);
CharDescEx.Status := TBaseObject(ProcessMsg.BaseObject).m_nCharStatus;
CharDescEx.Featurex := GetMaxHPCent(TBaseObject(ProcessMsg.BaseObject));
if ProcessMsg.nParam3 = 1 then begin
m_defMsg := MakeDefaultMsg(SM_NOWDEATH,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.wParam);
CharDescEx.Featurex := 0;
SendSocket(@m_defMsg, EnCodeBuffer(@CharDescEx, 9));
end else begin
m_defMsg := MakeDefaultMsg(SM_DEATH,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.wParam);
s1C := EnCodeBuffer(@CharDescEx, SizeOf(TCharDescEx));
if ProcessMsg.sMsg <> '' then begin
nObjCount := GetCharColor(TBaseObject(ProcessMsg.BaseObject));
sTmp := ProcessMsg.sMsg + '/' + IntToStr(nObjCount) + TBaseObject(ProcessMsg.BaseObject).GetCharTurnMsg;
s1C := s1C + EnCodeBuffer(@sTmp[1], Length(sTmp));
end;
SendSocket(@m_defMsg, s1C);
end;
end;
RM_DISAPPEAR: begin //消失
m_defMsg := MakeDefaultMsg(SM_DISAPPEAR,
Integer(ProcessMsg.BaseObject),
TBaseObject(ProcessMsg.BaseObject).m_nCurrX,
TBaseObject(ProcessMsg.BaseObject).m_nCurrY,
TBaseObject(ProcessMsg.BaseObject).m_btDirection);
SendSocket(@m_defMsg, '');
end;
RM_SITDOWN: begin //上马下马
m_defMsg := MakeDefaultMsg(SM_SITDOWN, Integer(ProcessMsg.BaseObject),
LoWord(ProcessMsg.nParam1),
HiWord(ProcessMsg.nParam1),
ProcessMsg.wParam);
if (ProcessMsg.sMsg <> '') then
SendSocket(@m_defMsg, ProcessMsg.sMsg) //支持骑战
else
SendSocket(@m_defMsg, EnCodeBuffer(@ProcessMsg.nParam2, 4));
end;
RM_205: begin //自己发的消息
m_defMsg := MakeDefaultMsg(SM_205, ProcessMsg.nParam3, 0, 0, 0);
SendSocket(@m_defMsg, '');
end;
RM_PETBAGITEMS: begin
SendPetBagItems;
end;
RM_SKELETON: begin //10024 004D8D7B //被攻击
m_defMsg := MakeDefaultMsg(SM_SKELETON,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.wParam);
CharDescEx.Feature := TBaseObject(ProcessMsg.BaseObject).GetFeature(Self);
CharDescEx.Status := TBaseObject(ProcessMsg.BaseObject).m_nCharStatus;
CharDescEx.Featurex := GetMaxHPCent(TBaseObject(ProcessMsg.BaseObject));
s1C := EnCodeBuffer(@CharDescEx, SizeOf(CharDescEx));
nObjCount := GetCharColor(TBaseObject(ProcessMsg.BaseObject));
if ProcessMsg.sMsg <> '' then
s1C := s1C + (EnCodeString(ProcessMsg.sMsg + '/' + IntToStr(nObjCount)));
SendSocket(@m_defMsg, s1C);
end;
RM_USERNAME: begin //10043 004D9587 //查询用户名
m_defMsg := MakeDefaultMsg(SM_USERNAME, Integer(ProcessMsg.BaseObject),
GetCharColor(TBaseObject(ProcessMsg.BaseObject)), 0, 0);
SendSocket(@m_defMsg, EnCodeString(ProcessMsg.sMsg));
end;
RM_WINEXP: begin //10044//获得经验
m_defMsg := MakeDefaultMsg(SM_WINEXP, Integer(m_Abil.Exp), LoWord(ProcessMsg.nParam1), HiWord(ProcessMsg.nParam1), 0);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
if LongWord(ProcessMsg.nParam1) >= 10000 then begin
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
end;
end;
RM_LEVELUP: begin //10045 004D965B //等级提升
i := Integer(Self);
m_defMsg := MakeDefaultMsg(SM_LEVELUP, m_Abil.Exp, _MIN(m_Abil.level, g_Config.nClientShowLevelLimit), LoWord(i), HiWord(i));
SendSocket(@m_defMsg, EnCodeBuffer(@m_Abil.Exp, 8)); //防止客户端在升级后显示英雄榜
RecalcAbilitys();
SendUpdateMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendUpdateMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
end;
RM_CHANGENAMECOLOR: begin //10046 004D9555 //名字颜色改变
SendDefMessage(SM_CHANGENAMECOLOR,
Integer(ProcessMsg.BaseObject),
GetCharColor(TBaseObject(ProcessMsg.BaseObject)),
0,
0,
'');
end;
RM_LOGON: begin //10050 //登陆
if m_PEnvir.m_MapFlag.boDARK then nObjCount := 1
else begin
case m_nBright of
1: nObjCount := 0;
3: nObjCount := 1;
else nObjCount := 1;
end;
end;
if m_PEnvir.m_MapFlag.boDAY then nObjCount := 0;
SendLogon();
ClientQueryUserName(Self, m_nCurrX, m_nCurrY);
RefUserState();
SendMapDescription();
nObjCount := 1;
SendDefMessage(SM_VERSION_FAIL, $FFFFFFFFF2D505D7, 0, 0, 0, '');
end;
RM_HEAR,
RM_WHISPER,
RM_CRY,
RM_SYSMESSAGE,
RM_GROUPMESSAGE,
RM_SYSMESSAGE2,
RM_GUILDMESSAGE,
RM_SYSMESSAGE3,
RM_MERCHANTSAY,
RM_TITLEMSM,
RM_CLANMESSAGE,
RM_COLORTASKSAY:
begin
case ProcessMsg.wIdent of
RM_HEAR: m_defMsg := MakeDefaultMsg(SM_HEAR,
Integer(ProcessMsg.BaseObject),
MakeWord(ProcessMsg.nParam1, ProcessMsg.nParam2),
0,
ProcessMsg.nParam3); //10030
RM_WHISPER: m_defMsg := MakeDefaultMsg(SM_WHISPER,
Integer(ProcessMsg.BaseObject),
MakeWord(ProcessMsg.nParam1, ProcessMsg.nParam2),
0,
ProcessMsg.wParam); //10031
RM_CRY: m_defMsg := MakeDefaultMsg(SM_HEAR,
Integer(ProcessMsg.BaseObject),
MakeWord(ProcessMsg.nParam1, ProcessMsg.nParam2),
0,
1); //10032
RM_SYSMESSAGE: m_defMsg := MakeDefaultMsg(SM_SYSMESSAGE,
Integer(ProcessMsg.BaseObject),
MakeWord(ProcessMsg.nParam1, ProcessMsg.nParam2),
0,
1); //10100 红色
RM_GROUPMESSAGE: m_defMsg := MakeDefaultMsg(SM_SYSMESSAGE,
Integer(ProcessMsg.BaseObject),
MakeWord(ProcessMsg.nParam1, ProcessMsg.nParam2),
0,
1); //10102
RM_GUILDMESSAGE: m_defMsg := MakeDefaultMsg(SM_GUILDMESSAGE,
Integer(ProcessMsg.BaseObject),
MakeWord(ProcessMsg.nParam1, ProcessMsg.nParam2),
0,
1); //10104
RM_MERCHANTSAY: m_defMsg := MakeDefaultMsg(SM_MERCHANTSAY,
Integer(ProcessMsg.BaseObject),
MakeWord(ProcessMsg.nParam1, ProcessMsg.nParam2),
ProcessMsg.nParam3,
1); //10126
RM_TITLEMSM: m_defMsg := MakeDefaultMsg(SM_SYSMESSAGE,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.nParam3);
RM_CLANMESSAGE: m_defMsg := MakeDefaultMsg(SM_CLANMESSAGE,
1,
MakeWord(ProcessMsg.nParam1, ProcessMsg.nParam2),
0,
0);
RM_COLORTASKSAY: m_defMsg := MakeDefaultMsg(CM_COLORTASKSAY,
Integer(ProcessMsg.BaseObject),
0,
0,
ProcessMsg.wParam);
end;
if not m_boPneuma or (ProcessMsg.wIdent = RM_SYSMESSAGE) then
//2006/7/12 防止元神听到说话内容而出现消息重复
SendSocket(@m_defMsg, EnCodeString(ProcessMsg.sMsg));
end;
RM_FLYMSG: if not m_boPneuma then begin
m_defMsg := MakeDefaultMsg(SM_FLYMSG, 0, ProcessMsg.wParam, 0,
MakeWord(0, ProcessMsg.nParam1));
SendSocket(@m_defMsg, EnCodeString(ProcessMsg.sMsg));
end;
RM_510: begin
m_defMsg := MakeDefaultMsg(SM_510, Integer(ProcessMsg.BaseObject),
ProcessMsg.wParam, ProcessMsg.nParam1, ProcessMsg.nParam2);
SendSocket(@m_defMsg, EnCodeString(ProcessMsg.sMsg));
end;
RM_SENDBAGSIZE: begin
SendDefMessage(SM_BAGSIZE, Integer(Self), 0, m_nBagSize, 0, '');
end;
RM_ABILITY: begin
ClientQueryAbility();
end;
RM_HIDE: begin
m_defMsg := MakeDefaultMsg(SM_HIDE,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.nParam3);
SendSocket(@m_defMsg, '');
end;
RM_DAYCHANGING: begin //10053
m_defMsg := MakeDefaultMsg(SM_DAYCHANGING, $FFFFFFFF, m_nBright,
m_PEnvir.m_MapFlag.nWeather, m_PEnvir.m_MapFlag.wWindSpeed);
nObjCount := m_PEnvir.m_MapFlag.dwWindColor;
SendSocket(@m_defMsg, EnCodeBuffer(@nObjCount, SizeOf(Integer)));
end;
RM_FIREBURN: begin
m_defMsg := MakeDefaultMsg(SM_FireBurn,
Integer(ProcessMsg.BaseObject),
LoWord(ProcessMsg.nParam1),
HiWord(ProcessMsg.nParam1),
ProcessMsg.wParam);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end;
RM_ITEMSHOW: begin
if pTMapItem(ProcessMsg.nParam1).UserItem.btItemExt[29] > 0 then //新增支持掉落物品名字颜色
begin
g_SmallPacketManage.Init();
g_SmallPacketManage.WriteString(ProcessMsg.sMsg, 4);
g_SmallPacketManage.WriteByte(0);
g_SmallPacketManage.WriteByte(pTMapItem(ProcessMsg.nParam1).UserItem.btItemExt[29]);
SendDefMessage(SM_ITEMSHOW,
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.nParam3,
ProcessMsg.wParam,
g_SmallPacketManage.GetMsg, True);
end else begin
SendDefMessage(SM_ITEMSHOW,
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.nParam3,
ProcessMsg.wParam,
ProcessMsg.sMsg);
end;
UpdateVisibleItem(ProcessMsg.nParam2, ProcessMsg.nParam3, pTMapItem(ProcessMsg.nParam1));
end;
RM_ITEMHIDE: begin
SendDefMessage(SM_ITEMHIDE,
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.nParam3,
0,
'');
end;
RM_DOOROPEN: begin //10112 004D9D6A
SendDefMessage(SM_OPENDOOR_OK,
0,
ProcessMsg.nParam1, {x}
ProcessMsg.nParam2, {y}
0,
'');
end;
RM_DOORCLOSE: begin //10113 004D9D8A
SendDefMessage(SM_CLOSEDOOR,
0,
ProcessMsg.nParam1,
ProcessMsg.nParam2,
0,
'');
end;
RM_SENDUSEITEMS: begin
SendUseitems();
SendEntopticItems;
SendTigerItem();
end;
RM_QUERYPETSOUL: begin
//检测摆摊灵兽、凤凰探宝、魂佑附体
CheckPackPetShop();
ClientQueryPetSoulInfo; //发送魂佑灵兽信息
end;
CM_QUERYPETSOULITEM: begin
ClientQueryPetSoulItem(ProcessMsg.nParam1, ProcessMsg.nParam2);
end;
RM_WEIGHTCHANGED: begin //10115 004D9DC4
SendDefMessage(SM_WEIGHTCHANGED,
m_WAbil.Weight,
m_WAbil.WearWeight,
m_WAbil.HandWeight,
0,
'');
end;
RM_FEATURECHANGED: begin //10116
// if ProcessMsg.BaseObject <> Self then begin
m_defMsg := MakeDefaultMsg(SM_FEATURECHANGED,
Integer(ProcessMsg.BaseObject),
LoWord(ProcessMsg.nParam1),
HiWord(ProcessMsg.nParam1),
ProcessMsg.wParam);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
// end;
end;
RM_CLEAROBJECTS: begin //10117
SendDefMessage(SM_CLEAROBJECTS,
0,
0,
0,
0,
'');
end;
RM_CHANGEMAP: begin
try
if m_PEnvir = nil then begin
MainOutMessage(sHint5);
Exit;
end;
SendDefMessage(SM_CHANGEMAP, Integer(Self), m_nCurrX, m_nCurrY, 10240 {m_btDirection}, ProcessMsg.sMsg);
RefUserState();
SendMapDescription();
SendMsg(Self, RM_DAYCHANGING, 0, 0, 0, 0, '');
if ProcessMsg.wParam = 0 then begin //过地图,下马
if not CheckMapRideOn(m_PEnvir) then ClientRideOff;
if not m_PEnvir.m_MapFlag.boCanReCallEvil then begin //不允许带心魔
ClearEvilFollower(6);
end;
//雪莲过地图失效
if g_Config.boChMapSaussureaFail then begin
if m_nSuperIncHealth > 0 then begin
SendMsg(Self, RM_510, 0, 0, 1, 0, '');
m_nSuperIncHealth := 0;
end;
if m_nSuperIncSpell > 0 then begin
m_nSuperIncSpell := 0;
SendMsg(Self, RM_510, 0, 0, 2, 0, '');
end;
end;
end;
if m_Pet <> nil then begin
m_Pet.m_nTargetX := -1;
m_Pet.m_nTargetY := -1;
end;
m_nPetTargetX := -1;
m_nPetTargetY := -1;
except
end;
end;
RM_BUTCH: begin //10119
if ProcessMsg.BaseObject <> nil then begin
m_defMsg := MakeDefaultMsg(SM_BUTCH,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.wParam);
SendSocket(@m_defMsg, '');
end;
end;
RM_MAGICFIRE: begin
m_defMsg := MakeDefaultMsg(SM_MAGICFIRE,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1, //x
ProcessMsg.nParam2, //y
ProcessMsg.wParam); //Effect
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end;
RM_MAGICFIREFAIL: begin //10121
SendDefMessage(SM_MAGICFIRE_FAIL, Integer(ProcessMsg.BaseObject), 0, 0,
0, '');
end;
RM_SENDMYMAGIC: SendUseMagic(); //10122
RM_MAGIC_LVEXP: begin //10123
SendDefMessage(SM_MAGIC_LVEXP,
ProcessMsg.nParam1,
ProcessMsg.nParam2,
LoWord(ProcessMsg.nParam3),
HiWord(ProcessMsg.nParam3),
'');
end;
RM_DURACHANGE: begin //10125
SendDefMessage(SM_DURACHANGE,
ProcessMsg.nParam1,
ProcessMsg.wParam,
LoWord(ProcessMsg.nParam2),
HiWord(ProcessMsg.nParam2),
'');
end;
RM_MERCHANTDLGCLOSE: begin //10127
if ProcessMsg.wParam = 0 then
SendDefMessage(SM_MERCHANTDLGCLOSE,
ProcessMsg.nParam1,
0,
0,
0,
'')
else
SendDefMessage(SM_KAITIANTOWERCLOSE,
ProcessMsg.nParam1,
0,
0,
0,
'')
end;
RM_SENDGOODSLIST: begin
if ProcessMsg.nParam3 = 1 then begin
m_defMsg := MakeDefaultMsg(3039, ProcessMsg.nParam1, ProcessMsg.nParam2, 0, 0);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end else if ProcessMsg.nParam3 = 2 then begin
m_defMsg := MakeDefaultMsg(3039, ProcessMsg.nParam1, ProcessMsg.nParam2, 5, 0);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end else
SendDefMessage(SM_SENDGOODSLIST, ProcessMsg.nParam1, ProcessMsg.nParam2, 0, ProcessMsg.wParam, ProcessMsg.sMsg);
end;
RM_SENDINGOTGOODSLIST: begin
SendDefMessage(SM_SENDINGOTGOODSLIST,
ProcessMsg.nParam1,
ProcessMsg.nParam2,
0,
0,
ProcessMsg.sMsg);
end;
RM_SENDUSERSELL: begin //10129
SendDefMessage(SM_SENDUSERSELL,
ProcessMsg.nParam1,
ProcessMsg.nParam2,
0,
0,
ProcessMsg.sMsg);
end;
RM_SENDBUYPRICE: begin //10130 004D9BAB
SendDefMessage(SM_SENDBUYPRICE,
ProcessMsg.nParam1,
0,
0,
0,
'');
end;
RM_USERSELLITEM_OK: begin //10131 004D9BC8
SendDefMessage(SM_USERSELLITEM_OK,
ProcessMsg.nParam1,
0,
0,
0,
'');
end;
RM_USERSELLITEM_FAIL: begin //10132 004D9BC8
SendDefMessage(SM_USERSELLITEM_FAIL,
ProcessMsg.nParam1,
0,
0,
0,
'');
end;
RM_BUYITEM_SUCCESS: begin //10133 004D9C02
SendDefMessage(SM_BUYITEM_SUCCESS,
ProcessMsg.nParam1,
LoWord(ProcessMsg.nParam2),
HiWord(ProcessMsg.nParam2),
0,
'');
end;
RM_BUYITEM_FAIL: begin //10134 004D9C2C
SendDefMessage(SM_BUYITEM_FAIL,
ProcessMsg.nParam1,
0,
0,
0,
'');
end;
RM_SENDDETAILGOODSLIST: begin //10135 004D9C83
m_defMsg := MakeDefaultMsg(SM_SENDDETAILGOODSLIST,
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.nParam3,
ProcessMsg.wParam);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end;
RM_GOLDCHANGED: begin //10136
SendDefMessage(SM_GOLDCHANGED,
ProcessMsg.nParam1,
ProcessMsg.wParam,
0,
0,
'');
end;
RM_GAMEGOLDCHANGED: begin
SendDefMessage(SM_GAMEGOLDCHANGED,
ProcessMsg.nParam1,
ProcessMsg.wParam,
0,
0,
'');
end;
RM_GUILDGOLDCHANGED: begin
SendDefMessage(SM_GUILDGOLDCHANGED,
ProcessMsg.nParam1,
0,
0,
0,
'');
end;
RM_COLLECTPOINT: begin
if m_nCollectPoint > 0 then
SendDefMessage(SM_COLLECTPOINT, m_nCollectPoint, 0, 0, 0, '');
end;
RM_LAMPCHANGEDURA: begin //10138
SendDefMessage(SM_LAMPCHANGEDURA,
ProcessMsg.nParam1,
0,
0,
0,
'');
end;
RM_CHARSTATUSCHANGED: begin
m_defMsg := MakeDefaultMsg(SM_CHARSTATUSCHANGED,
Integer(ProcessMsg.BaseObject),
LoWord(ProcessMsg.nParam1),
HiWord(ProcessMsg.nParam1),
ProcessMsg.wParam);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end;
RM_FENGHAO: begin //是否显示翅膀
SendDefMessage(SM_FENGHAO,
Integer(ProcessMsg.BaseObject),
ProcessMsg.wParam,
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.sMsg);
end;
RM_GROUPCANCEL: begin //10140 004D9F28
SendDefMessage(SM_GROUPCANCEL,
ProcessMsg.nParam1,
0,
0,
0,
'');
end;
RM_SENDUSERREPAIR,
RM_SENDUSERSREPAIR: begin //10141 004D9B3C
SendDefMessage(SM_SENDUSERREPAIR,
ProcessMsg.nParam1,
ProcessMsg.nParam2,
0,
0,
'');
end;
RM_USERREPAIRITEM_OK: begin //10143 004D9CA6
SendDefMessage(SM_USERREPAIRITEM_OK,
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.nParam3,
0,
'');
end;
RM_SENDREPAIRCOST: begin //10142 004D9CE4
if ProcessMsg.wParam <> 0 then
SendDefMessage(SM_SENDREPAIRCOST,
ProcessMsg.nParam1,
10 + ProcessMsg.wParam,
0,
0,
'')
else
SendDefMessage(SM_SENDREPAIRCOST,
ProcessMsg.nParam1,
0,
0,
0,
'');
end;
RM_USERREPAIRITEM_FAIL: begin //10144 004D9CC7
SendDefMessage(SM_USERREPAIRITEM_FAIL,
ProcessMsg.nParam1,
0,
0,
0,
'');
end;
RM_USERSTORAGEITEM: begin //10146 004D9B5B
SendDefMessage(SM_SENDUSERSTORAGEITEM,
ProcessMsg.nParam1,
ProcessMsg.nParam2,
0,
0,
'');
end;
RM_USERGETBACKITEM: begin //10147 SM_SAVEITEMLIST
SendSaveItemList(ProcessMsg.nParam1, ProcessMsg.wParam = 1);
end;
RM_SENDDELITEMLIST: begin //10148 SM_DELITEMS
SendDelItemList(TStringList(ProcessMsg.nParam1));
TStringList(ProcessMsg.nParam1).free;
end;
RM_USERMAKEDRUGITEMLIST: begin //10149
SendDefMessage(SM_SENDUSERMAKEDRUGITEMLIST,
ProcessMsg.nParam1,
ProcessMsg.nParam2,
0,
0,
ProcessMsg.sMsg);
end;
RM_MAKEDRUG_SUCCESS: begin //10150 004D9C49
SendDefMessage(SM_MAKEDRUG_SUCCESS,
ProcessMsg.nParam1,
0,
0,
0,
'');
end;
RM_MAKEDRUG_FAIL: begin //10151 004D9C66
SendDefMessage(SM_MAKEDRUG_FAIL,
ProcessMsg.nParam1,
0,
0,
0,
'');
end;
RM_ALIVE: begin //10153 004D8E09
m_defMsg := MakeDefaultMsg(SM_ALIVE,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.wParam);
CharDescEx.Feature :=
TBaseObject(ProcessMsg.BaseObject).GetFeature(Self);
CharDescEx.Status := TBaseObject(ProcessMsg.BaseObject).m_nCharStatus;
CharDescEx.Featurex := GetMaxHPCent(TBaseObject(ProcessMsg.BaseObject));
SendSocket(@m_defMsg, EnCodeBuffer(@CharDescEx, SizeOf(TCharDescEx)));
end;
RM_DIGUP: begin //10200 004D91B4
m_defMsg := MakeDefaultMsg(SM_DIGUP,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1,
ProcessMsg.nParam2,
MakeWord(ProcessMsg.wParam,
TBaseObject(ProcessMsg.BaseObject).m_btGender));
MessageBodyWL.lParam1 := TBaseObject(ProcessMsg.BaseObject).GetFeature(Self);
MessageBodyWL.lParam2 := TBaseObject(ProcessMsg.BaseObject).m_nCharStatus;
MessageBodyWL.lTag1 := ProcessMsg.nParam3;
MessageBodyWL.lTag2 := 0;
s1C := EnCodeBuffer(@MessageBodyWL, SizeOf(TMessageBodyWL));
SendSocket(@m_defMsg, s1C);
end;
RM_DIGDOWN: begin //10201 004D9254
m_defMsg := MakeDefaultMsg(SM_DIGDOWN,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1,
ProcessMsg.nParam2,
0);
SendSocket(@m_defMsg, '');
end;
RM_FLYAXE: begin //10202 004D9358
if TBaseObject(ProcessMsg.nParam3) <> nil then begin
MessageBodyW.Param1 := TBaseObject(ProcessMsg.nParam3).m_nCurrX;
MessageBodyW.Param2 := TBaseObject(ProcessMsg.nParam3).m_nCurrY;
MessageBodyW.Tag1 := LoWord(ProcessMsg.nParam3);
MessageBodyW.Tag2 := HiWord(ProcessMsg.nParam3);
m_defMsg := MakeDefaultMsg(SM_FLYAXE,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.wParam);
SendSocket(@m_defMsg, EnCodeBuffer(@MessageBodyW, SizeOf(TMessageBodyW)));
end;
end;
RM_2BDC: begin //魔眼攻击
if TBaseObject(ProcessMsg.nParam3) <> nil then begin
m_defMsg := MakeDefaultMsg($2BDC,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1, //X
ProcessMsg.nParam2, //Y
ProcessMsg.wParam); //Dir
nObjCount := ProcessMsg.nParam3;
SendSocket(@m_defMsg, EnCodeBuffer(@nObjCount, SizeOf(Integer)));
end;
end;
RM_LIGHTING: begin //10204 004D93FD
if TBaseObject(ProcessMsg.nParam3) <> nil then begin
MessageBodyWL.lParam1 := TBaseObject(ProcessMsg.nParam3).m_nCurrX;
MessageBodyWL.lParam2 := TBaseObject(ProcessMsg.nParam3).m_nCurrY;
MessageBodyWL.lTag1 := ProcessMsg.nParam3;
MessageBodyWL.lTag2 := ProcessMsg.wParam;
m_defMsg := MakeDefaultMsg(SM_LIGHTING,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1,
ProcessMsg.nParam2,
TBaseObject(ProcessMsg.BaseObject).m_btDirection);
SendSocket(@m_defMsg, EnCodeBuffer(@MessageBodyWL,
SizeOf(TMessageBodyWL)));
end;
end;
RM_10205: begin //10205 004D949A
SendDefMessage(SM_716,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1 {x},
ProcessMsg.nParam2 {y},
ProcessMsg.nParam3 {type},
'');
end;
RM_CHANGEGUILDNAME: begin
SendChangeGuildName();
end;
RM_TAKEON2: begin
SendDefMessage(SM_TAKEON2, ProcessMsg.nParam1, ProcessMsg.wParam, 0, 0, '');
end;
RM_SUBABILITY: begin
QuerySubAbility();
end;
RM_BUILDGUILD_OK: begin //10303 004D9F51
SendDefMessage(SM_BUILDGUILD_OK,
0,
0,
0,
0,
'');
end;
RM_BUILDGUILD_FAIL: begin //10304 004D9F6D
SendDefMessage(SM_BUILDGUILD_FAIL,
ProcessMsg.nParam1,
0,
0,
0,
'');
end;
RM_DONATE_OK: begin //10305 004D9FA7
SendDefMessage(SM_DONATE_OK,
ProcessMsg.nParam1,
0,
0,
0,
'');
end;
RM_DONATE_FAIL: begin //10306 004D9F8A
SendDefMessage(SM_DONATE_FAIL,
ProcessMsg.nParam1,
0,
0,
0,
'');
end;
RM_MYSTATUS: begin
SendDefMessage(SM_MYSTATUS, 0, GetMyStatus, 0, 0, '');
end;
RM_MENU_OK: begin //10309 004D9FC4
SendDefMessage(SM_MENU_OK,
ProcessMsg.nParam1,
0,
0,
0,
ProcessMsg.sMsg);
end;
RM_SPACEMOVE_FIRE,
RM_SPACEMOVE_FIRE2: begin //10330
if ProcessMsg.wIdent = RM_SPACEMOVE_FIRE then begin
m_defMsg := MakeDefaultMsg(SM_SPACEMOVE_HIDE,
Integer(ProcessMsg.BaseObject),
0,
0,
0);
end else begin
m_defMsg := MakeDefaultMsg(SM_SPACEMOVE_HIDE2,
Integer(ProcessMsg.BaseObject),
0,
0,
0);
end;
SendSocket(@m_defMsg, '');
end;
RM_SPACEMOVE_SHOW,
RM_SPACEMOVE_SHOW2: begin
if ProcessMsg.wIdent = RM_SPACEMOVE_SHOW then begin
m_defMsg := MakeDefaultMsg(SM_SPACEMOVE_SHOW,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1,
ProcessMsg.nParam2,
MakeWord(ProcessMsg.wParam,
TBaseObject(ProcessMsg.BaseObject).m_btGender));
end else begin
m_defMsg := MakeDefaultMsg(SM_SPACEMOVE_SHOW2,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1,
ProcessMsg.nParam2,
MakeWord(ProcessMsg.wParam,
TBaseObject(ProcessMsg.BaseObject).m_btGender));
end;
CharDescEx.Feature := TBaseObject(ProcessMsg.BaseObject).GetFeature(Self);
CharDescEx.Status := TBaseObject(ProcessMsg.BaseObject).m_nCharStatus;
CharDescEx.Featurex := GetMaxHPCent(TBaseObject(ProcessMsg.BaseObject));
s1C := EnCodeBuffer(@CharDescEx, SizeOf(TCharDescEx));
nObjCount := GetCharColor(TBaseObject(ProcessMsg.BaseObject));
if ProcessMsg.sMsg <> '' then begin
s1C := s1C + EnCodeString(ProcessMsg.sMsg + '/' +
IntToStr(nObjCount));
end;
SendSocket(@m_defMsg, s1C);
end;
RM_RECONNECTION: begin //10332
m_boReconnection := True;
SendDefMessage(SM_RECONNECT, 0, 0, 0, 0, ProcessMsg.sMsg);
end;
RM_HIDEEVENT: begin //10333
SendDefMessage(SM_HIDEEVENT,
ProcessMsg.nParam1,
ProcessMsg.wParam,
ProcessMsg.nParam2,
ProcessMsg.nParam3,
'');
end;
RM_SHOWEVENT: begin //10334
MessageBodyW.Param1 := HiWord(ProcessMsg.nParam2);
MessageBodyW.Param2 := 0;
MessageBodyW.Tag1 := 0;
MessageBodyW.Tag2 := 0;
m_defMsg := MakeDefaultMsg(SM_SHOWEVENT,
ProcessMsg.nParam1, //对象ID
ProcessMsg.wParam, //MapEvent.m_nEventType
LoWord(ProcessMsg.nParam2), //X
ProcessMsg.nParam3); //Y
SendSocket(@m_defMsg, EnCodeBuffer(@MessageBodyW,
SizeOf(TMessageBodyW)));
end;
RM_ADJUST_BONUS: begin
SendAdjustBonus();
end;
RM_10401: begin
ChangeServerMakeSlave(pTSlaveInfo(ProcessMsg.nParam1));
Dispose(pTSlaveInfo(ProcessMsg.nParam1));
end;
RM_FUSHEN: begin
SendDefMessage(SM_FUSHEN,
Integer(ProcessMsg.BaseObject),
HiWord(ProcessMsg.nParam1),
LoWord(ProcessMsg.nParam1),
ProcessMsg.wParam,
'');
end;
RM_BREAKWEAPON: begin //10413
SendDefMessage(SM_BREAKWEAPON,
Integer(ProcessMsg.BaseObject),
0,
0,
0,
'');
end;
RM_INSTANCEHEALGUAGE: begin //10414
if (ProcessMsg.BaseObject = Self) then
SendDefMessage(SM_INSTANCEHEALGUAGE,
Integer(ProcessMsg.BaseObject),
TBaseObject(ProcessMsg.BaseObject).m_WAbil.dwHP,
TBaseObject(ProcessMsg.BaseObject).m_WAbil.dwMaxHP,
0,
'')
else
SendDefMessage(SM_INSTANCEHEALGUAGE,
Integer(ProcessMsg.BaseObject),
CalcCent(TBaseObject(ProcessMsg.BaseObject).m_WAbil.dwHP,
TBaseObject(ProcessMsg.BaseObject).m_WAbil.dwMaxHP),
TBaseObject(ProcessMsg.BaseObject).m_wMaxHPCent,
0,
'');
end;
RM_CHANGEFACE: begin //10415
if (ProcessMsg.nParam1 <> 0) and (ProcessMsg.nParam2 <> 0) then begin
m_defMsg := MakeDefaultMsg(SM_CHANGEFACE,
ProcessMsg.nParam1,
LoWord(ProcessMsg.nParam2),
HiWord(ProcessMsg.nParam2),
0);
CharDescEx.Feature := TBaseObject(ProcessMsg.nParam2).GetFeature(Self);
CharDescEx.Status := TBaseObject(ProcessMsg.nParam2).m_nCharStatus;
CharDescEx.Featurex := GetMaxHPCent(TBaseObject(ProcessMsg.BaseObject));
SendSocket(@m_defMsg, EnCodeBuffer(@CharDescEx, SizeOf(TCharDescEx)));
end;
end;
RM_PASSWORD: begin //10416 004D9FE3
SendDefMessage(SM_PASSWORD,
0,
0,
0,
0,
'');
end;
RM_PLAYDICE: begin //10500 004D9FFF
MessageBodyWL.lParam1 := ProcessMsg.nParam1;
MessageBodyWL.lParam2 := ProcessMsg.nParam2;
MessageBodyWL.lTag1 := ProcessMsg.nParam3;
m_defMsg := MakeDefaultMsg(SM_PLAYDICE,
Integer(ProcessMsg.BaseObject),
ProcessMsg.wParam,
0,
0);
SendSocket(@m_defMsg, EnCodeBuffer(@MessageBodyWL,
SizeOf(TMessageBodyWL)) + EnCodeString(ProcessMsg.sMsg));
end;
RM_PASSWORDSTATUS: begin
m_defMsg := MakeDefaultMsg(SM_PASSWORDSTATUS,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.nParam3);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end;
RM_GHOST: begin
m_defMsg := MakeDefaultMsg(SM_GHOST, Integer(ProcessMsg.BaseObject),
ProcessMsg.wParam, 0, 0);
SendSocket(@m_defMsg, EnCodeBuffer(@ProcessMsg.nParam1,
SizeOf(Integer)));
end;
CM_CALCELTASK: begin
ClientDelTask(ProcessMsg.nParam1);
end;
RM_ADDTASK: begin
SendDefMessage(SM_TASKINFO, ProcessMsg.nParam1, ProcessMsg.nParam2, 0, ProcessMsg.wParam, ProcessMsg.sMsg);
SendDefMessage(SM_TASKINFO, 0, 0, 0, 0, Format(sTaskInfo, [m_nMaxTaskCount, m_nAchievement, m_nTaskCount]));
end;
RM_YSSKILL: begin
m_defMsg := MakeDefaultMsg(SM_YSSKILL,
Integer(ProcessMsg.BaseObject),
LoWord(ProcessMsg.nParam2), //60
HiWord(ProcessMsg.nParam2), //15
0); //1
CombineSkillEffect.nMonID := ProcessMsg.nParam1;
CombineSkillEffect.nSkillType := 0;
CombineSkillEffect.nPneumaID := ProcessMsg.nParam3;
s1C := EnCodeBuffer(@CombineSkillEffect, SizeOf(TCombineSkillEffect));
SendSocket(@m_defMsg, s1C);
end;
RM_CHAINTHUNDER: begin
m_defMsg := MakeDefaultMsg(SM_CHAINTHUNDER,
Integer(ProcessMsg.BaseObject),
LoWord(ProcessMsg.nParam2),
HiWord(ProcessMsg.nParam2),
ProcessMsg.wParam);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end;
RM_TOWERAAILITY: begin
SendGuildTowerInfo();
end;
RM_PROWL: begin
m_nCharStatus := GetCharStatus();
StatusChanged();
SendRefMsg(RM_DISAPPEAR, 0, 0, 0, 0, '');
m_boObMode := True;
end;
CM_CATCHEVIL: begin //俘获心魔
ClientCatchEvil(TBaseObject(ProcessMsg.nParam1),
MakeLong(ProcessMsg.nParam2, ProcessMsg.nParam3));
end;
CM_ADDEVILTOITEM: begin //附魔到装备
ClientAddEvilToItem(ProcessMsg.wParam, ProcessMsg.nParam1,
MakeLong(ProcessMsg.nParam2, ProcessMsg.nParam3));
end;
CM_ADDANTIEVILPOWER: begin //增加镇魔值
ClientAddAntiEvilPower(ProcessMsg.wParam, ProcessMsg.nParam1,
MakeLong(ProcessMsg.nParam2, ProcessMsg.nParam3));
end;
$889B: begin //书页
ExecuteScript(g_ManageNPC, '@ReadBook' + IntToStr(ProcessMsg.nParam2));
end;
$5EB6: begin //收起元神
if m_boPneuma and (m_PneumaObject <> nil) then begin
TPlayObject(m_PneumaObject).PneumaLogin(); //24246 下线元神
end;
{$IF USESDK = DEBUG}
MainOutMessage(Format('元神消息:%s-%d-%d-%d-%d-%d %s-%S',
[m_sCharName, ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg,
DeCodeString(ProcessMsg.sMsg)]));
{$IFEND}
end;
$5EB7: begin //释放元神
if m_boPneuma and (m_PneumaObject <> nil) then begin
TPlayObject(m_PneumaObject).PneumaLogin(); //24246 下线元神
end;
{$IF USESDK = DEBUG}
MainOutMessage(Format('元神消息:%s-%d-%d-%d-%d-%d %s-%S',
[m_sCharName, ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg,
DeCodeString(ProcessMsg.sMsg)]));
{$IFEND}
end;
CM_ITEMPIC: begin
SendScriptItemPic(ProcessMsg.sMsg, ProcessMsg.nParam2);
{$IF USESDK = DEBUG}
MainOutMessage(Format('精彩活动:%s-%d-%d-%d-%d-%d %s-%S',
[m_sCharName, ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg,
DeCodeString(ProcessMsg.sMsg)]));
{$IFEND}
end;
CM_REQUESTMASTER: begin //784-0-233480192-1-0 1 招收徒弟 2 请求拜师
ClientRequest(ProcessMsg.wIdent, ProcessMsg.nParam1, ProcessMsg.nParam2);
end;
CM_REQUESTDEAL: begin //786-0-232991184-1-0
ClientRequest(ProcessMsg.wIdent, ProcessMsg.nParam1, ProcessMsg.nParam2);
end;
CM_EVOLUTION: begin
DeCodeBuffer(ProcessMsg.sMsg, @nObjCount, SizeOf(nObjCount));
ClientEvoluTion(ProcessMsg.wParam, ProcessMsg.nParam1, MakeLong(ProcessMsg.nParam2, ProcessMsg.nParam3), nObjCount);
{$IF USESDK = DEBUG}
MainOutMessage(Format('幻化消息:%d-%d-%d-%d-%d %s-%d',
[ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg, nObjCount]));
{$IFEND}
end;
$0334: begin
ExecuteScript(g_ManageNPC, '@离开迷仙阵');
{$IF USESDK = DEBUG}
MainOutMessage(Format('迷仙阵消息:%d-%d-%d-%d-%d %s',
[ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg]));
{$IFEND}
end;
$9555: begin
if m_PEnvir.m_MapFlag.boCanReLive then begin
m_sScriptParam[0] := m_sMapName;
ExecuteScript(g_ManageNPC, '@原地复活');
end;
{$IF USESDK = DEBUG}
ReAlive;
SendRefMsg(RM_510, 1, 0, 71, 0, '');
{$IFEND}
end;
SM_QUERYRELIVE: begin // 涅槃重生技能询问复活
if m_boQueryReLive then begin
m_boQueryReLive := False;
ReAlive;
n18 := Round(m_WAbil.dwMaxHP / 3);
Inc(m_nIncHealth, n18);
n18 := m_WAbil.dwMaxHP - n18;
IncHealthSpell(n18, 10);
//m_WAbil.HP := m_WAbil.MaxHP;
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendDefMessage($9555, Integer(Self), 0, 0, 1, '');
SendRefMsg(RM_510, 1, 0, 130, 0, '');
end;
end;
$033B: begin
case ProcessMsg.nParam2 of
1: ExecuteScript(g_ManageNPC, '@扩展包裹');
2: ExecuteScript(g_ManageNPC, '@扩展钱袋');
3: ExecuteScript(g_ManageNPC, '@扩展元神包裹');
4, 5: ExecuteScript(g_ManageNPC, '@扩展仓库');
6: ExecuteScript(g_ManageNPC, '@扩展灵兽包裹');
7: ExecuteScript(g_ManageNPC, '@_VIP_扩展包裹');
8: ExecuteScript(g_ManageNPC, '@_VIP_扩展仓库');
end;
end;
CM_TREASUREBOX: begin
case LoByte(ProcessMsg.nParam2) of
1: ClientActivationTreasureBox();
2: ClientEnlargeTreasureBox();
3: ClientUPGradeTreasureBox(HiByte(ProcessMsg.nParam2), ProcessMsg.sMsg);
4: ClientInjectPowerToTreasureBox(ProcessMsg.wParam);
5: ClientTakeItemOutTreasureBox(ProcessMsg.nParam1);
6: ClientTakeItemToTreasureBox(ProcessMsg.nParam1);
7: begin
if (m_TreasureBoxItem = nil) or (m_TreasureBoxItem.DuraMax >= 20) then Exit;
SendDefMessage(CM_TREASUREBOX, 10, 7, 0, 0, '');
end;
end;
{$IF USESDK = DEBUG}
MainOutMessage(Format('灵犀宝盒消息:%d-%d-%d-%d-%d %s',
[ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg]));
{$IFEND}
end;
CM_TIGEREAT: begin
m_sScriptParam[0] := IntToStr(ProcessMsg.nParam1);
ExecuteScript(g_ManageNPC, '@虎王喂食');
end;
CM_CALLTIGER: begin
ClientCallTiger();
end;
CM_RECALLTIGER: begin
ClientReCallTiger();
end;
CM_TIGERATTACK: begin
ClientSetTigerTarget(ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.wParam);
end;
SM_ALLOTGUILDGOLD: begin
ClientAllotGuildGold(DeCodeString(ProcessMsg.sMsg), ProcessMsg.nParam1);
end;
RM_BUILDGUILDTOWER: begin
SendDefMessage(SM_BUILDGUILDTOWER,
0,
0,
0,
0,
ProcessMsg.sMsg);
end;
SM_BUILDGUILDTOWER: begin
sTmp := m_PEnvir.GetGuildTowerInfo;
if sTmp <> '' then begin
SendDefMessage(SM_BUILDGUILDTOWER, 0, 0, 0, 0, sTmp);
end;
end;
SM_GUILDMEMBERLIST: ClientGuildMemberList();
SM_GUILDOFFICIALPLAYER: SendNearbyGuildMemberList();
SM_GUILDOFFICIAL: begin
case ProcessMsg.nParam3 of
1: ClientAskForGuildOfficial(ProcessMsg.nParam2, DeCodeString(ProcessMsg.sMsg));
end;
end;
SM_QUESTGUILDOFFICIAL: begin
ClientGuildOfficial(ProcessMsg.nParam3, ProcessMsg.nParam2, DeCodeString(ProcessMsg.sMsg));
end;
SM_TREASUREPAVILION: begin
{$IF USESDK = DEBUG}
MainOutMessage(Format('珍宝阁消息:%d-%d-%d-%d-%d %s',
[ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg]));
{$IFEND}
case LoByte(ProcessMsg.nParam2) of
0: begin
SendTreasurePavilion();
end;
1: begin
m_sScriptParam[0] := IntToStr(HiByte(ProcessMsg.nParam2));
ExecuteScript(g_GuildTowerNPC, '@珍宝阁开宝');
end;
2: begin //极品阁
SendNonSuchPavilion(HiByte(ProcessMsg.nParam2));
end;
3: begin
if not m_boInNonSuchPavilion then Exit; //没有进入极品阁
m_sScriptParam[0] := IntToStr(HiByte(ProcessMsg.nParam2));
ExecuteScript(g_GuildTowerNPC, '@极品阁开宝');
end;
end;
end;
SM_GUILDTOWER: begin
{$IF USESDK = DEBUG}
MainOutMessage(Format('通灵塔消息:%d-%d-%d-%d-%d %s',
[ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg]));
{$IFEND}
case ProcessMsg.nParam1 of
0: begin
SendGuildTowerRes();
end;
1: begin //捐献资源
FillChar(nArrItem, SizeOf(Integer) * 3, #0);
DeCodeBuffer(ProcessMsg.sMsg, @nArrItem, SizeOf(Integer) * 3);
m_sScriptParam[0] := IntToStr(nArrItem[0]);
m_sScriptParam[1] := IntToStr(nArrItem[1]);
m_sScriptParam[2] := IntToStr(nArrItem[2]);
ExecuteScript(g_GuildTowerNPC, '@Contribute');
end;
end;
end;
RM_LOTUSINFO: begin
SendDefMessage(SM_LOTUSINFO,
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.nParam3,
ProcessMsg.wParam,
ProcessMsg.sMsg);
if ProcessMsg.nParam1 = 0 then //删除的,多发一次
SendDefMessage(SM_LOTUSINFO,
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.nParam3,
ProcessMsg.wParam,
ProcessMsg.sMsg);
end;
SM_LOTUSINFO: begin
ClientQueryMapLotusInfo();
end;
$0352: begin
m_sScriptParam[0] := IntToStr(ProcessMsg.nParam1);
m_sScriptParam[1] := IntToStr(MakeLong(ProcessMsg.nParam3, ProcessMsg.wParam));
DeCodeBuffer(ProcessMsg.sMsg, @nObjCount, SizeOf(Integer));
m_sScriptParam[2] := IntToStr(nObjCount);
ExecuteScript(g_GuildTowerNPC, '@RefineItem');
end;
$0BE0: begin
m_sScriptParam[0] := IntToStr(MakeLong(ProcessMsg.nParam3, ProcessMsg.wParam));
case ProcessMsg.nParam2 of
1: ExecuteScript(g_ManageNPC, '@炼化内丹');
2: ExecuteScript(g_ManageNPC, '@炼化元婴');
end;
end;
$0BE1: begin
ClientCreateSoul(0, LoByte(ProcessMsg.nParam2), HiByte(ProcessMsg.nParam2));
end;
$0BE2: begin
ClientCreateSoul(1, ProcessMsg.nParam1, ProcessMsg.nParam2);
end;
$0BE3: begin
ExecuteScript(g_ManageNPC, '@元婴散魂');
end;
$0BE6: begin
case ProcessMsg.wParam of
0: ClientFelementOrderFlag(ProcessMsg.nParam1, MakeLong(ProcessMsg.nParam2, ProcessMsg.nParam3));
1: begin //1
m_sScriptParam[0] := '1';
ExecuteScript(g_ManageNPC, '@离火封魔阵');
SendDefMessage(SM_627, 0, 1037, 0, 0, '');
end;
10: begin //离开
m_sScriptParam[0] := '0'; //0
ExecuteScript(g_ManageNPC, '@离火封魔阵');
end;
266: begin //在来一次
m_sScriptParam[0] := '2'; //2
ExecuteScript(g_ManageNPC, '@离火封魔阵');
end;
end;
end;
$0BE7: begin
ClientReCallGuarder(ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.nParam3);
end;
CM_CTRLMENTAL: begin
ClientCtrlMental(ProcessMsg.nParam2); //天元心法
end;
RM_3046: begin
SendDefMessage(3046, ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg);
end;
CM_PHOENIXSEARCH: begin //凤凰探宝
ClientPhoenixSearch(ProcessMsg.nParam1, ProcessMsg.nParam2);
end;
RM_TIGERADDABIL: begin
m_defMsg := MakeDefaultMsg(SM_TIGERABIL, 0, 0, 0, 0);
SendSocket(@m_defMsg, EnCodeBuffer(@m_TorDDM.Tiger.AddAbil, SizeOf(TAddAbilityOfTiger) - 4));
end;
CM_TIGERTAKEON: begin
case LoByte(ProcessMsg.nParam2) of
0: ClientTakeOnInosculatePneumaItem(HiByte(ProcessMsg.nParam2), ProcessMsg.nParam1);
1: ClientTakeOffInosculatePneumaItem(HiByte(ProcessMsg.nParam2), ProcessMsg.nParam1);
2: ClientTakeOnTigerItem(HiByte(ProcessMsg.nParam2), ProcessMsg.nParam1);
3: ClientTakeOffTigerItem(HiByte(ProcessMsg.nParam2), ProcessMsg.nParam1);
4: ClientTakeOnPetSoulItem(HiByte(ProcessMsg.nParam2), ProcessMsg.nParam1, ProcessMsg.nParam3);
5: ClientTakeOffPetSoulItem(HiByte(ProcessMsg.nParam2), ProcessMsg.nParam1, ProcessMsg.nParam3);
else
{$IF USESDK = DEBUG}
MainOutMessage(Format('虎王消息:%d-%d-%d-%d-%d %s',
[ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg]));
{$IFEND}
end;
end;
RM_HEARTFATEPOINT: begin
m_defMsg := MakeDefaultMsg(SM_HEARTFATEPOINT, 0, 0, 0, 0);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end;
RM_CTRLMENTAL: begin
SendDefMessage(SM_CTRLMENTAL, ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.nParam3, 0, '');
end;
CM_GUILDCLAN: begin
ClientQueryGuildClanList();
end;
CM_CLANOPERATE: begin
ClientClanOperate(ProcessMsg.nParam2, ProcessMsg.sMsg);
{$IF USESDK = DEBUG}
MainOutMessage(Format('宗族消息:%d-%d-%d-%d-%d %s',
[ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg]));
{$IFEND}
end;
CM_CLANQUERY: begin
ClientClanReQuery(ProcessMsg.nParam1, ProcessMsg.sMsg);
{$IF USESDK = DEBUG}
MainOutMessage(Format('宗族消息:%d-%d-%d-%d-%d %s',
[ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg]));
{$IFEND}
end;
RM_GETCATAPULT: begin
m_defMsg := MakeDefaultMsg(SM_GETCATAPULT,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam2,
ProcessMsg.nParam3,
ProcessMsg.wParam);
SendSocket(@m_defMsg, EnCodeBuffer(@ProcessMsg.nParam1, 4));
end;
RM_CATAPULTSTATUS: begin
SendDefMessage(SM_CATAPULTSTATUS, Integer(ProcessMsg.BaseObject), 0, 0, ProcessMsg.wParam, '');
end;
SM_CATAPULTSTATUS: begin
{$IF USESDK = DEBUG}
MainOutMessage(Format('投石车消息:%d-%d-%d-%d-%d %s',
[ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg]));
{$IFEND}
if m_boCatapultMode then begin
case ProcessMsg.wParam of
0: begin //移动
m_boCatapultAttackMode := False;
SendRefMsg(RM_CATAPULTSTATUS, 0, Integer(Self), 0, 0, '');
SysMsg('投石车处于移动形态', c_Red, t_Hint);
end;
1: begin //架起
m_boCatapultAttackMode := True;
SendRefMsg(RM_CATAPULTSTATUS, 1, Integer(Self), 0, 0, '');
SysMsg('投石车处于架起形态', c_Red, t_Hint);
end;
2: begin //弃车
end;
end;
end;
end;
// RM_CATAPULTATTACK: begin
// SendDefMessage(SM_CATAPULTATTACK, Integer(ProcessMsg.BaseObject), ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.wParam, '');
// end;
SM_CATAPULTATTACK: begin
ClientCatapultAttackTarget(ProcessMsg.wParam, ProcessMsg.nParam2, ProcessMsg.nParam3);
end;
CM_MAKEBABY: begin //繁衍灵兽
ClientPetMakeBaby(ProcessMsg.nParam1, MakeLong(ProcessMsg.nParam2, ProcessMsg.nParam3));
end;
CM_MAGBEAST: begin //兽化
ClientMagOfPetBeast(ProcessMsg.nParam1);
end;
RM_PETBEAST: begin
m_defMsg := MakeDefaultMsg(SM_PETBEAST,
Integer(ProcessMsg.BaseObject),
LoWord(ProcessMsg.nParam1),
HiWord(ProcessMsg.nParam1),
ProcessMsg.wParam);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end;
RM_LAPIDATION: begin
m_defMsg := MakeDefaultMsg(SM_LAPIDATION,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam2,
ProcessMsg.nParam3,
ProcessMsg.wParam);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end;
RM_USESPIRIT: begin //使用神魂融合技能
{ if (ProcessMsg.BaseObject = Self) and (m_MagicSkills[SKILL_SPIRITMERGE] <> nil) then begin
DoSpell(m_MagicSkills[SKILL_SPIRITMERGE], m_nCurrX, m_nCurrY, nil);
end; }
end;
RM_SPIRITHP: begin //神魂融合 神魂值
{ if (ProcessMsg.BaseObject = Self) or (m_PneumaObject = ProcessMsg.BaseObject) then begin
m_defMsg := MakeDefaultMsg(SM_SPIRITHP,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam1,
ProcessMsg.nParam2,
0);
end else begin
m_defMsg := MakeDefaultMsg(SM_SPIRITHP,
Integer(ProcessMsg.BaseObject),
CalcCent(ProcessMsg.nParam1, ProcessMsg.nParam2),
100,
0);
end;
SendSocket(@m_defMsg, EnCodeBuffer(@ProcessMsg.wParam, 2)); }
end;
CM_CTRLDIVRATE: begin
if not m_boPneuma and (m_PneumaObject <> nil) and (m_SpiritInfo.btLinkLv > 0) then begin
m_SpiritInfo.btDivRate := _MIN((m_SpiritInfo.btLinkLv + 1) * 10, ProcessMsg.nParam2);
SysMsg(Format('您的灵魂锁链当前可转移的的伤害比例为%d%%', [m_SpiritInfo.btDivRate]), c_Red, t_Hint);
end;
end;
CM_COMPREHENDSKILL: begin
m_sScriptParam[0] := IntToStr(ProcessMsg.nParam1);
m_sScriptParam[1] := IntToStr(ProcessMsg.nParam2);
if ProcessMsg.nParam3 = 0 then begin
ExecuteScript(g_FunctionNPC, '@遗忘魂佑技能');
end else begin
ExecuteScript(g_FunctionNPC, '@领悟魂佑技能');
end;
end;
CM_FREEPET: begin
m_sScriptParam[0] := IntToStr(ProcessMsg.nParam1);
ExecuteScript(g_FunctionNPC, '@放生灵兽');
end;
CM_ACHIEVEMENT: begin //成就系统
ClientAchievementSystem();
end;
CM_MAKEWENPEI: begin //制做纹佩
ClientMakeWenPei(LoByte(ProcessMsg.nParam2), //主纹
HiByte(ProcessMsg.nParam2), //精纹
LoByte(ProcessMsg.nParam3), //底纹
HiByte(ProcessMsg.nParam3) //边纹
);
end;
CM_GETWENPEI_DEMAND: begin
ClientGetWenPeiDemand(ProcessMsg.nParam1, ProcessMsg.nParam2);
end;
CM_TAKEWENPEI: begin //强化 或 拆解 纹佩
ClientTakeWenPei(MakeLong(ProcessMsg.nParam2, ProcessMsg.nParam3), ProcessMsg.nParam1);
end;
CM_COLLECTSUITS: begin //成就之收集套装
ClientCollectSuits(ProcessMsg.nParam3, ProcessMsg.nParam2, ProcessMsg.sMsg);
end;
CM_CHECKVALIDCODE: begin
ClientCheckVerifyCode(ProcessMsg.sMsg);
end;
RM_DIRSHADOWHIT: begin
m_defMsg := MakeDefaultMsg(SM_DIRSHADOWHIT,
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.nParam3,
ProcessMsg.wParam);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end;
RM_UPDATEITEM_MSG: begin
m_defMsg := MakeDefaultMsg(ProcessMsg.wParam, Integer(ProcessMsg.BaseObject), ProcessMsg.nParam2, 0, ProcessMsg.nParam3);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end;
RM_MAPEFFECT: begin
SendDefMessage(SM_MAPEFFECT, ProcessMsg.wParam, ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg);
end;
RM_REFRESHRANK: begin //刷新排行
case ProcessMsg.nParam1 of
0: g_RankManage.RefreshHeroRank(Self);
1: g_RankManage.RefreshPneumaRank(Self);
2: g_RankManage.RefreshOutPrenticeRank(Self);
3: g_RankManage.RefreshPetRank(ProcessMsg.nParam2, Self);
4: g_RankManage.RefreshGodPetRank(ProcessMsg.nParam2, Self);
5: g_RankManage.RefreshMilitaryRank(Self);
6: g_RankManage.RefreshRepressDemonRank(Self);
end;
end;
RM_CHARSTATUSCHANGED_Delay: begin
StatusChanged();
end;
RM_VEHICLEPOS: begin
SendDefMessage(SM_VEHICLEPOS, ProcessMsg.wParam, ProcessMsg.nParam1, ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg);
end;
RM_REDPACKET: begin
SendRedPacketWindow(ProcessMsg.wParam);
end;
RM_DEMONHIT: begin
m_defMsg := MakeDefaultMsg(2454,
Integer(ProcessMsg.BaseObject),
ProcessMsg.nParam2,
ProcessMsg.nParam3,
ProcessMsg.wParam);
SendSocket(@m_defMsg, ProcessMsg.sMsg);
end;
{ 199:
begin
MainOutMessage(Format('精彩活动消息:%s-%d-%d-%d-%d-%d %s-%d',
[m_sCharName, ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, DeCodeString(ProcessMsg.sMsg), nObjCount]));
end; }
else begin
Result := inherited Operate(ProcessMsg);
end;
{$IF CHECKNEWMSG =1}
if not Result then
MainOutMessage(Format('未处理的消息:%d-%d-%d-%d-%d %s %s 元神:%s',
[ProcessMsg.wIdent, ProcessMsg.wParam, ProcessMsg.nParam1,
ProcessMsg.nParam2, ProcessMsg.nParam3, ProcessMsg.sMsg, DeCodeString(ProcessMsg.sMsg), BoolToCStr(m_boPneuma)]));
{$IFEND}
end;
end;
{将心魔属性添加到装备}
procedure TPlayObject.AddEvilToItemB(nWhere: word; nMakeIndex, BottleIndex:
Integer);
var
UserItem, BottleItem : pTUserItem;
s : string;
pStdItem : pTStdItem;
begin
GetUserItemByMakeIndex(BottleIndex, BottleItem);
GetUserItemByMakeIndex(nMakeIndex, UserItem);
if (UserItem <> nil) and (BottleItem <> nil) then begin
if (BottleItem.Evil.sName = '') or (BottleItem.Evil.MakeIndex = 0) then begin
SysMsg('无法从玉净瓶中感应到心魔气息,不能附魔!', c_Red, t_Hint);
Exit;
end;
if BottleItem.Evil.wPower < 2000 then begin
SysMsg('玉净瓶的镇魔力量太弱,不能附魔!', c_Red, t_Hint);
Exit;
end;
UserItem.Evil := BottleItem.Evil;
UserItem.Evil.MakeIndex := UserItem.MakeIndex;
{获取心魔随机属性}
ItemUnit.RandomItemEvil(UserItem); //获取附魔属性
SendUpdateItem(UserItem, False);
FillChar(BottleItem.Evil, SizeOf(TEvil), #0); //删除玉净瓶心魔数据
SendUpdateItem(BottleItem, False);
SendDefMessage(SM_ITEMEVIL, Integer(Self), LoWord(BottleIndex), HiWord(BottleIndex), 0, '');
SendRefMsg(RM_510, 1, 0, 63, 0, '');
pStdItem := UserEngine.GetStdItem(UserItem.wIndex);
if (pStdItem <> nil) then
SysMsg(Format('心魔的魔力精髓,已经附注到你的%s,你的%s获得了强大的威力!', [pStdItem^.FilterName, pStdItem^.FilterName]), c_Red, t_Hint);
end;
end;
{棋座留言}
procedure TPlayObject.AddFlagComment(nflagType: Integer; NPCID: Integer;
nMsgLen: Integer; sMsg: string);
var
s : string;
NPC : TNormNpc;
begin
NPC := UserEngine.FindMerchant(TObject(NPCID));
if NPC = nil then NPC := UserEngine.FindNPC(TObject(NPCID));
if NPC = nil then Exit;
if CheckFilterWords(sMsg) then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, '输入内容含有非法字符!');
Exit;
end;
NPC.AddComment(Self, DeCodeString(sMsg));
end;
procedure TPlayObject.AddToFriendList(FriendName: string);
var
i : Integer;
boFound : Boolean;
begin
boFound := False;
for i := 0 to m_FriendsList.Count - 1 do
if m_FriendsList[i] = FriendName then begin
boFound := True;
Break;
end;
if not boFound then begin
m_FriendsList.Add(FriendName);
SendDefMessage(SM_AddFriend, 0, 0, 0, 0, FriendName);
end;
end;
procedure TPlayObject.BaseObjectMove(sMAP, sX, sY: string); //004BD0C4
var
Envir : TEnvirnoment;
nX, nY : Integer;
begin
Envir := m_PEnvir;
if sMAP = '' then sMAP := m_sMapName;
if (sX <> '') and (sY <> '') then begin
nX := Str_ToInt(sX, 0);
nY := Str_ToInt(sY, 0);
SpaceMove(sMAP, nX, nY, 0, nil);
end else begin
MapRandomMove(sMAP, 0, nil);
end;
if (Envir <> m_PEnvir) and (m_btRaceServer = RC_PLAYOBJECT) then begin
m_boTimeRecall := False;
end;
end;
procedure TPlayObject.CancelDoShop;
var
DoShopResult : TDoShopResult;
begin
//如果当前在摆摊,则强制收摊
if m_wShopItemCount > 0 then begin
m_wShopItemCount := 0;
DoShopResult.ShopType := 0;
DoShopResult.RetCode := $FF;
DoShopResult.FlagType := 0;
DoShopResult.FlagColor := 0;
m_defMsg := MakeDefaultMsg(SM_DOSHOP, Integer(Self), m_nCurrX, m_nCurrY, m_btDirection);
SendSocket(@m_defMsg, EnCodeBuffer(@DoShopResult, SizeOf(TDoShopResult)));
SendRefMsg(RM_DOSHOP, m_btDirection, MakeLong(m_nCurrX, m_nCurrY), $FF, 0, '');
end;
end;
function TPlayObject.CancelGroup: Boolean;
resourcestring
sCanceGrop = '你的小组被解散了...';
begin
Result := True;
if m_GroupMembers.Count <= 1 then begin
SendGroupText(sCanceGrop);
m_GroupMembers.Clear;
m_GroupOwner := nil;
Result := False;
end;
end;
procedure TPlayObject.ChangeMasterName(sHumanName, sMasterName: string;
boMaster: Boolean);
var
PlayObject, Hum : TPlayObject;
begin
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject <> nil then begin
if CompareText(sMasterName, '无') = 0 then begin
if boMaster then begin
PlayObject.m_sMasterName[1] := '';
PlayObject.m_sMasterName[2] := '';
PlayObject.m_sMasterName[3] := '';
end else begin
PlayObject.m_sMasterName[1] := '';
end;
PlayObject.m_boMaster := False;
end else begin
if boMaster then begin
PlayObject.m_boMaster := True;
if (PlayObject.m_sMasterName[1] = '') then
PlayObject.m_sMasterName[1] := sMasterName
else if (PlayObject.m_sMasterName[2] = '') then
PlayObject.m_sMasterName[2] := sMasterName
else if (PlayObject.m_sMasterName[3] = '') then
PlayObject.m_sMasterName[3] := sMasterName;
end else begin
PlayObject.m_sMasterName[1] := sMasterName;
PlayObject.m_boMaster := False;
PlayObject.SysMsg('拜师成功', c_Red, t_Hint);
end;
end;
PlayObject.RefShowName;
PlayObject.SendFiendList(1);
Hum := UserEngine.GetPlayObject(sMasterName);
if Hum <> nil then begin
Hum.SendFiendList(2);
Hum.SendMeOnlineState(1, 1);
Hum.RefShowName;
end;
// PlayObject.SendMeOnlineState(1, 2);
end;
end;
procedure TPlayObject.ChangePneumaState;
var
i, nSlave : Integer;
Slave : TBaseObject;
resourcestring
sHint1 = '魂魄力量暂时无法聚拢,你的元神分身不能幻化。';
sHint2 = '魂魄力量聚拢,你的元神分身幻化成了元神灵珠。';
sHint3 = '神奇的力量凝聚,你的元神分身被唤醒了。';
begin
if m_boPneuma then Exit;
if (m_PneumaObject = nil) or m_PneumaObject.m_boGhost or m_PneumaObject.m_boDeath then Exit;
// if TPlayObject(m_PneumaObject).m_boRideOn then Exit;
if not TPlayObject(m_PneumaObject).m_boPneumaEffMode then begin
if g_Config.boNoElfBead then Exit; //不允许灵珠模式,则直接返回
if GetTickCount - TPlayObject(m_PneumaObject).m_dwPneumaChangeTick < 9 * 1000 then Exit; //防止客户端错误引起的刷屏
if GetTickCount - TPlayObject(m_PneumaObject).m_dwPneumaChangeTick < 10 * 1000 then begin //从人形转换为灵珠需要时间间隔
SysMsg(sHint1, c_Red, t_Hint);
Exit;
end;
SysMsg(sHint2, c_Red, t_Hint);
TPlayObject(m_PneumaObject).m_boPneumaEffMode := True;
m_PneumaObject.SendRefMsg(RM_YSSTATECHANGED, 1, Integer(m_PneumaObject), 0, 0, '');
TPlayObject(m_PneumaObject).m_dwPneumaChangeTick := GetTickCount;
//清除宝宝
for i := 0 to m_PneumaObject.m_SlaveList.Count - 1 do begin
Slave := TBaseObject(m_PneumaObject.m_SlaveList.Items[i]);
nSlave := Integer(Slave);
TPlayObject(m_PneumaObject).SendDefMessage(SM_SLAVEINFO, Integer(m_PneumaObject), 0, 0, 1, EnCodeBuffer(@nSlave, SizeOf(Integer)));
Slave.MakeGhost();
end;
m_PneumaObject.m_SlaveList.Clear;
end else begin
TPlayObject(m_PneumaObject).m_dwPneumaChangeTick := GetTickCount;
SysMsg(sHint3, c_Red, t_Hint);
TPlayObject(m_PneumaObject).m_boPneumaEffMode := False;
m_PneumaObject.SendRefMsg(RM_YSSTATECHANGED, 0, Integer(m_PneumaObject), 0, 0, '');
end;
end;
procedure TPlayObject.ChangeServerMakeSlave(SalveInfo: pTSlaveInfo); //004DF84C
var
nSlaveCount : Integer;
BaseObject : TBaseObject;
begin
if m_btJob = 2 then begin //道士只允许招一个宝宝
nSlaveCount := 1;
end else begin //其他职业允许招5个
nSlaveCount := 5;
end;
BaseObject := MakeSlave(SalveInfo.sSalveName, 3, SalveInfo.btSalveLevel, nSlaveCount, SalveInfo.dwRoyaltySec, -1);
if BaseObject <> nil then begin
BaseObject.m_nSlaveKillMonCount := SalveInfo.nKillCount;
BaseObject.m_wSlaveExpLevel := SalveInfo.btSlaveExpLevel;
BaseObject.m_WAbil.dwHP := SalveInfo.nHP;
BaseObject.m_WAbil.dwMP := SalveInfo.nMP;
if (1500 - SalveInfo.btSalveLevel * 200) < BaseObject.m_nWalkSpeed then begin
BaseObject.m_nWalkSpeed := 1500 - SalveInfo.btSalveLevel * 200;
end;
if (2000 - SalveInfo.btSalveLevel * 200) < BaseObject.m_nNextHitTime then begin
BaseObject.m_nNextHitTime := 2000 - SalveInfo.btSalveLevel * 200;
end;
RecalcAbilitys();
end;
end;
function TPlayObject.CheckActionStatus(wIdent: word; var dwDelayTime: LongWord):
Boolean;
var
dwCheckTime : LongWord;
//dwCurrTick:LongWord;
dwActionIntervalTime : LongWord;
begin
Result := False;
dwDelayTime := 0;
//检查人物弯腰停留时间
if not g_Config.boDisableStruck then begin
dwCheckTime := GetTickCount - m_dwStruckTick;
if g_Config.dwStruckTime > dwCheckTime then begin
dwDelayTime := g_Config.dwStruckTime - dwCheckTime;
m_btOldDir := m_btDirection;
Exit;
end;
end;
//检查二个不同操作之间所需间隔时间
dwCheckTime := GetTickCount - m_dwActionTick;
if m_boTestSpeedMode then begin
SysMsg('间隔: ' + IntToStr(dwCheckTime), c_Blue, t_Notice);
end;
if m_wOldIdent = wIdent then begin //当二次操作一样时,则将 boFirst 设置为 真 ,退出由调用函数本身检查二个相同操作之间的间隔时间
Result := True;
Exit;
end;
if not g_Config.boControlActionInterval then begin
Result := True;
Exit;
end;
dwActionIntervalTime := m_dwActionIntervalTime;
case wIdent of
CM_LONGHIT: begin
//跑位刺杀
if g_Config.boControlRunLongHit and (m_wOldIdent = CM_RUN) and
(m_btOldDir <> m_btDirection) then begin
dwActionIntervalTime := m_dwRunLongHitIntervalTime;
end;
end;
CM_HIT: begin
//走位攻击
if g_Config.boControlWalkHit and (m_wOldIdent = CM_WALK) and (m_btOldDir <> m_btDirection) then begin
dwActionIntervalTime := m_dwWalkHitIntervalTime;
end;
//跑位攻击
if g_Config.boControlRunHit and (m_wOldIdent = CM_RUN) and (m_btOldDir <> m_btDirection) then begin
dwActionIntervalTime := m_dwRunHitIntervalTime;
end;
end;
CM_RUN: begin
//跑位刺杀
if g_Config.boControlRunLongHit and (m_wOldIdent = CM_LONGHIT) and
(m_btOldDir <> m_btDirection) then begin
dwActionIntervalTime := m_dwRunLongHitIntervalTime;
end;
//跑位攻击
if g_Config.boControlRunHit and (m_wOldIdent = CM_HIT) and (m_btOldDir
<> m_btDirection) then begin
dwActionIntervalTime := m_dwRunHitIntervalTime;
end;
//跑位魔法
if g_Config.boControlRunMagic and (m_wOldIdent = CM_SPELL) and
(m_btOldDir <> m_btDirection) then begin
dwActionIntervalTime := m_dwRunMagicIntervalTime;
end;
end;
CM_WALK: begin
//走位攻击
if g_Config.boControlWalkHit and (m_wOldIdent = CM_HIT) and (m_btOldDir
<> m_btDirection) then begin
dwActionIntervalTime := m_dwWalkHitIntervalTime;
end;
//跑位刺杀
if g_Config.boControlRunLongHit and (m_wOldIdent = CM_LONGHIT) and
(m_btOldDir <> m_btDirection) then begin
dwActionIntervalTime := m_dwRunLongHitIntervalTime;
end;
end;
CM_SPELL: begin
//跑位魔法
if g_Config.boControlRunMagic and (m_wOldIdent = CM_RUN) and (m_btOldDir
<> m_btDirection) then begin
dwActionIntervalTime := m_dwRunMagicIntervalTime;
end;
end;
end;
//将几个攻击操作合并成一个攻击操作代码
if (wIdent = CM_HIT) or
(wIdent = CM_HEAVYHIT) or
(wIdent = CM_BIGHIT) or
(wIdent = CM_POWERHIT) or
// (wIdent = CM_LONGHIT) or
(wIdent = CM_WIDEHIT) or
(wIdent = CM_FIREHIT) or
(wIdent = CM_3026) then begin
wIdent := CM_HIT;
end;
if dwCheckTime >= dwActionIntervalTime then begin
m_dwActionTick := GetTickCount();
Result := True;
end else begin
dwDelayTime := dwActionIntervalTime - dwCheckTime;
end;
m_wOldIdent := wIdent;
m_btOldDir := m_btDirection;
end;
function TPlayObject.CheckDenyLogon(): Boolean;
begin
Result := False;
if GetDenyIPaddrList(m_sIPaddr) then begin
SysMsg(g_sYourIPaddrDenyLogon, c_Red, t_Hint);
Result := True;
end else
if GetDenyAccountList(m_sUserID) then begin
SysMsg(g_sYourAccountDenyLogon, c_Red, t_Hint);
Result := True;
end else
if GetDenyChrNameList(m_sCharName) then begin
SysMsg(g_sYourCharNameDenyLogon, c_Red, t_Hint);
Result := True;
end;
if Result then m_boEmergencyClose := True;
end;
//检查物品和帐户之间的绑定关系
function TPlayObject.CheckItemBindUse(UserItem: pTUserItem): Boolean;
var
i : Integer;
ItemBind : pTItemBind;
begin
Result := True;
//检查物品和帐号的绑定
for i := 0 to g_ItemBindAccount.Count - 1 do begin
ItemBind := g_ItemBindAccount.Items[i];
if (ItemBind.nMakeIdex = UserItem.MakeIndex) and
(ItemBind.nItemIdx = UserItem.wIndex) then begin
Result := False;
if (CompareText(ItemBind.sBindName, m_sUserID) = 0) then begin
Result := True;
end else begin
SysMsg(g_sItemIsNotThisAccount, c_Red, t_Hint);
//此物品不为此帐号所有!!!
end;
Exit;
end;
end;
//检查物品和IP的绑定
for i := 0 to g_ItemBindIPaddr.Count - 1 do begin
ItemBind := g_ItemBindIPaddr.Items[i];
if (ItemBind.nMakeIdex = UserItem.MakeIndex) and
(ItemBind.nItemIdx = UserItem.wIndex) then begin
Result := False;
if (CompareText(ItemBind.sBindName, m_sIPaddr) = 0) then begin
Result := True;
end else begin
SysMsg(g_sItemIsNotThisIPaddr, c_Red, t_Hint);
//此物品不为此IP所有!!!
end;
Exit;
end;
end;
//检查物品和人物的绑定
for i := 0 to g_ItemBindCharName.Count - 1 do begin
ItemBind := g_ItemBindCharName.Items[i];
if (ItemBind.nMakeIdex = UserItem.MakeIndex) and
(ItemBind.nItemIdx = UserItem.wIndex) then begin
Result := False;
if (CompareText(ItemBind.sBindName, m_sCharName) = 0) then begin
Result := True;
end else begin
SysMsg(g_sItemIsNotThisCharName, c_Red, t_Hint);
//此物品不为你所有!!!
end;
Exit;
end;
end;
if Result then begin
Result := False;
if m_Abil.level >= UserItem.btItemExt[11] then begin
Result := True;
end else begin
SysMsg(g_sLevelNot, c_Red, t_Hint);
end;
end;
end;
function TPlayObject.CheckItemsNeed(StdItem: pTStdItem): Boolean;
var
Castle : TUserCastle;
begin
Result := True;
Castle := g_CastleManager.IsCastleMember(Self);
case StdItem.Need of
6: begin //行会需要的物品
if (m_MyGuild = nil) then begin
Result := False;
end;
end;
60: begin //掌门人的物品
if (m_MyGuild = nil) or (m_nGuildRankNo <> 1) then begin
Result := False;
end;
end;
71: begin //城堡物品
if Castle = nil then begin
Result := False;
end;
end;
70: begin //城主物品
if (Castle = nil) or (m_nGuildRankNo <> 1) then begin
Result := False;
end;
end;
8: begin //会员物品
if m_nMemberType = 0 then Result := False;
end;
81: begin //
if (m_nMemberType <> LoWord(StdItem.NeedLevel)) or (m_nMemberLevel <
HiWord(StdItem.NeedLevel)) then
Result := False;
end;
82: begin
if (m_nMemberType < LoWord(StdItem.NeedLevel)) or (m_nMemberLevel <
HiWord(StdItem.NeedLevel)) then
Result := False;
end;
end;
end;
procedure TPlayObject.CheckMarry;
var
boIsfound : Boolean;
sUnMarryFileName : string;
LoadList : TStringList;
i : Integer;
sSayMsg : string;
begin
boIsfound := False;
sUnMarryFileName := g_Config.sEnvirDir + 'UnMarry.txt';
if FileExists(sUnMarryFileName) then begin
LoadList := TStringList.Create;
LoadList.LoadFromFile(sUnMarryFileName);
for i := LoadList.Count - 1 downto 0 do begin
if CompareText(LoadList.Strings[i], m_sCharName) = 0 then begin
LoadList.Delete(i);
boIsfound := True;
Break;
end;
end;
LoadList.SaveToFile(sUnMarryFileName);
LoadList.free;
end;
if boIsfound then begin
if m_btGender = 0 then begin
sSayMsg := AnsiReplaceText(g_sfUnMarryManLoginMsg, '%d', m_sDearName);
sSayMsg := AnsiReplaceText(sSayMsg, '%s', m_sDearName);
end else begin
sSayMsg := AnsiReplaceText(g_sfUnMarryWoManLoginMsg, '%d', m_sCharName);
sSayMsg := AnsiReplaceText(sSayMsg, '%s', m_sCharName);
end;
if g_Config.boShowScriptActionMsg then SysMsg(sSayMsg, c_Red, t_Hint);
m_sDearName := '';
RefShowName;
end;
m_DearHuman := UserEngine.GetPlayObject(m_sDearName);
if m_DearHuman <> nil then begin
m_DearHuman.m_DearHuman := Self;
if m_btGender = 0 then begin
sSayMsg := AnsiReplaceText(g_sManLoginDearOnlineSelfMsg, '%d',
m_sDearName);
sSayMsg := AnsiReplaceText(sSayMsg, '%s', m_sCharName);
sSayMsg := AnsiReplaceText(sSayMsg, '%m', m_DearHuman.m_PEnvir.m_sMapDesc);
sSayMsg := AnsiReplaceText(sSayMsg, '%x', IntToStr(m_DearHuman.m_nCurrX));
sSayMsg := AnsiReplaceText(sSayMsg, '%y', IntToStr(m_DearHuman.m_nCurrY));
if g_Config.boShowScriptActionMsg then SysMsg(sSayMsg, c_Blue, t_Hint);
sSayMsg := AnsiReplaceText(g_sManLoginDearOnlineDearMsg, '%d',
m_sDearName);
sSayMsg := AnsiReplaceText(sSayMsg, '%s', m_sCharName);
sSayMsg := AnsiReplaceText(sSayMsg, '%m', m_PEnvir.m_sMapDesc);
sSayMsg := AnsiReplaceText(sSayMsg, '%x', IntToStr(m_nCurrX));
sSayMsg := AnsiReplaceText(sSayMsg, '%y', IntToStr(m_nCurrY));
if g_Config.boShowScriptActionMsg then
m_DearHuman.SysMsg(sSayMsg, c_Blue, t_Hint);
end else begin
sSayMsg := AnsiReplaceText(g_sWoManLoginDearOnlineSelfMsg, '%d',
m_sDearName);
sSayMsg := AnsiReplaceText(sSayMsg, '%s', m_sCharName);
sSayMsg := AnsiReplaceText(sSayMsg, '%m', m_DearHuman.m_PEnvir.m_sMapDesc);
sSayMsg := AnsiReplaceText(sSayMsg, '%x', IntToStr(m_DearHuman.m_nCurrX));
sSayMsg := AnsiReplaceText(sSayMsg, '%y', IntToStr(m_DearHuman.m_nCurrY));
if g_Config.boShowScriptActionMsg then SysMsg(sSayMsg, c_Blue, t_Hint);
sSayMsg := AnsiReplaceText(g_sWoManLoginDearOnlineDearMsg, '%d',
m_sDearName);
sSayMsg := AnsiReplaceText(sSayMsg, '%s', m_sCharName);
sSayMsg := AnsiReplaceText(sSayMsg, '%m', m_PEnvir.m_sMapDesc);
sSayMsg := AnsiReplaceText(sSayMsg, '%x', IntToStr(m_nCurrX));
sSayMsg := AnsiReplaceText(sSayMsg, '%y', IntToStr(m_nCurrY));
if g_Config.boShowScriptActionMsg then
m_DearHuman.SysMsg(sSayMsg, c_Blue, t_Hint);
end;
end else begin
if m_btGender = 0 then begin
if g_Config.boOldClientShowHiLevel then
SysMsg(g_sManLoginDearNotOnlineMsg, c_Red, t_Hint);
end else begin
if g_Config.boOldClientShowHiLevel then
SysMsg(g_sWoManLoginDearNotOnlineMsg, c_Red, t_Hint);
end;
end;
end;
procedure TPlayObject.CheckMaster;
var
boIsfound : Boolean;
sSayMsg, sHumName : string;
i : Integer;
human : TPlayObject;
begin
{处理强行脱离师徒关系}
boIsfound := False;
sHumName := '';
if not m_boMaster then begin //徒弟上线
g_UnForceMasterList.Lock;
try
for i := g_UnForceMasterList.Count - 1 downto 0 do begin
if CompareText(g_UnForceMasterList.Strings[i], m_sCharName) = 0 then begin
g_UnForceMasterList.Delete(i);
SaveUnForceMasterList();
boIsfound := True;
Break;
end;
end;
finally
g_UnForceMasterList.UnLock;
end;
if boIsfound then begin
sSayMsg := AnsiReplaceText(g_sfUnMasterListLoginMsg, '%d', m_sMasterName[1]);
sSayMsg := AnsiReplaceText(sSayMsg, '%s', m_sMasterName[1]);
m_sMasterName[1] := '';
RefShowName;
if g_Config.boOldClientShowHiLevel then SysMsg(sSayMsg, c_Blue, t_Hint);
end;
end else begin //师傅上线
g_UnForceMasterList.Lock;
try
for i := g_UnForceMasterList.Count - 1 downto 0 do begin
sHumName := g_UnForceMasterList.Strings[i];
if (CompareText(sHumName, m_sMasterName[1]) = 0) or
(CompareText(sHumName, m_sMasterName[2]) = 0) or
(CompareText(sHumName, m_sMasterName[3]) = 0) then begin
g_UnForceMasterList.Delete(i);
SaveUnForceMasterList();
boIsfound := True;
Break;
end;
end;
finally
g_UnForceMasterList.UnLock;
end;
if boIsfound then begin
sSayMsg := AnsiReplaceText(g_sfUnMasterLoginMsg, '%d', sHumName);
sSayMsg := AnsiReplaceText(sSayMsg, '%s', sHumName);
if m_sMasterName[1] = sHumName then m_sMasterName[1] := ''
else if m_sMasterName[2] = sHumName then m_sMasterName[2] := ''
else if m_sMasterName[3] = sHumName then m_sMasterName[3] := '';
RefShowName;
if g_Config.boOldClientShowHiLevel then SysMsg(sSayMsg, c_Blue, t_Hint);
end;
end;
{处理徒弟出师}
if (m_sMasterName[1] <> '') and not m_boMaster then begin //徒弟
if m_Abil.level >= g_Config.nMasterOKLevel then begin //出师等级
human := UserEngine.GetPlayObject(m_sMasterName[1]);
{师傅在线}
if (human <> nil) and (not human.m_boDeath) and (not human.m_boGhost) then begin
sSayMsg := AnsiReplaceText(g_sYourMasterListUnMasterOKMsg, '%d', m_sCharName);
if g_Config.boOldClientShowHiLevel then
human.SysMsg(sSayMsg, c_Red, t_Hint);
if g_Config.boOldClientShowHiLevel then
SysMsg(g_sYouAreUnMasterOKMsg, c_Red, t_Hint);
human.ExecuteScript(g_ManageNPC, '@徒弟出师');
{从师傅的徒弟名单中删除}
for i := human.m_MasterList.Count - 1 downto 0 do begin
if human.m_MasterList.Items[i] = Self then begin
human.m_MasterList.Delete(i);
Break;
end;
end;
{将徒弟从师傅的名字上去掉}
if m_sCharName = human.m_sMasterName[1] then
human.m_sMasterName[1] := ''
else if m_sCharName = human.m_sMasterName[2] then
human.m_sMasterName[2] := ''
else if m_sCharName = human.m_sMasterName[3] then
human.m_sMasterName[3] := '';
human.RefShowName;
m_sMasterName[1] := '';
RefShowName;
{师傅加声望}
if human.m_wCreditPoint + g_Config.nMasterOKCreditPoint <= High(word) then begin
Inc(human.m_wCreditPoint, g_Config.nMasterOKCreditPoint);
human.SendUpdateMsg(human, RM_SUBABILITY, 0, 0, 0, 0, '');
end;
Inc(human.m_nBonusPoint, g_Config.nMasterOKBonusPoint);
Inc(human.m_wPrenticeCount); //出师数量加 1
human.SendMsg(human, RM_ADJUST_BONUS, 0, 0, 0, 0, '');
//刷新出师排行
g_RankManage.RefreshOutPrenticeRank(human);
end else begin
{如果师傅不在线,则保存到记录中}
g_UnMasterList.Lock;
try
boIsfound := False;
for i := 0 to g_UnMasterList.Count - 1 do begin
if CompareText(g_UnMasterList.Strings[i], m_sCharName) = 0 then begin
boIsfound := True;
Break;
end;
end;
if not boIsfound then begin
g_UnMasterList.Add(m_sCharName);
end;
finally
g_UnMasterList.UnLock;
end;
if not boIsfound then begin
SaveUnMasterList();
end;
if g_Config.boOldClientShowHiLevel then
SysMsg(g_sYouAreUnMasterOKMsg, c_Red, t_Hint);
m_sMasterName[1] := '';
RefShowName;
end;
//徒弟出师加声望
if g_Config.boPrenticeAddCredit and (m_wCreditPoint + g_Config.nPrenticeCreditPoint <= High(word)) then begin
Inc(m_wCreditPoint, g_Config.nPrenticeCreditPoint);
SendUpdateMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
Inc(m_nBonusPoint, g_Config.nPrenticeBonusPoint);
SendMsg(Self, RM_ADJUST_BONUS, 0, 0, 0, 0, '');
end;
//触发Qmanage.txt中的脚本
ExecuteScript(g_ManageNPC, '@本人出师');
end;
end;
if (not m_boMaster) and (m_sMasterName[1] = '') then Exit;
//处理出师记录
boIsfound := False;
sHumName := '';
g_UnMasterList.Lock;
try
for i := g_UnMasterList.Count - 1 downto 0 do begin
if (CompareText(g_UnMasterList.Strings[i], m_sMasterName[1]) = 0) or
(CompareText(g_UnMasterList.Strings[i], m_sMasterName[2]) = 0) or
(CompareText(g_UnMasterList.Strings[i], m_sMasterName[3]) = 0) then begin
sHumName := g_UnMasterList.Strings[i];
g_UnMasterList.Delete(i); //从出师名单中删除
SaveUnMasterList();
boIsfound := True;
Break;
end;
end;
finally
g_UnMasterList.UnLock;
end;
if boIsfound and m_boMaster then begin
SysMsg(g_sUnMasterLoginMsg, c_Red, t_Hint); //你的一个徒弟已经圆满出师了!!!
if sHumName = m_sMasterName[1] then m_sMasterName[1] := ''
else if sHumName = m_sMasterName[2] then m_sMasterName[2] := ''
else if sHumName = m_sMasterName[3] then m_sMasterName[3] := '';
RefShowName;
if m_wCreditPoint + g_Config.nMasterOKCreditPoint <= High(word) then begin
Inc(m_wCreditPoint, g_Config.nMasterOKCreditPoint);
SendUpdateMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
end;
Inc(m_nBonusPoint, g_Config.nMasterOKBonusPoint);
Inc(m_wPrenticeCount); //出师数量加 1
//刷新出师排行
g_RankManage.RefreshOutPrenticeRank(Self);
SendMsg(Self, RM_ADJUST_BONUS, 0, 0, 0, 0, '');
ExecuteScript(g_ManageNPC, '@徒弟出师');
end;
if m_boMaster and (m_sMasterName[1] = '') and (m_sMasterName[2] = '') and (m_sMasterName[3] = '') then begin
m_boMaster := False;
Exit;
end;
{
if m_boMaster then begin
//师父上线通知
m_MasterHuman := UserEngine.GetPlayObject(m_sMasterName[1]);
if m_MasterHuman <> nil then begin
m_MasterHuman.m_MasterHuman := Self;
m_MasterList.Add(m_MasterHuman);
sSayMsg := AnsiReplaceText(g_sMasterOnlineSelfMsg, '%d',
m_sMasterName[1]);
sSayMsg := AnsiReplaceText(sSayMsg, '%s', m_sCharName);
sSayMsg := AnsiReplaceText(sSayMsg, '%m',
m_MasterHuman.m_PEnvir.m_sMapDesc);
sSayMsg := AnsiReplaceText(sSayMsg, '%x',
IntToStr(m_MasterHuman.m_nCurrX));
sSayMsg := AnsiReplaceText(sSayMsg, '%y',
IntToStr(m_MasterHuman.m_nCurrY));
if g_Config.boOldClientShowHiLevel then SysMsg(sSayMsg, c_Blue, t_Hint);
sSayMsg := AnsiReplaceText(g_sMasterOnlineMasterListMsg, '%d',
m_sMasterName[1]);
sSayMsg := AnsiReplaceText(sSayMsg, '%s', m_sCharName);
sSayMsg := AnsiReplaceText(sSayMsg, '%m', m_PEnvir.m_sMapDesc);
sSayMsg := AnsiReplaceText(sSayMsg, '%x', IntToStr(m_nCurrX));
sSayMsg := AnsiReplaceText(sSayMsg, '%y', IntToStr(m_nCurrY));
if g_Config.boOldClientShowHiLevel then
m_MasterHuman.SysMsg(sSayMsg, c_Blue, t_Hint);
end else begin
if g_Config.boOldClientShowHiLevel then
SysMsg(g_sMasterNotOnlineMsg, c_Red, t_Hint);
end;
end else begin
//徒弟上线通知
if m_sMasterName[1] <> '' then begin
m_MasterHuman := UserEngine.GetPlayObject(m_sMasterName[1]);
if m_MasterHuman <> nil then begin
if m_MasterHuman.m_sMasterName[1] = m_sCharName then begin
m_MasterHuman.m_MasterHuman := Self;
end;
m_MasterHuman.m_MasterList.Add(Self);
sSayMsg := AnsiReplaceText(g_sMasterListOnlineSelfMsg, '%d',
m_sMasterName[1]);
sSayMsg := AnsiReplaceText(sSayMsg, '%s', m_sCharName);
sSayMsg := AnsiReplaceText(sSayMsg, '%m',
m_MasterHuman.m_PEnvir.m_sMapDesc);
sSayMsg := AnsiReplaceText(sSayMsg, '%x',
IntToStr(m_MasterHuman.m_nCurrX));
sSayMsg := AnsiReplaceText(sSayMsg, '%y',
IntToStr(m_MasterHuman.m_nCurrY));
if g_Config.boOldClientShowHiLevel then
SysMsg(sSayMsg, c_Blue, t_Hint);
sSayMsg := AnsiReplaceText(g_sMasterListOnlineMasterMsg, '%d',
m_sMasterName[1]);
sSayMsg := AnsiReplaceText(sSayMsg, '%s', m_sCharName);
sSayMsg := AnsiReplaceText(sSayMsg, '%m', m_PEnvir.m_sMapDesc);
sSayMsg := AnsiReplaceText(sSayMsg, '%x', IntToStr(m_nCurrX));
sSayMsg := AnsiReplaceText(sSayMsg, '%y', IntToStr(m_nCurrY));
if g_Config.boOldClientShowHiLevel then
m_MasterHuman.SysMsg(sSayMsg, c_Blue, t_Hint);
end else begin
if g_Config.boOldClientShowHiLevel then
SysMsg(g_sMasterListNotOnlineMsg, c_Red, t_Hint);
end;
end;
end;
}
end;
procedure TPlayObject.CheckPackPetShop();
var
i : Integer;
nCode : Integer;
UserItem : pTUserItem;
StdItem : pTStdItem;
tm : LongWord;
resourcestring
sExceptionMsg = '[Exception] TPlayObject::CheckPackPetShop Name=%s Code=%d';
begin
try
nCode := 0;
if m_PetInfo[1].nMakeIndex <> 0 then begin
m_PackPet := g_PetBoothManage.GetPetSellObject(m_dwDBIndex);
nCode := 1;
if (m_PackPet <> nil) and (not m_PackPet.m_boGhost) and (not m_PackPet.m_boDeath) then begin
if (m_PetInfo[0].nMakeIndex = m_PetInfo[1].nMakeIndex) or
(m_PetInfo[2].nMakeIndex = m_PetInfo[1].nMakeIndex) or
(m_PetInfo[3].nMakeIndex = m_PetInfo[1].nMakeIndex) or
(m_PetInfo[4].nMakeIndex = m_PetInfo[1].nMakeIndex) or
(m_PetInfo[5].nMakeIndex = m_PetInfo[1].nMakeIndex) then begin
PetHide(m_PetInfo[1].nMakeIndex);
end;
m_nPetTargetX := m_PackPet.m_nCurrX;
m_nPetTargetY := m_PackPet.m_nCurrY;
nCode := 2;
SendDefMessage(34979, 0, 1, 0, 0, Format('你的宠物在%s(%d:%d)为你守摊。',
[m_PackPet.m_PEnvir.m_sMapDesc, m_PackPet.m_nCurrX, m_PackPet.m_nCurrY]));
SysMsg(Format('你的宠物在%s(%d:%d)为你守摊。',
[m_PackPet.m_PEnvir.m_sMapDesc, m_PackPet.m_nCurrX, m_PackPet.m_nCurrY]), c_Red, t_Hint);
nCode := 3;
if GetUserItemByMakeIndex(m_PetInfo[1].nMakeIndex, UserItem) >= 0 then begin
nCode := 4;
m_PetInfo[1].wLevel := MakeWord(UserItem.btValue[4], UserItem.btValue[5]);
m_PetInfo[1].btType := 0;
m_PetInfo[1].btReLive := UserItem.btValue[9];
m_PetInfo[1].btRideFightSpeed := UserItem.btRideSpeed;
m_PetInfo[1].btAttack := UserItem.btExtra.btAttack; //骑战技能攻击距离
//骑战速度
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
nCode := 5;
if (StdItem <> nil) then begin
if (UserItem.btValue[9] > 0) then begin
nCode := 6;
case StdItem.AniCount of
0: m_PetInfo[1].btType := 10 + UserItem.btValue[8];
1: m_PetInfo[1].btType := 13 + UserItem.btValue[8];
2: m_PetInfo[1].btType := 16 + UserItem.btValue[8];
3: m_PetInfo[1].btType := 19 + UserItem.btValue[8];
4: m_PetInfo[1].btType := 22 + UserItem.btValue[8];
5: m_PetInfo[1].btType := 25 + UserItem.btValue[8];
6: m_PetInfo[1].btType := 28 + UserItem.btValue[8];
7: m_PetInfo[1].btType := 31 + UserItem.btValue[8];
8: m_PetInfo[1].btType := 34 + UserItem.btValue[8];
9: m_PetInfo[1].btType := 37 + UserItem.btValue[8];
10: m_PetInfo[1].btType := 38 + UserItem.btValue[8];
11: m_PetInfo[1].btType := 43 + UserItem.btValue[8];
12: m_PetInfo[1].btType := 44 + UserItem.btValue[8];
13: m_PetInfo[1].btType := 45 + UserItem.btValue[8];
14: m_PetInfo[1].btType := 40 + UserItem.btValue[8];
15: m_PetInfo[1].btType := 46 + UserItem.btValue[8];
end;
end else begin
nCode := 7;
case StdItem.AniCount of
0: m_PetInfo[1].btType := 11;
1: m_PetInfo[1].btType := 14;
2: m_PetInfo[1].btType := 17;
3: m_PetInfo[1].btType := 20;
4: m_PetInfo[1].btType := 23;
5: m_PetInfo[1].btType := 26;
6: m_PetInfo[1].btType := 29;
7: m_PetInfo[1].btType := 32;
8: m_PetInfo[1].btType := 35;
9: m_PetInfo[1].btType := 38;
10: m_PetInfo[1].btType := 39;
11: m_PetInfo[1].btType := 44;
12: m_PetInfo[1].btType := 45;
13: m_PetInfo[1].btType := 46;
14: m_PetInfo[1].btType := 41;
15: m_PetInfo[1].btType := 47;
end;
end;
end;
nCode := 8;
SendPetInfo($03);
nCode := 9;
end;
end else begin
nCode := 10;
m_PackPet := nil;
m_nSlaveKillMonCount := m_PetInfo[1].nMakeIndex;
m_PetInfo[1].nMakeIndex := 0;
SysMsg('灵兽守摊结束', c_Red, t_Hint);
end;
end;
//凤凰探宝
if m_PetInfo[4].nMakeIndex <> 0 then begin
nCode := 11;
if GetUserItemByMakeIndex(m_PetInfo[4].nMakeIndex, UserItem) >= 0 then begin
nCode := 12;
tm := MakeLong(MakeWord(UserItem.btValue[0], UserItem.btValue[1]), MakeWord(UserItem.btValue[2], UserItem.btValue[3]));
if (DateTimeToWolTIme(Now) - tm) < 4 * 86400 then begin
nCode := 13;
m_PetInfo[4].wLevel := MakeWord(UserItem.btValue[4], UserItem.btValue[5]);
m_PetInfo[4].btType := 0;
m_PetInfo[4].btReLive := UserItem.btValue[9];
m_PetInfo[4].btRideFightSpeed := UserItem.btRideSpeed;
m_PetInfo[4].btAttack := UserItem.btExtra.btAttack; //骑战技能攻击距离
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if (StdItem <> nil) then begin
if (UserItem.btValue[9] > 0) then begin
nCode := 14;
case StdItem.AniCount of
0: m_PetInfo[4].btType := 10 + UserItem.btValue[8];
1: m_PetInfo[4].btType := 13 + UserItem.btValue[8];
2: m_PetInfo[4].btType := 16 + UserItem.btValue[8];
3: m_PetInfo[4].btType := 19 + UserItem.btValue[8];
4: m_PetInfo[4].btType := 22 + UserItem.btValue[8];
5: m_PetInfo[4].btType := 25 + UserItem.btValue[8];
6: m_PetInfo[4].btType := 28 + UserItem.btValue[8];
7: m_PetInfo[4].btType := 31 + UserItem.btValue[8];
8: m_PetInfo[4].btType := 34 + UserItem.btValue[8];
9: m_PetInfo[4].btType := 37 + UserItem.btValue[8];
10: m_PetInfo[4].btType := 38 + UserItem.btValue[8];
11: m_PetInfo[4].btType := 43 + UserItem.btValue[8];
12: m_PetInfo[4].btType := 44 + UserItem.btValue[8];
13: m_PetInfo[4].btType := 45 + UserItem.btValue[8];
14: m_PetInfo[4].btType := 40 + UserItem.btValue[8];
15: m_PetInfo[4].btType := 46 + UserItem.btValue[8];
end;
end else begin
nCode := 15;
case StdItem.AniCount of
0: m_PetInfo[4].btType := 11;
1: m_PetInfo[4].btType := 14;
2: m_PetInfo[4].btType := 17;
3: m_PetInfo[4].btType := 20;
4: m_PetInfo[4].btType := 23;
5: m_PetInfo[4].btType := 26;
6: m_PetInfo[4].btType := 29;
7: m_PetInfo[4].btType := 32;
8: m_PetInfo[4].btType := 35;
9: m_PetInfo[4].btType := 38;
10: m_PetInfo[4].btType := 39;
11: m_PetInfo[4].btType := 44;
12: m_PetInfo[4].btType := 45;
13: m_PetInfo[4].btType := 46;
14: m_PetInfo[4].btType := 41;
15: m_PetInfo[4].btType := 47;
end;
end;
end;
nCode := 16;
SendPetInfo($09);
nCode := 17;
end else begin
nCode := 18;
ClientPhoenixSearch(m_PetInfo[4].nMakeIndex, 1); //召回凤凰
nCode := 19;
end;
end else begin
m_PetInfo[4].nMakeIndex := 0;
end;
end;
nCode := 20;
//魂佑附体
if m_PetInfo[5].nMakeIndex <> 0 then begin
if GetUserItemByMakeIndex(m_PetInfo[5].nMakeIndex, UserItem) >= 0 then begin
nCode := 21;
tm := MakeLong(MakeWord(UserItem.btValue[0], UserItem.btValue[1]), MakeWord(UserItem.btValue[2], UserItem.btValue[3]));
if (DateTimeToWolTIme(Now) - tm) < 4 * 86400 then begin
nCode := 22;
m_PetInfo[5].wLevel := MakeWord(UserItem.btValue[4], UserItem.btValue[5]);
m_PetInfo[5].btType := 0;
m_PetInfo[5].btReLive := UserItem.btValue[9];
m_PetInfo[5].btRideFightSpeed := UserItem.btRideSpeed;
m_PetInfo[5].boUnWater := (UserItem.btItemExt[24] <> 0); //避水灵性
m_PetInfo[5].btSoul := byte(UserItem.btItemExt[29] >= 2); //魂佑灵兽
m_PetInfo[5].btAttack := UserItem.btExtra.btAttack; //骑战技能攻击距离
nCode := 23;
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if (StdItem <> nil) then begin
nCode := 24;
if (UserItem.btValue[9] > 0) then begin
nCode := 25;
case StdItem.AniCount of
0: m_PetInfo[5].btType := 10 + UserItem.btValue[8];
1: m_PetInfo[5].btType := 13 + UserItem.btValue[8];
2: m_PetInfo[5].btType := 16 + UserItem.btValue[8];
3: m_PetInfo[5].btType := 19 + UserItem.btValue[8];
4: m_PetInfo[5].btType := 22 + UserItem.btValue[8];
5: m_PetInfo[5].btType := 25 + UserItem.btValue[8];
6: m_PetInfo[5].btType := 28 + UserItem.btValue[8];
7: m_PetInfo[5].btType := 31 + UserItem.btValue[8];
8: m_PetInfo[5].btType := 34 + UserItem.btValue[8];
9: m_PetInfo[5].btType := 37 + UserItem.btValue[8];
10: m_PetInfo[5].btType := 38 + UserItem.btValue[8];
11: m_PetInfo[5].btType := 43 + UserItem.btValue[8];
12: m_PetInfo[5].btType := 44 + UserItem.btValue[8];
13: m_PetInfo[5].btType := 45 + UserItem.btValue[8];
14: m_PetInfo[5].btType := 40 + UserItem.btValue[8];
15: m_PetInfo[5].btType := 46 + UserItem.btValue[8];
end;
end else begin
nCode := 26;
case StdItem.AniCount of
0: m_PetInfo[5].btType := 11;
1: m_PetInfo[5].btType := 14;
2: m_PetInfo[5].btType := 17;
3: m_PetInfo[5].btType := 20;
4: m_PetInfo[5].btType := 23;
5: m_PetInfo[5].btType := 26;
6: m_PetInfo[5].btType := 29;
7: m_PetInfo[5].btType := 32;
8: m_PetInfo[5].btType := 35;
9: m_PetInfo[5].btType := 38;
10: m_PetInfo[5].btType := 39;
11: m_PetInfo[5].btType := 44;
12: m_PetInfo[5].btType := 45;
13: m_PetInfo[5].btType := 46;
14: m_PetInfo[5].btType := 41;
15: m_PetInfo[5].btType := 47;
end;
end;
end;
nCode := 27;
m_boBeast := True;
UserItem.btItemExt[29] := 3;
SendUpdateItem(UserItem, False);
SendDefMessage(1283, Integer(Self), m_nCurrX, m_nCurrY, 65535, '');
SendRefMsg(RM_510, 1, 0, 170, 0, '');
SendPetInfo($0A);
RecalcPetSoulAbilitys;
nCode := 28;
end else begin
nCode := 29;
m_PetInfo[5].nMakeIndex := 0;
UserItem.btItemExt[29] := 2;
SendUpdateItem(UserItem, False);
nCode := 30;
end;
nCode := 31;
RecalcAbilitys(); //重新计算属性
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
nCode := 32;
end;
end;
except
on E: Exception do
MainOutMessage(Format(sExceptionMsg, [m_sCharName, nCode]));
end;
end;
//检测是否有 潜行
procedure TPlayObject.CheckProwlMagic();
var
i : Integer;
BaseObject : TBaseObject;
VisibleBaseObject : pTVisibleBaseObject;
begin
if m_boObMode and (m_wStatusTimeArr[STATE_PROWL {19}] > 0) then begin
m_boObMode := False;
for i := 0 to m_VisibleActors.Count - 1 do begin
VisibleBaseObject := pTVisibleBaseObject(m_VisibleActors.Items[i]);
BaseObject := TBaseObject(VisibleBaseObject.BaseObject);
if BaseObject.m_btRaceServer = RC_PLAYOBJECT then
TPlayObject(BaseObject).SendMsg(Self,
RM_TURN, m_btDirection, m_nCurrX, m_nCurrY, CalcCent(m_WAbil.dwHP, m_WAbil.dwMaxHP), GetShowName);
end;
m_wStatusTimeArr[STATE_PROWL {19}] := 1;
end;
end;
//检测用户身上过期装备
function TPlayObject.CheckUserItemTimeOut(UserItem: pTUserItem; StdItem: pTStdItem): Boolean;
var
tm, nowtm : DWORD;
begin
Result := False;
tm := 0;
if (StdItem.StdMode = 18) or ((StdItem.StdMode = 29) and (StdItem.Shape = 150)) then begin
if (StdItem.StdMode = 29) and (StdItem.Shape = 150) and (StdItem.AniCount = 1) then
tm := MakeLong(MakeWord(UserItem.btItemExt[0], UserItem.btItemExt[1]), MakeWord(UserItem.btItemExt[2], UserItem.btItemExt[3]))
else
tm := MakeLong(MakeWord(UserItem.btValue[0], UserItem.btValue[1]), MakeWord(UserItem.btValue[2], UserItem.btValue[3]));
if (tm = 0) then begin //第一次使用
tm := DateTimeToWolTIme(Now);
if (StdItem.StdMode = 29) and (StdItem.Shape = 150) and (StdItem.AniCount = 1) then begin
UserItem.btItemExt[0] := LoByte(LoWord(tm));
UserItem.btItemExt[1] := HiByte(LoWord(tm));
UserItem.btItemExt[2] := LoByte(HiWord(tm));
UserItem.btItemExt[3] := HiByte(HiWord(tm));
end else begin
UserItem.btValue[0] := LoByte(LoWord(tm));
UserItem.btValue[1] := HiByte(LoWord(tm));
UserItem.btValue[2] := LoByte(HiWord(tm));
UserItem.btValue[3] := HiByte(HiWord(tm));
end;
SendUpdateItem(UserItem);
end else begin
nowtm := DateTimeToWolTIme(Now);
if (StdItem.Shape = 150) and (tm + Round(UserItem.Dura / 1000) * 86400 < nowtm) then begin
Result := True;
end;
end;
end else if (StdItem.StdMode = 6) and (StdItem.Shape = 20) and (StdItem.AniCount > 0) then begin
tm := MakeLong(MakeWord(UserItem.btItemExt2[146], UserItem.btItemExt2[147]), MakeWord(UserItem.btItemExt2[148], UserItem.btItemExt2[149]));
if (tm = 0) then begin
tm := DateTimeToWolTIme(Now);
UserItem.btItemExt2[146] := LoByte(LoWord(tm));
UserItem.btItemExt2[147] := HiByte(LoWord(tm));
UserItem.btItemExt2[148] := LoByte(HiWord(tm));
UserItem.btItemExt2[149] := HiByte(HiWord(tm));
SendUpdateItem(UserItem);
end else begin
nowtm := DateTimeToWolTIme(Now);
if (tm + Round(StdItem.AniCount * 60) < nowtm) then begin
Result := True;
end;
end;
end;
end;
procedure TPlayObject.ClearEvilFollower(nCode: Integer);
var
i : Integer;
BaseObject : TBaseObject;
boChg : Boolean;
begin
boChg := False;
for i := m_SlaveList.Count - 1 downto 0 do begin
BaseObject := TBaseObject(m_SlaveList[i]);
if (BaseObject.m_btRaceServer = RC_EVIL) and (BaseObject.m_nSlaveType <> -2) then begin
case nCode of
0: begin
BaseObject.m_dwEvilUniQueSkillTick := GetTickCount; //心魔绝杀
BaseObject.m_nCharStatus := BaseObject.GetCharStatus();
BaseObject.StatusChanged();
end;
1: begin //心魔红名
BaseObject.m_btNameColor := $F9;
BaseObject.RefNameColor;
BaseObject.RefShowName;
end;
2: begin //冻结心魔
BaseObject.MakePosion(POISON_DONTMOVE, 6000, 0);
end;
3: begin //释放心魔
SysMsg(Format('你的宠物(%s)叛变了', [BaseObject.m_sFilterCharName]), c_Pink, t_Hint);
BaseObject.m_Master := nil;
BaseObject.m_boSuperMan := False;
BaseObject.m_wStatusTimeArr[POISON_DONTMOVE] := 1;
BaseObject.RefNameColor;
BaseObject.RefShowName;
BaseObject.HealthSpellChanged;
m_SlaveList.Delete(i);
SendDefMessage(CM_RECALLEVIL, 0, 1, 0, 0, '');
m_nEvilFollowerPower := 0;
boChg := True;
end;
4: begin //解除心魔冻结
if BaseObject.m_wStatusTimeArr[POISON_DONTMOVE] > 0 then begin
BaseObject.m_wStatusTimeArr[POISON_DONTMOVE] := 1;
end;
if (BaseObject.m_btNameColor <> $FF) then begin
BaseObject.m_btNameColor := $FF;
BaseObject.RefNameColor;
BaseObject.RefShowName;
end;
BaseObject.HealthSpellChanged;
end;
5: begin
BaseObject.HealthSpellChanged;
end;
6: begin
BaseObject.MakeGhost;
m_SlaveList.Delete(i);
SendDefMessage(CM_RECALLEVIL, 0, 1, 0, 0, '');
m_nEvilFollowerPower := 0;
boChg := True;
end;
end;
end;
end;
if boChg then ClientQueryEvilFollower();
end;
//清除人物状态时间标志
procedure TPlayObject.ClearStatusTime;
begin
FillChar(m_wStatusTimeArr, SizeOf(TStatusTime), 0);
end;
{查看棋座??}
procedure TPlayObject.ClickQueryMsg(NPCID: Integer; btnid: Integer);
function CheckBagItemDura(sItemName: string; nItemCount: Integer): Integer;
var
i, nCurCount : Integer;
UserItem : pTUserItem;
StdItem : pTStdItem;
nIndex : Integer;
begin
Result := 0;
if sItemName = '' then Exit;
if nItemCount <= 0 then Exit;
nIndex := UserEngine.GetStdItemIdx(sItemName);
if nIndex > 0 then begin
StdItem := UserEngine.GetStdItem(nIndex);
if StdItem = nil then Exit;
for i := m_ItemList.Count - 1 downto 0 do begin
if nItemCount <= 0 then Break;
UserItem := pTUserItem(m_ItemList.Items[i]);
if UserItem = nil then Exit;
if UserItem.wIndex = nIndex then begin
nCurCount := 0;
if UserItem.Dura > nItemCount then begin
nCurCount := nItemCount;
end else begin
nCurCount := UserItem.Dura;
end;
Dec(nItemCount, nCurCount);
Inc(Result, nCurCount);
end;
end;
end;
end;
function TakeBagItemDura(sItemName: string; nItemCount: Integer): Integer;
var
i, nCurCount : Integer;
UserItem : pTUserItem;
StdItem : pTStdItem;
nIndex : Integer;
begin
Result := 0;
if sItemName = '' then Exit;
if nItemCount <= 0 then Exit;
nIndex := UserEngine.GetStdItemIdx(sItemName);
if nIndex > 0 then begin
StdItem := UserEngine.GetStdItem(nIndex);
if StdItem = nil then Exit;
for i := m_ItemList.Count - 1 downto 0 do begin
if nItemCount <= 0 then Break;
UserItem := pTUserItem(m_ItemList.Items[i]);
if UserItem = nil then Exit;
if UserItem.wIndex = nIndex then begin
if StdItem.boGameLog = 1 then
AddGameDataLog('10' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
sItemName + #9 +
IntToStr(UserItem.MakeIndex) + #9 +
'1' + #9 +
m_sCharName);
nCurCount := 0;
if UserItem.Dura > nItemCount then begin
nCurCount := nItemCount;
Dec(UserItem.Dura, nItemCount);
SendUpdateItem(UserItem);
end else begin
nCurCount := UserItem.Dura;
SendDelItems(UserItem);
if UserItem.MakeIndex = m_nEatItemMakeIndex then
m_nEatItemMakeIndex := 0;
Dispose(UserItem);
m_ItemList.Delete(i);
end;
Dec(nItemCount, nCurCount);
Inc(Result, nCurCount);
end;
end;
end;
end;
var
NPC : TNormNpc;
nMakeIndex : Integer;
UserItem : pTUserItem;
StdItem : pTStdItem;
begin
NPC := UserEngine.FindMerchant(TObject(NPCID));
if NPC = nil then NPC := UserEngine.FindNPC(TObject(NPCID));
if NPC <> nil then begin
if NPC = nil then Exit;
if m_sNextLabel <> '' then begin
try
NPC.GotoLable(Self, m_sNextLabel + IntToStr(btnid), False);
except
end;
end;
end else begin
//破碎物品修复
if (Pos('Fracture', m_sNextLabel) > 0) and (btnid = 1) then begin
nMakeIndex := Str_ToInt(Copy(m_sNextLabel, 10, Length(m_sNextLabel)), 0);
GetUserItemByMakeIndex(nMakeIndex, UserItem);
if UserItem <> nil then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
if CheckBagItemDura('五色晶石', StdItem.Broken) >= StdItem.Broken then begin
UserItem.btItemExt[4] := 0;
UserItem.Dura := UserItem.DuraMax;
SendUpdateItem(UserItem);
TakeBagItemDura('五色晶石', StdItem.Broken);
end else SendMsg(Self, RM_SYSMESSAGE, 0, 255, 253, 0,
'你包裹中没有五色晶石或者其持久不够,请到商城购买后再进行修复。');
end;
end;
end;
end;
end;
resourcestring
sTreasureName = '灵犀宝盒';
sHaveNoNimBusPoint = '你身上没有这么多灵力,无法为灵犀宝盒注入灵力。';
sNeedInjectPower = '灵犀宝盒的灵力耗尽,不能向宝盒中存入物品和从宝盒中取出物品,需要重新冲入灵力。';
sCanNotInTreasureBox = '灵犀宝盒储物能力有限,不能保存%s';
procedure TPlayObject.ClientActivationTreasureBox();
var
UserItem : TUserItem;
pStdItem : pTStdItem;
tm : DWORD;
d : TDateTime;
begin
if m_boGhost or
m_boDeath or
(m_TreasureBoxItem <> nil) or
(m_TreasureBoxItemList.Count > 0) then
Exit;
if (m_Abil.wNimBusPoint < 10) then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, sHaveNoNimBusPoint);
Exit;
end;
if UserEngine.CopyToUserItemFromName(sTreasureName, @UserItem) then begin
Dec(m_Abil.wNimBusPoint, 10);
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
tm := DateTimeToWolTimeEx(Now);
Move(tm, UserItem.btValue[0], 4); //激活时间
tm := DateTimeToWolTimeEx(AddDateTimeOfDay(Now, 8)); //到期时间
Move(tm, UserItem.btValue[4], 4);
UserItem.Dura := 0;
UserItem.DuraMax := 10; //开通的格子数量
New(m_TreasureBoxItem);
m_TreasureBoxItem^ := UserItem;
ClientQueryTreasureBoxItems(False);
end else begin
SysMsg('本功能尚未开放,敬请期待!', c_Red, t_Hint);
end;
end;
function TPlayObject.GetEvilRecByMakeIndex(nItemMakeIndex: Integer): pTEvil;
begin
end;
procedure TPlayObject.DelEvilRec(nItemMakeIndex: Integer; DisMem: Boolean = True);
begin
end;
{增加装备装备镇魔值}
procedure TPlayObject.ClientAddAntiEvilPower(nWhere: word; nMakeIndex,
nAntiEvilItem: Integer);
var
i : Integer;
UserItem, Item : pTUserItem;
StdItem, StdItem34 : pTStdItem;
nA, nB : word;
boOk : Boolean;
begin
boOk := False;
nA := 0;
nB := 0;
if not m_boCanUseItem then Exit;
if (not m_boDeath) and (not m_boGhost) then begin
GetUserItemByMakeIndex(nAntiEvilItem, UserItem);
if nWhere = 256 then begin
GetUserItemByMakeIndex(nMakeIndex, Item)
end else begin
Item := nil;
if (nWhere < MAX_HUMITEM_COUNT) and (m_UseItems[nWhere].wIndex > 0) then
Item := @m_UseItems[nWhere]; //装备
end;
if (UserItem <> nil) and (Item <> nil) and (Item.MakeIndex = nMakeIndex) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex); //镇魔符
StdItem34 := UserEngine.GetStdItem(Item.wIndex); //装备
if (StdItem34 <> nil) and (StdItem <> nil) then begin
if UserItem.Dura > 0 then begin
{镇魔值}
if (Item.Evil.wPower >= 65000) then begin
SysMsg(Format('%s的镇魔力量已经很强了,不需要在增加镇魔值!', [StdItem34.FilterName]), c_Red, t_Hint);
Exit;
end;
Item.Evil.wPower := _MIN(65000, Item.Evil.wPower + StdItem.AC * 1000);
{黑暗魔力}
if g_Config.boAntiEvilItemAddGloomPoint then begin
nA := StdItem.AC * g_Config.nAddGloomPointRate + Random(g_Config.nAddGloomRandomPoint);
Move(Item.btItemExt[0], nB, 2);
nA := _MIN(High(word), nA + nB);
Move(nA, Item.btItemExt[0], 2);
end;
{触发脚本}
m_sScriptParam[0] := Item.Evil.sName;
m_sScriptParam[1] := IntToStr(nWhere);
m_sScriptParam[2] := IntToStr(Item.MakeIndex);
m_sScriptParam[3] := IntToStr(UserItem.MakeIndex);
m_sScriptParam[4] := StdItem34.Name;
m_sScriptParam[5] := StdItem.Name;
ExecuteScript(g_FunctionNPC, '@增加镇魔值');
SendUpdateItem(Item);
if nWhere = 256 then
SendDefMessage(SM_ANTIEVILPOWER, Item.MakeIndex, Item.Evil.wPower, nWhere, 0, ''); //刷新镇魔值
if not boOk then begin
if (Item.Evil.wPower >= 65000) then
SysMsg(Format('%s的镇魔值已满,黑暗魔力进一步提升!', [StdItem34.FilterName]), c_Red, t_Hint)
else
SysMsg(Format('%s的镇魔值和黑暗魔力同时获得了提升!', [StdItem34.FilterName]), c_Red, t_Hint);
end;
SendDefMessage(SM_EAT_OK, 0, 0, 0, 0, '');
Dec(UserItem.Dura);
SendUpdateItem(UserItem);
end;
end;
if UserItem.Dura <= 0 then begin
SendDelItems(UserItem);
DelBagItem(UserItem.MakeIndex, UserEngine.GetStdItemName(UserItem.wIndex));
end;
end;
end;
end;
//添加要交易的物品
procedure TPlayObject.ClientAddDealItem(nItemIdx: Integer; sItemName: string);
var
i, ii : Integer;
bo11 : Boolean;
UserItem : pTUserItem;
sName : string;
StdName : string;
tm : DWORD;
StdItem : pTStdItem;
begin
if (m_DealCreat = nil) or (not m_boDealing) then Exit;
bo11 := False;
if not m_DealCreat.m_boDealOK then begin
for i := m_ItemList.Count - 1 downto 0 do begin
UserItem := m_ItemList.Items[i];
if UserItem.MakeIndex = nItemIdx then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem = nil then Break;
//物品控制-禁止交易物品
if CheckSPCode(StdItem.SPCode, SP_DISABLESALE) or
((UserItem.btItemExt[4] and EX_BIND) = EX_BIND) then begin
bo11 := False;
Break;
end;
{魂佑灵兽禁止交易}
if (StdItem.StdMode = 49) and (StdItem.Shape = 51) and (UserItem.btItemExt[29] >= 2) then
Break;
{已放出豹禁止交易}
if IsDownPetItem(UserItem.MakeIndex) then
Break;
{自定义物品名称}
sName := '';
ItemUnit.GetCustomItemName(UserItem, sName);
if (CompareText(sItemName, sName) = 0) and (m_DealItemList.Count < 12) then begin
m_DealItemList.Add(UserItem);
TPlayObject(Self).SendAddDealItem(UserItem);
m_ItemList.Delete(i);
bo11 := True;
Break;
end;
end;
end;
end;
if not bo11 then
SendDefMessage(SM_DEALADDITEM_FAIL, 0, 0, 0, 0, '');
end;
{附加心魔到装备}
procedure TPlayObject.ClientAddEvilToItem(nWhere: word; nMakeIndex, BottleIndex: Integer);
var
boOk : Boolean;
UserItem, BottleItem : pTUserItem;
StdItem : pTStdItem;
begin
boOk := False;
if not m_boCanUseItem then Exit;
if (not m_boDeath) and (not m_boGhost) then begin
GetUserItemByMakeIndex(BottleIndex, BottleItem);
GetUserItemByMakeIndex(nMakeIndex, UserItem);
if (UserItem <> nil) and (BottleItem <> nil) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
if (BottleItem.Evil.sName = '') or (BottleItem.Evil.MakeIndex = 0) then begin
SysMsg('无法从玉净瓶中感应到心魔气息,不能附魔!', c_Red, t_Hint);
Exit;
end;
if CheckSPCode(StdItem.SPCode, SP_DISABLEGETEVIL) then begin //物品控制-禁止附魔
SysMsg('该物品不能用于被附魔!', c_Red, t_Hint);
Exit;
end;
if BottleItem.Evil.wPower < 2000 then begin
SysMsg('玉净瓶的镇魔力量太弱,不能附魔!', c_Red, t_Hint);
Exit;
end else begin
m_sScriptParam[0] := BottleItem.Evil.sName;
m_sScriptParam[1] := IntToStr(nWhere);
m_sScriptParam[2] := IntToStr(UserItem.MakeIndex);
m_sScriptParam[3] := IntToStr(BottleItem.MakeIndex);
m_sScriptParam[4] := UserEngine.GetStdItemName(UserItem.wIndex);
m_sScriptParam[5] := UserEngine.GetStdItemName(BottleItem.wIndex);
boOk := ExecuteScript(g_FunctionNPC, '@装备附魔');
{直接给装备附魔}
if not boOk then
AddEvilToItemB(nWhere, nMakeIndex, BottleIndex);
end;
end;
end;
end;
end;
//添加好友
procedure TPlayObject.ClientAddFriend(FriendName: string);
var
i, j : Integer;
s : string;
human : TPlayObject;
C : Char;
begin
//检查好友数量,不能超过100个
if m_FriendsList.Count >= _MIN(g_Config.nFriendCount, MAX_FRIENDS_COUNT) then begin
SysMsg('你的好友数量已经达到最大,请删除一部分后再添加。', c_Red, t_Hint);
Exit;
end;
//首先检查是否在已经有的好友名单中
for i := 0 to m_FriendsList.Count - 1 do begin
if m_FriendsList[i] = FriendName then begin
//已经在好友列表中
SendDefMessage(SM_RefuseAddFriend, 5, 0, 0, 0, FriendName);
Exit;
end;
end;
human := UserEngine.GetPlayObject(FriendName);
//对方在线
if (human <> nil) and (not human.m_boDeath) and (not human.m_boGhost) then begin
//检查对方是否允许加为好友
if human.m_boAllowAddFriend then begin
human.SendDefMessage(SM_ReqAddFriend, 2, 0, 0, 0, m_sCharName);
m_sScriptParam[0] := FriendName;
ExecuteScript(g_ManageNPC, '@人脉_添加好友');
end else
SysMsg(FriendName + '玩家暂时不能被添加为好友,添加失败。', c_Red, t_Hint);
end else begin //名字错误,或者不在线
SendDefMessage(SM_RefuseAddFriend, 2, 0, 0, 0, FriendName);
end;
end;
//增加队伍成员
procedure TPlayObject.ClientAddGroupMember(sHumName: string); //004DCE48
var
PlayObject : TPlayObject;
i : Integer;
begin
PlayObject := UserEngine.GetPlayObject(sHumName);
if m_GroupOwner <> Self then begin
SendDefMessage(SM_GROUPADDMEM_FAIL, -1, 0, 0, 0, '');
Exit;
end;
if m_GroupMembers.Count > g_Config.nGroupMembersMax then begin
SendDefMessage(SM_GROUPADDMEM_FAIL, -5, 0, 0, 0, '');
Exit;
end;
if (PlayObject = nil) or (PlayObject = Self) or PlayObject.m_boDeath or
PlayObject.m_boGhost then begin
SendDefMessage(SM_GROUPADDMEM_FAIL, -2, 0, 0, 0, '');
Exit;
end;
if (PlayObject.m_PEnvir <> m_PEnvir) then begin //增加控制:只有在同一地图才可以加入组队
SendDefMessage(SM_GROUPADDMEM_FAIL, -2, 0, 0, 0, '');
Exit;
end;
if (PlayObject.m_GroupOwner <> nil) then begin
SendDefMessage(SM_GROUPADDMEM_FAIL, -3, 0, 0, 0, '');
Exit;
end;
if (PlayObject.m_boPneuma) then begin
SendDefMessage(SM_GROUPADDMEM_FAIL, -2, 0, 0, 0, '');
Exit;
end;
//增加判断,组队中不允许同名队员 xyfate 2005/10/19
for i := 0 to m_GroupMembers.Count - 1 do begin
if m_GroupMembers[i] = sHumName then begin
SendDefMessage(SM_GROUPADDMEM_FAIL, -2, 0, 0, 0, '');
Exit;
end;
end;
if (not PlayObject.m_boAllowGroup) then begin
SendDefMessage(SM_GROUPADDMEM_FAIL, -4, 0, 0, 0, '');
Exit;
end;
m_GroupMembers.AddObject(sHumName, PlayObject);
PlayObject.JoinGroup(Self);
SendDefMessage(SM_GROUPADDMEM_OK, 0, 0, 0, 0, '');
SendGroupMembers();
ExecuteScript(g_FunctionNPC, '@_加入队伍');
end;
//调整属性值
procedure TPlayObject.ClientAdjustBonus(nPoint: Integer; sMsg: string);
//004DF804
var
BonusAbil : TNakedAbility;
nTotleUsePoint : Integer;
begin
FillChar(BonusAbil, SizeOf(TNakedAbility), #0);
DeCodeBuffer(sMsg, @BonusAbil, SizeOf(TNakedAbility));
nTotleUsePoint := BonusAbil.DC +
BonusAbil.MC +
BonusAbil.SC +
BonusAbil.AC +
BonusAbil.MAC +
BonusAbil.HP +
BonusAbil.MP +
BonusAbil.Hit +
BonusAbil.Speed +
BonusAbil.X2;
if (nPoint + nTotleUsePoint) = m_nBonusPoint then begin
m_nBonusPoint := nPoint;
Inc(m_BonusAbil.DC, BonusAbil.DC);
Inc(m_BonusAbil.MC, BonusAbil.MC);
Inc(m_BonusAbil.SC, BonusAbil.SC);
Inc(m_BonusAbil.AC, BonusAbil.AC);
Inc(m_BonusAbil.MAC, BonusAbil.MAC);
Inc(m_BonusAbil.HP, BonusAbil.HP);
Inc(m_BonusAbil.MP, BonusAbil.MP);
Inc(m_BonusAbil.Hit, BonusAbil.Hit);
Inc(m_BonusAbil.Speed, BonusAbil.Speed);
Inc(m_BonusAbil.X2, BonusAbil.X2);
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
end else begin
SysMsg('非法数据调整!!!', c_Red, t_Hint);
end;
end;
procedure TPlayObject.ClientDECOMPOSE(nParam, nMakeIndex: Integer);
var
StdItem : pTStdItem;
UserItem : pTUserItem;
begin
m_sScriptParam[40] := '';
m_sScriptParam[41] := '';
if m_boGhost or m_boDeath then Exit;
if nMakeIndex > 0 then begin
GetUserItemByMakeIndex(nMakeIndex, UserItem);
if (UserItem <> nil) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
m_sScriptParam[40] := StdItem.Name;
m_sScriptParam[41] := IntToStr(nMakeIndex);
case nParam of
1: ExecuteScript(g_FunctionNPC, '@拆卸装备');
0: ExecuteScript(g_FunctionNPC, '@拆卸开始');
end;
end;
end;
end;
end;
procedure TPlayObject.ClientGEMREMOVE(nWhere, nMakeIndex: Integer);
var
StdItem : pTStdItem;
UserItem : pTUserItem;
ANpc : TNormNpc;
begin
m_sScriptParam[40] := '';
m_sScriptParam[41] := '';
m_sScriptParam[42] := '';
if m_boGhost or m_boDeath then Exit;
if m_ClickNPC = nil then Exit;
ANpc := TNormNpc(m_ClickNPC);
if nMakeIndex > 0 then begin
GetUserItemByMakeIndex(nMakeIndex, UserItem);
if (UserItem <> nil) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
m_sScriptParam[40] := StdItem.Name;
m_sScriptParam[41] := IntToStr(nMakeIndex);
m_sScriptParam[42] := IntToStr(nWhere);
if (IsEnvir(ANpc.m_PEnvir) and (abs(ANpc.m_nCurrX - m_nCurrX) < 15) and (abs(ANpc.m_nCurrY - m_nCurrY) < 15)) or (ANpc.m_boIsHide) then begin
ANpc.GotoLable(Self, '@@gemremove', False);
end;
end;
end;
end;
end;
procedure TPlayObject.ClientYiWangDan(nMakeIndex: Integer; sSkillName: string);
var
StdItem : pTStdItem;
UserItem : pTUserItem;
Magic : pTMagic;
UserMagic : pTUserMagic;
begin
if nMakeIndex > 0 then begin
GetUserItemByMakeIndex(nMakeIndex, UserItem);
if (UserItem <> nil) then begin
DelItemSkill(sSkillName);
SysMsg(Format('技能%s已删除。', [sSkillName]), c_Green, t_Hint);
RecalcAbilitys();
SendDelItems(UserItem);
DelBagItem(UserItem.MakeIndex, '');
end;
end;
end;
procedure TPlayObject.ClientAllotGuildGold(sName: string; nGold: Integer);
var
Hum : TPlayObject;
begin
if m_boGhost or m_boDeath then Exit;
if m_MyGuild = nil then Exit;
if (TGuild(m_MyGuild).GetChiefName <> m_sCharName) then begin
SysMsg('你不是行会会长,没有权限执行此操作!', c_Red, t_Hint);
Exit;
end;
if (nGold <= 0) or (nGold > TGuild(m_MyGuild).dwGuildGold) then begin
SysMsg('你输入的分配数量错误,请重新输入!', c_Red, t_Hint);
Exit;
end;
Hum := UserEngine.GetPlayObject(sName);
if (Hum <> nil) and (not Hum.m_boGhost) and (not Hum.m_boDeath) then begin
if TGuild(m_MyGuild).IsMember(sName) then begin
TGuild(m_MyGuild).dwGuildGold := TGuild(m_MyGuild).dwGuildGold - nGold;
// SendDefMessage(SM_ALLOTGUILDGOLD, nGold, 0, 0, 0, sName);
Inc(Hum.m_nGuildGold, nGold);
Hum.GuildGoldChanged;
SendGuildTowerRes;
SysMsg('你成功分配了' + IntToStr(nGold) + '行会公共银两给' + sName + '。', c_Red, t_Hint);
Hum.SysMsg(m_sCharName + '分配给你' + IntToStr(nGold) + '行会公共银两。', c_Red, t_Hint);
end else
SysMsg(sName + '已经不是本行会成员,无法分配行会银两!', c_Red, t_Hint);
end else
SysMsg(sName + '已经不在线了,无法分配行会银两!', c_Red, t_Hint);
end;
procedure TPlayObject.ClientAskForGuildOfficial(nRankNo: Integer; sData: string);
var
sOfficialName : string;
Official : TPlayObject;
nTowerGrade : Integer;
begin
if (not (nRankNo in [1..10])) or (sData = '') then Exit;
if m_MyGuild = nil then Exit;
nTowerGrade := TGuild(m_MyGuild).btTowerGrade;
nTowerGrade := _MIN(10, nTowerGrade);
if (nTowerGrade <= 0) or (nGuildOfficialCount[nTowerGrade][nRankNo] = 0) or (TGuild(m_MyGuild).GetRankMemberCount(nRankNo) >= nGuildOfficialCount[nTowerGrade][nRankNo]) then begin
SysMsg('当前职位尚未设立,无法任命该职位!', c_Red, t_Hint);
Exit;
end;
if (TGuild(m_MyGuild).GetChiefName <> m_sCharName) then begin
SysMsg('你不是行会会长,没有权限执行此操作!', c_Red, t_Hint);
Exit;
end;
sData := GetValidStr3(sData, sOfficialName, ['/']);
if (sOfficialName <> '') then Official := UserEngine.GetPlayObject(sOfficialName);
if (sData <> '') then begin
TGuild(m_MyGuild).GetOfficial(99, g_Config.sGuildMemberRank, sData); //撤职查办
end;
if (Official <> nil) then begin
if (Official = Self) then begin
SysMsg('不可以任命自己!', c_Red, t_Hint);
Exit;
end;
if (Official.m_btRaceServer <> RC_PLAYOBJECT) or (Official.m_boPneuma) then begin
SysMsg('任命失败!!!', c_Red, t_Hint);
Exit;
end;
if Official.m_MyGuild = m_MyGuild then begin
if Official.m_nGuildGold >= nGuildOfficialPrice[nRankNo] then begin
Official.SendDefMessage(SM_QUESTGUILDOFFICIAL, 50, nRankNo, LoWord(Integer(Official)), HiWord(Integer(Official)), m_sCharName);
m_GuildOfficial := nRankNo;
end else
SysMsg(sOfficialName + '行会银两不足' + IntToStr(nGuildOfficialPrice[nRankNo]) + '个,无法任命该职位!', c_Red, t_Hint);
end else
SysMsg(sOfficialName + '非本行会成员,无法任命该职位!', c_Red, t_Hint);
end else
SysMsg(sOfficialName + '不在线,无法任命该职位!', c_Red, t_Hint);
end;
procedure TPlayObject.ClientCallTiger();
const
sTigerName : string = '啸天虎';
sDragonName : array[0..2] of string = ('金甲龙王', '紫衫龙王', '碧铠龙王');
var
StdItem : pTStdItem;
dwNowWolTime : DWORD;
i, nReCallTime : Integer;
sName : string;
begin
if m_boGhost or m_boDeath or m_boPneuma then Exit;
if m_btJob = 3 then Exit; //妖士是没有虎王盾的
if (m_TorDDM.Tiger.DB.Dragon > 0) then sName := '龙' else sName := '虎';
if m_PEnvir.m_MapFlag.boNOTIGER then begin
SysMsg(Format('本地图禁止释放%s王。', [sName]), c_Red, t_Hint);
Exit;
end;
//召唤虎王
if m_Tiger = nil then begin
StdItem := nil;
if (m_UseItems[U_SHIELD].wIndex > 0) then begin
StdItem := UserEngine.GetStdItem(m_UseItems[U_SHIELD].wIndex);
end;
if (m_TorDDM.Tiger.DB.Dragon = 0) and ((StdItem = nil) or (not StdItem.Shape in [61..69])) then begin
SysMsg('只有佩戴虎王盾才能放出虎王。', c_Red, t_Hint);
Exit;
end;
if (m_TorDDM.Tiger.DB.Dragon > 0) and ((StdItem = nil) or (not StdItem.Shape in [70..72])) then begin
SysMsg('只有佩戴龙王盾才能放出龙王。', c_Red, t_Hint);
Exit;
end;
if (m_TorDDM.Tiger.DB.level <= 0) then begin
SysMsg(Format('%s王等级小于1级,不能召出%s王。', [sName, sName]), c_Red, t_Hint);
Exit;
end;
if (m_TorDDM.Tiger.Abil.MaxHP <= 0) then begin
SysMsg(Format('%s王HP为0,不能召出%s王。', [sName, sName]), c_Red, t_Hint);
Exit;
end;
dwNowWolTime := DateTimeToWolTIme(Now);
case m_TorDDM.Tiger.DB.level of
0..30: nReCallTime := 1200;
31..50: nReCallTime := 900;
51..80: nReCallTime := 600;
else nReCallTime := 300;
end;
//重置虎灵值
if (m_TorDDM.Tiger.DB.ReCallTick > dwNowWolTime) then m_TorDDM.Tiger.DB.ReCallTick := 0;
if (dwNowWolTime < (m_TorDDM.Tiger.DB.ReCallTick + nReCallTime)) then begin
SysMsg(Format('你当前的%s灵值未满,你还需等待%d秒才可释放出%s王。', [sName, (m_TorDDM.Tiger.DB.ReCallTick + nReCallTime - dwNowWolTime), sName]), c_Red, t_Hint);
Exit;
end;
if (m_TorDDM.Tiger.DB.Dragon > 0) then begin
if m_btJob in [0..2] then sName := sDragonName[m_btJob];
end else
sName := sTigerName;
m_Tiger := TAnimalObject(MakeSlave(sName, m_TorDDM.Tiger.DB.level, m_TorDDM.Tiger.DB.level, 100, 24 * 60 * 60, -1));
if m_Tiger <> nil then begin
m_Tiger.m_btTigerDragon := m_TorDDM.Tiger.DB.Dragon + 1;
if (m_TorDDM.Tiger.DB.Dragon > 0) then
m_Tiger.m_btJob := m_btJob
else
m_Tiger.m_btJob := 0;
RecalcTigerAbility;
m_Tiger.m_WAbil.dwHP := m_Tiger.m_WAbil.dwMaxHP;
m_Tiger.HealthSpellChanged();
if m_UseItems[U_SHIELD].sExName <> '' then begin
m_Tiger.m_sCharName := m_UseItems[U_SHIELD].sExName;
m_Tiger.RefShowName;
end;
if m_TorDDM.Tiger.DB.Dragon > 0 then
m_sScriptParam[0] := '1'
else
m_sScriptParam[0] := '0';
ExecuteScript(g_FunctionNPC, '@ReleaseTiger');
end;
m_TorDDM.Tiger.DB.ReCallTick := dwNowWolTime;
SendDefMessage(CM_CALLTIGER, dwNowWolTime, 1, 0, 0, '');
end;
end;
//取消交易
procedure TPlayObject.ClientCancelDeal;
begin
DealCancel();
end;
{玉净瓶俘获心魔}
procedure TPlayObject.ClientCatchEvil(EvilObject: TBaseObject; nMakeIndex:
Integer);
var
UserItem : pTUserItem;
begin
if not m_boCanUseItem then Exit;
if (not m_boDeath) and (not m_boGhost) then begin
if m_PEnvir.IsValidObject(m_nCurrX, m_nCurrY, 1, EvilObject) then begin
if (EvilObject.m_btRaceServer = RC_EVIL) and (EvilObject.m_btRaceImg in
[0, 255]) and (EvilObject.m_boDeath) and (not EvilObject.m_boGhost) then begin
GetUserItemByMakeIndex(nMakeIndex, UserItem);
if UserItem = nil then Exit;
if UserItem.Dura > 0 then begin
if (UserItem.Evil.MakeIndex = 0) and (UserItem.Evil.sName = '') then begin
m_sScriptParam[0] := IntToStr(UserItem.MakeIndex);
m_sScriptParam[1] := IntToStr(EvilObject.m_btAmbitLevel);
m_sScriptParam[2] := IntToStr(EvilObject.m_btJob);
m_sScriptParam[3] := EvilObject.m_sFilterCharName;
m_sScriptParam[4] := EvilObject.m_sCharName;
m_sScriptParam[5] := IntToStr(Integer(EvilObject));
ExecuteScript(g_FunctionNPC, '@封印心魔');
end else
SysMsg('玉净瓶的魔力有限,无法用来俘获第二个心魔', c_Pink, t_Hint);
end else begin
SendDelItems(UserItem);
DelBagItem(UserItem.MakeIndex, UserEngine.GetStdItemName(UserItem.wIndex));
SysMsg('玉净瓶已经破碎!!!', c_Red, t_Hint);
end;
end;
end;
end;
end;
//改变交易价格
procedure TPlayObject.ClientChangeDealGold(nGold, nGameGold: Integer); //004DDB04
var
bo09 : Boolean;
begin
//禁止取回放入交易栏内的金币
if (nGold > 0) and (m_nDealGolds > 0) and g_Config.boCanNotGetBackDeal then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0,
g_sDealItemsDenyGetBackMsg);
SendDefMessage(SM_DEALDELITEM_FAIL, 0, 0, 0, 0, '');
Exit;
end;
if (nGameGold > 0) and (m_nDealGameGolds > 0) and g_Config.boCanNotGetBackDeal then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0,
g_sDealItemsDenyGetBackMsg);
SendDefMessage(SM_DEALDELITEM_FAIL, 0, 0, 0, 1, '');
Exit;
end;
//金币
if (nGold < 0) then begin
SendDefMessage(SM_DEALCHGGOLD_FAIL, m_nDealGolds, LoWord(m_nGold),
HiWord(m_nGold), 0, '');
Exit;
end;
//元宝
if (nGameGold < 0) then begin
SendDefMessage(SM_DEALCHGGOLD_FAIL, m_nDealGameGolds, LoWord(m_nGameGold),
HiWord(m_nGameGold), 1, '');
Exit;
end;
//检查交易金额,不能小于原来的金额
if (nGold > 0) and (nGold < m_nDealGolds) then begin
SendDefMessage(SM_DEALCHGGOLD_FAIL, m_nDealGolds, LoWord(m_nGold),
HiWord(m_nGold), 0, '');
Exit;
end;
if (nGameGold > 0) and (nGameGold < m_nDealGameGolds) then begin
SendDefMessage(SM_DEALCHGGOLD_FAIL, m_nDealGameGolds, LoWord(m_nGameGold),
HiWord(m_nGameGold), 1, '');
Exit;
end;
//2013 金币大小不做检测了 Cloud
//检查交易金额大小限制
// if (nGameGold > 0) and (nGameGold > 2000) then begin
// SendDefMessage(SM_DEALCHGGOLD_FAIL, m_nDealGameGolds, LoWord(m_nGameGold),
// HiWord(m_nGameGold), 1, '');
// Exit;
// end;
bo09 := False;
if (m_DealCreat <> nil) {and (GetPoseCreate = m_DealCreat)} then begin
if not m_DealCreat.m_boDealOK then begin
if ((m_nGold + m_nDealGolds) >= nGold) and ((m_nGameGold +
m_nDealGameGolds) >= nGameGold) then begin
//改变当前交易的金额
if nGold > 0 then begin
IncGold(m_nDealGolds - nGold);
m_nDealGolds := nGold;
end;
if nGameGold > 0 then begin
m_nGameGold := (m_nGameGold + m_nDealGameGolds) - nGameGold;
m_nDealGameGolds := nGameGold;
end;
//确认金币或元宝
if nGold > 0 then begin
SendDefMessage(SM_DEALCHGGOLD_OK, m_nDealGolds, LoWord(m_nGold),
HiWord(m_nGold), 0, '');
TPlayObject(m_DealCreat).SendDefMessage(SM_DEALREMOTECHGGOLD,
m_nDealGolds, 0, 0, 0, '');
end else begin
SendDefMessage(SM_DEALCHGGOLD_OK, m_nDealGameGolds,
LoWord(m_nGameGold), HiWord(m_nGameGold), 1, '');
TPlayObject(m_DealCreat).SendDefMessage(SM_DEALREMOTECHGGOLD,
m_nDealGameGolds, 0, 0, 1, '');
end;
m_DealCreat.m_DealLastTick := GetTickCount();
bo09 := True;
m_DealLastTick := GetTickCount();
end; //004DDC50
end;
end;
if not bo09 then begin
if nGold > 0 then
SendDefMessage(SM_DEALCHGGOLD_FAIL, m_nDealGolds, LoWord(m_nGold),
HiWord(m_nGold), 0, '')
else
SendDefMessage(SM_DEALCHGGOLD_FAIL, m_nDealGameGolds, LoWord(m_nGameGold),
HiWord(m_nGameGold), 1, '');
end;
end;
//CM_TURN
function TPlayObject.ClientChangeDir(wIdent: word; nX, nY, nDir: Integer; var
dwDelayTime: LongWord): Boolean; //4CAEB8
var
dwCheckTime : LongWord;
begin
Result := False;
if not CheckCanOperate(cRun) then Exit;
if not CheckActionStatus(wIdent, dwDelayTime) then begin
m_boFilterAction := False;
Exit;
end;
m_boFilterAction := True;
dwCheckTime := GetTickCount - m_dwTurnTick;
if dwCheckTime < g_Config.dwTurnIntervalTime then begin
dwDelayTime := g_Config.dwTurnIntervalTime - dwCheckTime;
Exit;
end;
if (nX = m_nCurrX) and (nY = m_nCurrY) then begin
m_btDirection := nDir;
if Walk(RM_TURN) then begin
m_dwTurnTick := GetTickCount();
Result := True;
end;
end;
end;
//修改技能快捷键
procedure TPlayObject.ClientChangeMagicKey(nSkillIdx, nKey: Integer); //004DB9A4
var
i : Integer;
UserMagic : pTUserMagic;
begin
//不允许设置快捷键的技能
if nSkillIdx in [SKILL_DRAGONROAR, SKILL_SWALLOWED, SKILL_RUSHTHUNDER,
{ SKILL_DRAGONPOWER, SKILL_DRAGONSHIELD, }SKILL_BLADEAREA..SKILL_127] then Exit;
for i := 0 to m_MagicList.Count - 1 do begin
UserMagic := m_MagicList.Items[i];
if UserMagic.GetMagIdx = nSkillIdx then begin
UserMagic.btKey := nKey;
Break;
end;
end;
end;
//命令CM_CLICKNPC的处理
procedure TPlayObject.ClientClickNPC(NPC: Integer); //004DBA10
var
NormNpc : TNormNpc;
PlayObject : TBaseObject;
i : Integer;
VisibleBaseObject : pTVisibleBaseObject;
s : string;
begin
if m_boPneuma then Exit; //元神不可以点击NPC
if not m_boCanDeal then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, g_sCanotTryDealMsg);
Exit;
end;
if m_boDeath or m_boGhost then Exit;
//发送活动日志
if NPC = -5 then begin
s := '';
for i := 0 to UserEngine.m_Huodong.Count - 1 do
s := s + UserEngine.m_Huodong[i];
SendDefMessage(SM_MERCHANTSAY, Integer(g_FunctionNPC), 64, 0, 1, s);
Exit;
end;
if m_ClickNPC = TObject(NPC) then
NormNpc := TNormNpc(m_ClickNPC)
else begin
NormNpc := UserEngine.FindMerchant(TObject(NPC));
if NormNpc = nil then
NormNpc := UserEngine.FindNPC(TObject(NPC));
m_ClickNPC := NormNpc;
end;
if NormNpc <> nil then begin {摆摊时不允许点NPC}
if ((m_wShopItemCount = 0) or NormNpc.m_boDoShop) and
IsEnvir(NormNpc.m_PEnvir) and (abs(NormNpc.m_nCurrX - m_nCurrX) <= 15) and (abs(NormNpc.m_nCurrY - m_nCurrY) <= 15) then begin
NormNpc.Click(Self);
end;
end else begin //2005/10/05增加:摆摊功能,当点击正在摆摊的玩家时,接收到的也是这个消息
try
PlayObject := nil;
for i := 0 to m_VisibleActors.Count - 1 do begin
VisibleBaseObject := m_VisibleActors.Items[i];
if VisibleBaseObject.BaseObject = TObject(NPC) then begin
PlayObject := TBaseObject(VisibleBaseObject.BaseObject);
Break;
end;
end;
if PlayObject <> nil then begin
if (PlayObject = m_PackPet) or ((PlayObject.m_PEnvir = m_PEnvir) and
(abs(PlayObject.m_nCurrX - m_nCurrX) <= 15) and
(abs(PlayObject.m_nCurrY - m_nCurrY) <= 15)) then begin
PlayObject.SendShopItems(Self, 1);
end;
end;
except
end;
end;
end;
//创建队伍
procedure TPlayObject.ClientCreateGroup(sHumName: string); //004DCCB4
var
PlayObject : TPlayObject;
begin
PlayObject := UserEngine.GetPlayObject(sHumName);
if m_GroupOwner <> nil then begin
SendDefMessage(SM_CREATEGROUP_FAIL, -1, 0, 0, 0, '');
Exit;
end;
if (PlayObject = nil) or (PlayObject = Self) or PlayObject.m_boDeath or
PlayObject.m_boGhost then begin
SendDefMessage(SM_CREATEGROUP_FAIL, -2, 0, 0, 0, '');
Exit;
end;
if (PlayObject.m_GroupOwner <> nil) then begin
SendDefMessage(SM_CREATEGROUP_FAIL, -3, 0, 0, 0, '');
Exit;
end;
if (PlayObject.m_boPneuma) then begin
SendDefMessage(SM_CREATEGROUP_FAIL, -2, 0, 0, 0, '');
Exit;
end;
if (not PlayObject.m_boAllowGroup) then begin
SendDefMessage(SM_CREATEGROUP_FAIL, -4, 0, 0, 0, '');
Exit;
end;
if (PlayObject.m_PEnvir <> m_PEnvir) then begin //增加控制:必须在同一地图才可以组队
SendDefMessage(SM_CREATEGROUP_FAIL, -2, 0, 0, 0, '');
Exit;
end;
FillChar(m_sGroupCommon, SizeOf(m_sGroupCommon), #0); //清空队伍变量
m_GroupMembers.Clear;
m_GroupMembers.AddObject(m_sCharName, Self);
m_GroupMembers.AddObject(sHumName, PlayObject);
JoinGroup(Self);
PlayObject.JoinGroup(Self);
m_boAllowGroup := True;
SendDefMessage(SM_CREATEGROUP_OK, 0, 0, 0, 0, '');
SendGroupMembers();
end;
//创建第二元神
procedure TPlayObject.ClientCreateSoul(nParm1, nParm2, nParm3: Integer);
begin
if m_boGhost or m_boDeath then Exit;
if Assigned(m_VersionManage) then
try
m_VersionManage.OnClientCreateSoul(Self, nParm1, nParm2, nParm3);
except
MainOutMessage(Format('TPlayObject::OnClientCreateSoul SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
end;
//交易完成
procedure TPlayObject.ClientDealEnd;
var
i, j : Integer;
bo11 : Boolean;
UserItem : pTUserItem;
StdItem : pTStdItem;
PlayObject : TPlayObject;
begin
if m_DealCreat = nil then Exit;
if ((GetTickCount - m_DealLastTick) < g_Config.dwDealOKTime {1000}) or
((GetTickCount - m_DealCreat.m_DealLastTick) < g_Config.dwDealOKTime {1000}) then begin
SysMsg(g_sDealOKTooFast, c_Red, t_Hint);
DealCancel();
Exit;
end;
m_boDealOK := True;
m_DealLastTick := GetTickCount;
if m_DealCreat.m_boDealOK then begin
bo11 := True;
if (m_nBagSize - m_ItemList.Count) < m_DealCreat.m_DealItemList.Count then begin
bo11 := False; //包裹空间不足
SysMsg(g_sYourBagSizeTooSmall, c_Red, t_Hint);
end else if ((m_nGoldMax - m_nGold) < m_DealCreat.m_nDealGolds) then begin
SysMsg(g_sYourGoldLargeThenLimit, c_Red, t_Hint);
bo11 := False; //金币超过限制
end else if ((m_nGameGoldMax - m_nGameGold) < m_DealCreat.m_nDealGameGolds) then begin
SysMsg(g_sYourGameGoldLargeThenLimit, c_Red, t_Hint);
bo11 := False; //元宝超过限制
end else if (m_DealCreat.m_nBagSize - m_DealCreat.m_ItemList.Count) <
m_DealItemList.Count then begin
SysMsg(g_sDealHumanBagSizeTooSmall, c_Red, t_Hint);
bo11 := False; //包裹空间不足
end else if ((m_DealCreat.m_nGoldMax - m_DealCreat.m_nGold) < m_nDealGolds) then begin
SysMsg(g_sDealHumanGoldLargeThenLimit, c_Red, t_Hint);
bo11 := False; //金币超过限制
end else if ((m_DealCreat.m_nGameGoldMax - m_DealCreat.m_nGameGold) <
m_nDealGameGolds) then begin
SysMsg(g_sDealHumanGameGoldLargeThenLimit, c_Red, t_Hint);
bo11 := False; //元宝超过限制
end;
if bo11 then begin
for i := 0 to 27 do m_sDealParam[i] := ''; //清空变量
for i := 0 to m_DealItemList.Count - 1 do begin
UserItem := m_DealItemList.Items[i];
m_DealCreat.AddItemToBag(UserItem);
TPlayObject(m_DealCreat).SendAddItem(UserItem);
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
m_sDealParam[i] := IntToStr(UserItem.MakeIndex);
if StdItem <> nil then begin
if not IsCheapStuff(StdItem.StdMode) then begin
if StdItem.boGameLog = 1 then
AddGameDataLog('8' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
StdItem.Name + #9 +
IntToStr(UserItem.MakeIndex) + #9 +
'1' + #9 +
m_DealCreat.m_sCharName);
end;
end;
end;
if m_nDealGolds > 0 then begin
m_sDealParam[24] := IntToStr(m_nDealGolds);
m_DealCreat.IncGold(m_nDealGolds);
m_DealCreat.GoldChanged();
if g_boGameLogGold then
AddGameDataLog('14' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
sSTRING_GOLDNAME + #9 +
IntToStr(m_nGold) + #9 +
'1' + #9 +
m_DealCreat.m_sCharName);
end;
if m_nDealGameGolds > 0 then begin
m_sDealParam[25] := IntToStr(m_nDealGolds);
Inc(m_DealCreat.m_nGameGold, m_nDealGameGolds);
m_DealCreat.GameGoldChanged();
if g_boGameLogGameGold then
AddGameDataLog('17' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
sSTRING_GAMEGOLDNAME + #9 +
IntToStr(m_nGameGold) + #9 +
'2' + #9 +
m_sCharName);
end;
for i := 0 to m_DealCreat.m_DealItemList.Count - 1 do begin
UserItem := m_DealCreat.m_DealItemList.Items[i];
AddItemToBag(UserItem);
TPlayObject(Self).SendAddItem(UserItem);
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
m_sDealParam[12 + i] := IntToStr(UserItem.MakeIndex);
if StdItem <> nil then begin
if not IsCheapStuff(StdItem.StdMode) then begin
if StdItem.boGameLog = 1 then
AddGameDataLog('8' + #9 +
m_DealCreat.m_sMapName + #9 +
IntToStr(m_DealCreat.m_nCurrX) + #9 +
IntToStr(m_DealCreat.m_nCurrY) + #9 +
m_DealCreat.m_sCharName + #9 +
StdItem.Name + #9 +
IntToStr(UserItem.MakeIndex) + #9 +
'1' + #9 +
m_sCharName);
end;
end;
end;
if m_DealCreat.m_nDealGolds > 0 then begin
m_sDealParam[26] := IntToStr(m_DealCreat.m_nDealGolds);
IncGold(m_DealCreat.m_nDealGolds);
GoldChanged();
if g_boGameLogGold then
AddGameDataLog('14' + #9 +
m_DealCreat.m_sMapName + #9 +
IntToStr(m_DealCreat.m_nCurrX) + #9 +
IntToStr(m_DealCreat.m_nCurrY) + #9 +
m_DealCreat.m_sCharName + #9 +
sSTRING_GOLDNAME + #9 +
IntToStr(m_DealCreat.m_nGold) + #9 +
'1' + #9 +
m_sCharName);
end;
if m_DealCreat.m_nDealGameGolds > 0 then begin
m_sDealParam[27] := IntToStr(m_DealCreat.m_nDealGameGolds);
Inc(m_nGameGold, m_DealCreat.m_nDealGameGolds);
GameGoldChanged();
if g_boGameLogGameGold then
AddGameDataLog('17' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
sSTRING_GAMEGOLDNAME + #9 +
IntToStr(m_nGameGold) + #9 +
'2' + #9 +
m_DealCreat.m_sCharName);
end;
PlayObject := TPlayObject(m_DealCreat);
m_sScriptParam[0] := PlayObject.m_sCharName;
ExecuteScript(g_ManageNPC, '@_游戏_交易触发');
PlayObject.SendDefMessage(SM_DEALSUCCESS, 0, 0, 0, 0, '');
PlayObject.SysMsg(g_sDealSuccessMsg {'交易成功...'}, c_Green, t_Hint);
PlayObject.m_DealCreat := nil;
PlayObject.m_boDealing := False;
PlayObject.m_DealItemList.Clear;
PlayObject.m_nDealGolds := 0;
PlayObject.m_nDealGameGolds := 0;
PlayObject.m_boDealOK := False;
UserEngine.SaveHumanRcd(Self);
UserEngine.SaveHumanRcd(TPlayObject(m_DealCreat));
m_dwSaveRcdTick := GetTickCount;
TPlayObject(m_DealCreat).m_dwSaveRcdTick := GetTickCount;
SendDefMessage(SM_DEALSUCCESS, 0, 0, 0, 0, '');
SysMsg(g_sDealSuccessMsg {'交易成功...'}, c_Green, t_Hint);
m_DealCreat := nil;
m_boDealing := False;
m_DealItemList.Clear;
m_nDealGolds := 0;
m_nDealGameGolds := 0;
m_boDealOK := False;
end else begin
DealCancel();
end;
end else begin
SysMsg(g_sYouDealOKMsg {'你已经确认交易了'}, c_Green, t_Hint);
m_DealCreat.SysMsg(g_sPoseDealOKMsg {'对方已经确认交易了'},
c_Green, t_Hint);
end;
end;
//尝试交易
procedure TPlayObject.ClientDealTry(sHumName: string);
var
BaseObject : TBaseObject;
begin
if g_Config.boDisableDeal then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0,
g_sDisableDealItemsMsg);
Exit;
end;
if m_boDealing then Exit;
if GetTickCount - m_DealLastTick < g_Config.dwTryDealTime {3000} then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0,
g_sPleaseTryDealLaterMsg);
Exit;
end;
//摆摊状态下不允许交易。
if not m_boCanDeal or (m_wShopItemCount > 0) then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0,
g_sCanotTryDealMsg);
Exit;
end;
if m_boPneuma then begin
SysMsg('元神分身也想玩交易?没门!', c_Red, t_Hint);
Exit;
end;
//非和平攻击模式下不允许交易。
if (m_btAttatckMode <> HAM_PEACE) then begin
SysMsg(g_sCanotTryDealMsg2, c_Red, t_Hint);
Exit;
end;
if m_boArrow then begin
SysMsg('现在不能交易', c_Green, t_Hint);
Exit;
end;
BaseObject := GetPoseCreate();
if BaseObject = nil then BaseObject := UserEngine.GetPlayObject(sHumName);
if (BaseObject <> nil) and (BaseObject <> Self) then begin
if (not BaseObject.m_boDealing) then begin
if (BaseObject.m_btRaceServer = RC_PLAYOBJECT) then begin
//检查对方是否元神
if BaseObject.m_boPneuma then begin
SysMsg('不可以和元神分身交易', c_Red, t_Hint);
Exit;
end;
//检查对方是否是和平攻击模式
if (BaseObject.m_btAttatckMode <> HAM_PEACE) then begin
SysMsg(g_sCanotTryDealMsg3, c_Red, t_Hint);
Exit;
end;
if BaseObject.m_boArrow then begin
SysMsg('对方现在不能交易', c_Green, t_Hint);
Exit;
end;
if (BaseObject.m_boAllowDeal and TPlayObject(BaseObject).m_boCanDeal) then begin
BaseObject.SysMsg(m_sCharName + g_sOpenedDealMsg, c_Green, t_Hint);
SysMsg(BaseObject.m_sCharName + g_sOpenedDealMsg, c_Green, t_Hint);
TPlayObject(Self).OpenDealDlg(BaseObject);
TPlayObject(BaseObject).OpenDealDlg(Self);
end else begin //004DD1CC
SysMsg(g_sPoseDisableDealMsg {'对方禁止进入交易'}, c_Red, t_Hint);
end;
end;
end else begin //004DD1E0
SendDefMessage(SM_DEALTRY_FAIL, 0, 0, 0, 0, '');
end;
end else begin //004DD1F9
SendDefMessage(SM_DEALTRY_FAIL, 0, 0, 0, 0, '');
end;
end;
//删除要交易的物品
procedure TPlayObject.ClientDelDealItem(nItemIdx: Integer; sItemName: string);
var
i : Integer;
bo11 : Boolean;
UserItem : pTUserItem;
sName : string;
begin
//如果不允许取回物品,则失败
if g_Config.boCanNotGetBackDeal then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0,
g_sDealItemsDenyGetBackMsg);
SendDefMessage(SM_DEALDELITEM_FAIL, 0, 0, 0, 0, '');
Exit;
end;
if (m_DealCreat = nil) or (not m_boDealing) then Exit;
bo11 := False;
if not m_DealCreat.m_boDealOK then begin
for i := m_DealItemList.Count - 1 downto 0 do begin
UserItem := m_DealItemList.Items[i];
if UserItem.MakeIndex = nItemIdx then begin
//取自定义物品名称
sName := '';
ItemUnit.GetCustomItemName(UserItem, sName);
if (CompareText(sItemName, sName) = 0) then begin
m_ItemList.Add(UserItem);
TPlayObject(Self).SendDelDealItem(UserItem);
m_DealItemList.Delete(i);
bo11 := True;
Break;
end;
end;
end;
end;
if not bo11 then
SendDefMessage(SM_DEALDELITEM_FAIL, 0, 0, 0, 0, '');
end;
//删除好友
procedure TPlayObject.ClientDelFriend(FriendName: string);
var
i : Integer;
human : TPlayObject;
begin
//检查要删除的人是否在我的好友名单中
DelFromFriendList(FriendName);
//对方从名单中删除我
human := UserEngine.GetPlayObject(FriendName);
if (human <> nil) and (not human.m_boDeath) and (not human.m_boGhost) then begin
human.DelFromFriendList(m_sCharName);
end else begin //不在线,则自己来删除对方的好友
end;
m_sScriptParam[0] := FriendName;
ExecuteScript(g_ManageNPC, '@人脉_删除好友');
end;
//删除队伍成员
procedure TPlayObject.ClientDelGroupMember(sHumName: string); //004DCFB8
var
PlayObject : TPlayObject;
begin
PlayObject := UserEngine.GetPlayObject(sHumName);
if m_GroupOwner <> Self then begin
SendDefMessage(SM_GROUPDELMEM_FAIL, -1, 0, 0, 0, '');
Exit;
end;
if PlayObject = nil then begin
SendDefMessage(SM_GROUPDELMEM_FAIL, -2, 0, 0, 0, '');
Exit;
end;
if not IsGroupMember(PlayObject) then begin
SendDefMessage(SM_GROUPDELMEM_FAIL, -3, 0, 0, 0, '');
Exit;
end;
DelMember(PlayObject);
SendDefMessage(SM_GROUPDELMEM_OK, 0, 0, 0, 0, sHumName);
PlayObject.ExecuteScript(g_FunctionNPC, '@_退出队伍');
end;
//摆摊
procedure TPlayObject.ClientDoShop(shopItemCount: word; sMsg: string);
var
RetCode : Integer;
DoShopResult : TDoShopResult;
i, j, ii : Integer;
UserShop : TUserShop;
UserItem : pTUserItem;
StdItem : pTStdItem;
boFind : Boolean;
sName : string;
Castle : TUserCastle;
BaseObjectList : TList;
BaseObject : TBaseObject;
resourcestring
sHint1 = '骑宠状态不能摆摊。';
sHint2 = '此地图禁止摆摊。';
sHint3 = '正在攻城的区域禁止摆摊。';
sHint4 = '你正在进行抢宝活动,禁止摆摊。';
sHint5 = '周围没有空的位置,无法摆下你的摊位。';
sHint6 = '摆摊物品价格定义错误,请勿使用非法外挂!';
sHint7 = '金币交易价格定义超过允许的范围。';
sHint8 = '元宝交易价格定义超过允许的范围。';
sHint9 = '此物品开启后不允许交易,但时间到后可丢弃。';
sHint10 = '你要出售的物品并不存在。';
sHint11 = ' 不允许交易。';
begin
if not m_boCanDeal then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, g_sCanotTryDealMsg);
Exit;
end;
if m_boRideOn then begin
SysMsg(sHint1, c_Red, t_Hint);
Exit;
end;
if m_PEnvir.m_MapFlag.boNoDoShop then begin
SysMsg(sHint2, c_Red, t_Hint);
Exit;
end;
Castle := g_CastleManager.InCastleWarArea(Self);
//城堡正在战斗
if (Castle <> nil) and Castle.m_boUnderWar then begin
SysMsg(sHint3, c_Red, t_Hint);
Exit;
end;
if m_boArrow then begin
SysMsg(sHint4, c_Red, t_Hint);
Exit;
end;
BaseObjectList := TList.Create;
try
GetMapBaseObjects(m_PEnvir, m_nCurrX, m_nCurrY, 2, BaseObjectList);
for i := 0 to BaseObjectList.Count - 1 do begin
BaseObject := TBaseObject(BaseObjectList.Items[i]);
if (BaseObject.m_btRaceServer = RC_NPC) then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, '你离NPC太近了,不能摆摊。');
Exit;
end;
end;
finally
BaseObjectList.free;
end;
//检查前后左右有没有空位置
if (m_wShopItemCount = 0) and (shopItemCount > 0) then begin //开始摆摊的时候才需要判断
if (m_nCurrX > 0) and (m_nCurrX < m_PEnvir.m_nWidth) and
(m_nCurrY > 0) and (m_nCurrY < m_PEnvir.m_nHeight) and
m_PEnvir.CanWalk(m_nCurrX, m_nCurrY - 1, True) and
m_PEnvir.CanWalk(m_nCurrX + 1, m_nCurrY - 1, True) and
m_PEnvir.CanWalk(m_nCurrX + 1, m_nCurrY, True) and
m_PEnvir.CanWalk(m_nCurrX + 1, m_nCurrY + 1, True) and
m_PEnvir.CanWalk(m_nCurrX, m_nCurrY + 1, True) and
m_PEnvir.CanWalk(m_nCurrX - 1, m_nCurrY + 1, True) and
m_PEnvir.CanWalk(m_nCurrX - 1, m_nCurrY, True) and
m_PEnvir.CanWalk(m_nCurrX - 1, m_nCurrY - 1, True) then
else begin
SysMsg(sHint5, c_Red, t_Hint);
Exit;
end;
end;
m_wShopItemCount := _MIN(15, shopItemCount);
if m_wShopItemCount = 0 then begin
RetCode := $FF;
end else begin //判断能否摆摊
RetCode := 0;
end;
FillChar(m_Shop, SizeOf(TShop), #0);
if (RetCode = 0) and (m_wShopItemCount > 0) and (sMsg <> '') then begin //取摊位名字和物品
DeCodeBuffer(sMsg, @m_Shop, SizeOf(TShop));
end;
//检测摊位名称
if CheckFilterWords(m_Shop.ShopName) or AnsiContainsText(m_Shop.ShopName, '\') then begin
m_wShopItemCount := 0;
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, '输入内容含有非法字符!');
Exit;
end;
for i := 0 to m_wShopItemCount - 1 do begin
if m_Shop.ShopItems[i].MakeIndex <> 0 then begin
if not (m_Shop.ShopItems[i].PayType in [0..1]) then begin
SysMsg(sHint6, c_Red, t_Hint);
m_wShopItemCount := 0;
Exit;
end; //150 000 000 //2000
if (m_Shop.ShopItems[i].PayType = 0) and ((m_Shop.ShopItems[i].Price < 1)
or (m_Shop.ShopItems[i].Price > 150000000)) then begin
SysMsg(sHint7, c_Red, t_Hint);
m_wShopItemCount := 0;
Exit;
end;
if (m_Shop.ShopItems[i].PayType = 1) and ((m_Shop.ShopItems[i].Price < 1)
or (m_Shop.ShopItems[i].Price > 10000000)) then begin
SysMsg(sHint8, c_Red, t_Hint);
m_wShopItemCount := 0;
Exit;
end;
//检查物品合法性
boFind := False;
for j := 0 to m_ItemList.Count - 1 do begin
UserItem := pTUserItem(m_ItemList[j]);
if UserItem.MakeIndex = m_Shop.ShopItems[i].MakeIndex then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem = nil then Break;
sName := '';
ItemUnit.GetCustomItemName(UserItem, sName);
{物品控制-禁止摆摊物品}
if CheckSPCode(StdItem.SPCode, SP_DISABLEDOSHOP) or
((UserItem.btItemExt[4] and EX_BIND) = EX_BIND) then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, sName + sHint11);
m_wShopItemCount := 0;
Exit;
end;
{魂佑灵兽禁止交易}
if (StdItem.StdMode = 49) and (StdItem.Shape = 51) and (UserItem.btItemExt[29] >= 2) then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, '魂佑灵兽禁止交易');
m_wShopItemCount := 0;
Exit;
end;
{已放出宠物禁止出售}
if IsDownPetItem(UserItem.MakeIndex) then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, sName + sHint11);
m_wShopItemCount := 0;
Exit;
end;
boFind := True;
Break;
end;
end;
if not boFind then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, sHint10);
m_wShopItemCount := 0;
Exit;
end;
end;
end;
for i := m_wShopItemCount to 14 do begin
m_Shop.ShopItems[i].MakeIndex := 0;
m_Shop.ShopItems[i].Price := 0;
m_Shop.ShopItems[i].PayType := 0;
end;
DoShopResult.ShopType := m_wShopKind;
DoShopResult.RetCode := RetCode;
DoShopResult.FlagType := m_btShopBanner;
DoShopResult.FlagColor := m_nBannerColor;
if (RetCode = 0) and ((m_btDirection mod 2) = 0) then
m_btDirection := m_btDirection + 1;
m_defMsg := MakeDefaultMsg(SM_DOSHOP, Integer(Self), m_nCurrX, m_nCurrY,
m_btDirection);
SendSocket(@m_defMsg, EnCodeBuffer(@DoShopResult, SizeOf(TDoShopResult)));
UserShop.DoShopResult.ShopType := m_wShopKind;
UserShop.DoShopResult.RetCode := RetCode;
UserShop.DoShopResult.FlagType := m_btShopBanner;
UserShop.DoShopResult.FlagColor := m_nBannerColor;
UserShop.GoodsCount := 0;
UserShop.ShopName := m_Shop.ShopName;
//发送操作结果和商店名称
SendRefMsg(RM_DOSHOP, m_btDirection, MakeLong(m_nCurrX, m_nCurrY), RetCode, 0,
EnCodeBuffer(@UserShop, 62));
if (not m_boPneuma) then begin
m_sScriptParam[0] := '0';
ExecuteScript(g_FunctionNPC, '@开始摆摊');
end;
end;
function TPlayObject.ClientDropGold(nGold: Integer): Boolean; //004C5BB0
begin
Result := False;
//安全区是否允许扔金币
if g_Config.boInSafeDisableDrop and InSafeZone then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0,
g_sCanotDropInSafeZoneMsg);
Exit;
end;
//扔金币数量的控制
if g_Config.boControlDropItem and (nGold < g_Config.nCanDropGold) then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0,
g_sCanotDropGoldMsg);
Exit;
end;
//本人物是否允许扔金币
if not m_boCanDrop or (m_wShopItemCount > 0) then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0,
g_sCanotDropItemMsg);
Exit;
end;
//扔的金币数是否大于已有金币数
if nGold > m_nGold then Exit;
DecGold(nGold);
if not DropGoldDown(nGold, False, nil, Self) then IncGold(nGold);
GoldChanged();
if g_Config.boStartMapEvent then begin
StartMapEventOfDropItem(sSTRING_BINDGOLDNAME);
end;
Result := True;
end;
//检测是否放出的宠物
function TPlayObject.IsDownPetItem(nMakeIndex: Integer): Boolean;
var
i : Integer;
begin
Result := False;
for i := 0 to 5 do begin
if nMakeIndex = m_PetInfo[i].nMakeIndex then begin
Result := True;
Break;
end;
end;
end;
//扔其他物品
function TPlayObject.ClientDropItem(sItemName: string; nItemIdx: Integer): Boolean;
resourcestring
sExceptionMsg = '[Exception] TPlayObject::ClientDropItem Code=%d';
var
i, ii : Integer;
UserItem : pTUserItem;
StdItem : pTStdItem;
sName : string;
FireBurnEff : word; //烟花效果
nCheckCode : Integer;
begin
Result := False;
nCheckCode := 0;
FireBurnEff := 0;
try
if (GetTickCount - m_DealLastTick) > 3000 then begin
nCheckCode := 1;
for i := m_ItemList.Count - 1 downto 0 do begin
UserItem := m_ItemList.Items[i];
if (UserItem <> nil) and (UserItem.MakeIndex = nItemIdx) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem = nil then Continue;
nCheckCode := 2;
sName := '';
ItemUnit.GetCustomItemName(UserItem, sName);
nCheckCode := 3;
if (CompareText(sItemName, sName) = 0) then begin
//烟花
nCheckCode := 4;
if (StdItem.StdMode = 52) then
FireBurnEff := MakeWord(StdItem.Shape, StdItem.AniCount);
nCheckCode := 5;
//兽粮
if (StdItem.StdMode = 49) and (StdItem.Shape = 52) then begin
nCheckCode := 6;
if (m_Pet <> nil) and (abs(m_nCurrX - m_Pet.m_nCurrX) <= 2) and (abs(m_nCurrY - m_Pet.m_nCurrY) <= 2) then begin
nCheckCode := 7;
if PetStoreAddExp(m_PetInfo[0].nMakeIndex, StdItem.DuraMax, LoWord(StdItem.AC), False) then begin
nCheckCode := 8;
Dispose(UserItem);
m_ItemList.Delete(i);
Result := True;
m_Pet.SendRefMsg(RM_HIT, m_Pet.m_btDirection, m_Pet.m_nCurrX, m_Pet.m_nCurrY, 0, '');
Break;
end;
nCheckCode := 9;
end else begin
SysMsg('你的身边没有可喂食的宠物,不能喂食。', c_Red, t_Hint);
Break;
end;
end;
nCheckCode := 10;
//烟花类
if FireBurnEff > 0 then begin
nCheckCode := 11;
SendRefMsg(RM_FIREBURN, m_btDirection, MakeLong(m_nCurrX, m_nCurrY), 0, 0, EnCodeBuffer(@FireBurnEff, SizeOf(word)));
nCheckCode := 12;
Dispose(UserItem);
m_ItemList.Delete(i);
Result := True;
Break;
end;
nCheckCode := 13;
//安全区是否允许扔物品
if g_Config.boInSafeDisableDrop and InSafeZone then begin
if g_Config.boShowScriptActionMsg then
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, g_sCanotDropInSafeZoneMsg)
else
SysMsg(g_sCanotDropInSafeZoneMsg, c_Pink, t_Hint);
Break;
end;
nCheckCode := 14;
//本人物是否允许扔物品
if not m_boCanDrop then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, g_sCanotDropItemMsg);
Break;
end;
nCheckCode := 15;
//物品控制-禁止丢弃
if CheckSPCode(StdItem.SPCode, SP_DISABLEDROP) or
((UserItem.btItemExt[4] and EX_BIND) = EX_BIND) then begin
Break;
end;
{魂佑灵兽禁止丢弃}
if (StdItem.StdMode = 49) and (StdItem.Shape = 51) and (UserItem.btItemExt[29] >= 2) then begin
SysMsg('魂佑灵兽石不允许丢弃!', c_Red, t_Hint);
Break;
end;
{已放出豹禁止丢弃}
if IsDownPetItem(UserItem.MakeIndex) then begin
SysMsg('已经放出灵兽的' + sName + '不能丢弃!', c_Red, t_Hint);
Break;
end;
nCheckCode := 16;
if g_Config.boControlDropItem and (StdItem.Price < g_Config.nCanDropPrice) then begin
Dispose(UserItem);
m_ItemList.Delete(i);
Result := True;
Break;
end;
nCheckCode := 17;
if DropItemDown(UserItem, 3, False, nil, Self) then begin
Dispose(UserItem);
m_ItemList.Delete(i);
Result := True;
Break;
end;
end;
end;
end;
nCheckCode := 18;
if Result then begin
WeightChanged();
//丢物品触发脚本
if (m_btRaceServer = RC_PLAYOBJECT) and (g_FunctionNPC <> nil) and (not m_boPneuma) then begin
ExecuteScript(g_FunctionNPC, '@DropItem' + IntToStr(StdItem.AniCount));
end;
nCheckCode := 19;
if g_Config.boStartMapEvent then begin
StartMapEventOfDropItem(StdItem.Name);
end;
end;
end;
except
MainOutMessage(Format(sExceptionMsg, [nCheckCode]));
end;
end;
procedure TPlayObject.ClientEnlargeTreasureBox();
begin
if (m_TreasureBoxItem = nil) or (m_TreasureBoxItem.DuraMax >= 20) then Exit;
if (m_Abil.wNimBusPoint < 10) then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, '你的灵力不足10点,无法扩充灵犀宝盒');
Exit;
end;
Dec(m_Abil.wNimBusPoint, 10);
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
m_TreasureBoxItem.DuraMax := m_TreasureBoxItem.DuraMax + 2;
ClientQueryTreasureBoxItems(False);
SendDefMessage(SM_INFORMATION, 0, 0, 0, 0,
Format('你的灵犀宝盒格子扩充成功,您现在拥有<color=green %d>个格子', [m_TreasureBoxItem.DuraMax]));
end;
{神龙献宝}
procedure TPlayObject.ClientErnie(nOpCode: word);
var
nLineCount : Integer;
NPC : TNormNpc;
begin
if m_boGhost or m_boDeath then Exit;
case LoByte(nOpCode) of
0: begin //宝石类停止
end;
1: begin //宝石类开始
end;
2: begin
end;
3: begin //弹出摇奖机,神龙在此刻觉醒
//sGiftName := '强化火球四重';
//SendDefMessage(34972, 0, 1, 0, 0, '今日神龙宝藏:' + sGiftName);
end;
4: begin //神龙献宝开始
nLineCount := HiByte(nOpCode);
NPC := UserEngine.FindMerchant(m_SMELTNPC);
if (NPC = nil) then
NPC := UserEngine.FindNPC(m_SMELTNPC);
if (NPC <> nil) then begin
m_sScriptParam[0] := IntToStr(nLineCount);
NPC.GotoLable(Self, '@StartErnie', False);
end;
end;
5: begin //神龙献宝停下
if (m_nRandomGiveStep = 1) then begin
m_nRandomGiveStep := 0;
NPC := UserEngine.FindMerchant(m_SMELTNPC);
if (NPC = nil) then
NPC := UserEngine.FindNPC(m_SMELTNPC);
if (NPC <> nil) then begin
NPC.GotoLable(Self, '@EndErnie', False);
end;
end;
end;
end;
end;
{心魔控制}
procedure TPlayObject.ClientEvilOp(nOpCode: Integer; nEvilMonID: Integer;
nMakeIndex: Integer);
var
i, nCount : Integer;
StdItem : pTStdItem;
UserItem : pTUserItem;
mon, BaseObject : TBaseObject;
begin
mon := nil;
for i := 0 to m_SlaveList.Count - 1 do begin
if TBaseObject(m_SlaveList[i]).m_btRaceServer = RC_EVIL then begin
mon := TBaseObject(m_SlaveList[i]);
Break;
end;
end;
if mon = nil then Exit;
{检查物品}
if nMakeIndex > 0 then begin
GetUserItemByMakeIndex(nMakeIndex, UserItem);
if (UserItem <> nil) then
StdItem := UserEngine.GetStdItem(UserItem.wIndex)
else
StdItem := nil;
if (UserItem = nil) or (StdItem = nil) then Exit;
end;
case nOpCode of
4: begin //心魔绝杀
if (m_wStatusTimeArr[POISON_DONTMOVE] > 0) or
((m_wStatusTimeArr[POISON_STONE] > 0) and not g_Config.ClientConf.boParalyCanHit) then Exit; //被麻痹不能使用
if (GetTickCount - m_dwEvilUniQueSkillTick) < 10 * 1000 then begin
SysMsg('你控制的心魔已经处在强力攻击状态!', c_Red, t_Hint);
Exit;
end;
if m_nEvilFollowerPower < g_Config.nEvilUniQueSkillDecPower * 1000 then begin
SysMsg('镇魔力不足,无法发动强力攻击!', c_Red, t_Hint);
Exit;
end;
if (GetTickCount - m_dwEvilUniQueSkillTick) <
g_Config.nUseEvilUniQueSkillTick * 1000 then begin
SysMsg('心魔绝杀技需间隔' +
IntToStr(g_Config.nUseEvilUniQueSkillTick) + '秒才能使用一次', c_Red, t_Hint);
Exit;
end;
for i := 0 to m_VisibleActors.Count - 1 do begin
BaseObject :=
TBaseObject(pTVisibleBaseObject(m_VisibleActors.Items[i]).BaseObject);
if BaseObject.m_boDeath or BaseObject.m_boGhost then Continue;
if (abs(m_nCurrX - BaseObject.m_nCurrX) < 15) and (abs(m_nCurrY -
BaseObject.m_nCurrY) < 15) then begin
if IsProperTarget(BaseObject) then begin
BaseObject.MakePosion(POISON_DONTMOVE, g_Config.nEvilUniQueSkillDontMoveTime, 0);
BaseObject.SetLastHiter(Self);
end;
end;
end;
{心魔绝杀}
ClearEvilFollower(0);
m_dwEvilUniQueSkillTick := GetTickCount;
Dec(m_nEvilFollowerPower, g_Config.nEvilUniQueSkillDecPower * 1000);
SendDefMessage(CM_RECALLEVIL, Integer(Self), 260,
LoWord(m_nEvilFollowerPower), HiWord(m_nEvilFollowerPower), '');
end;
5: begin //点面板上的“镇”字,有物品ID无心魔ID
if m_nEvilFollowerPower >= m_nEvilFollowerPowerMax then begin //镇魔力量已经很强了,无需再增加
SysMsg('镇魔力量已经很强了,无需再增加', c_Red, t_Hint);
Exit;
end;
m_nEvilFollowerPower := _MIN(m_nEvilFollowerPowerMax,
m_nEvilFollowerPower + StdItem.AC * 1000);
if UserItem.Dura <= 1 then begin
SendDelItems(UserItem);
DelBagItem(UserItem.MakeIndex, StdItem.Name);
WeightChanged;
end else begin
Dec(UserItem.Dura);
SendUpdateItem(UserItem);
end;
SendDefMessage(34968, Integer(Self), 3, LoWord(m_nEvilFollowerPower),
HiWord(m_nEvilFollowerPower), '');
ClearEvilFollower(4);
end;
6: begin //解除,就是释放这个心魔宝宝
nCount := 0;
for i := m_SlaveList.Count - 1 downto 0 do begin
if TBaseObject(m_SlaveList[i]).m_btRaceServer = RC_EVIL then begin
Inc(nCount);
if nEvilMonID = Integer(m_SlaveList[i]) then begin
SysMsg(Format('你的宠物(%s)叛变了', [TBaseObject(m_SlaveList[i]).m_sFilterCharName]), c_Pink, t_Hint);
TBaseObject(m_SlaveList[i]).m_Master := nil;
TBaseObject(m_SlaveList[i]).m_boSuperMan := False;
TBaseObject(m_SlaveList[i]).m_btNameColor := $F9;
TBaseObject(m_SlaveList[i]).RefNameColor;
TBaseObject(m_SlaveList[i]).RefShowName;
TBaseObject(m_SlaveList[i]).HealthSpellChanged;
m_SlaveList.Delete(i);
Dec(nCount);
end;
end;
end;
if nCount = 0 then begin
SendDefMessage(CM_RECALLEVIL, 0, 1, 0, 0, '');
m_nEvilFollowerPower := 0;
end;
SendDefMessage(34968, Integer(Self), 3, LoWord(m_nEvilFollowerPower),
HiWord(m_nEvilFollowerPower), '');
ClientQueryEvilFollower();
end;
end;
end;
procedure TPlayObject.ClientEvoluTion(wParam: word; nMainMakeIndex,
nAuxMakeIndex, nMakeIndex: Integer);
var
UserItem : pTUserItem;
begin
if (not m_boDeath) and (not m_boGhost) and (not m_boPneuma) then begin
if (GetUserItemByMakeIndex(nMainMakeIndex, UserItem) < 0) or
(GetUserItemByMakeIndex(nAuxMakeIndex, UserItem) < 0) then Exit;
if (nMakeIndex > 0) and (GetUserItemByMakeIndex(nMakeIndex, UserItem) < 0) then nMakeIndex := 0;
if nMakeIndex < 0 then nMakeIndex := 0;
m_sScriptParam[0] := IntToStr(wParam); //封元印
m_sScriptParam[1] := IntToStr(nMainMakeIndex); //主灵兽
m_sScriptParam[2] := IntToStr(nAuxMakeIndex); //副灵兽
m_sScriptParam[3] := IntToStr(nMakeIndex);
ExecuteScript(g_FunctionNPC, '@灵兽幻化');
end;
end;
//灵兽繁衍
procedure TPlayObject.ClientPetMakeBaby(nMaleMakeIndex, nFemaleMakeIndex: Integer);
var
UserItem : pTUserItem;
begin
if (not m_boDeath) and (not m_boGhost) and (not m_boPneuma) then begin
if (GetUserItemByMakeIndex(nMaleMakeIndex, UserItem) < 0) or (GetUserItemByMakeIndex(nFemaleMakeIndex, UserItem) < 0) then Exit;
m_sScriptParam[0] := IntToStr(nMaleMakeIndex); //雄灵兽
m_sScriptParam[1] := IntToStr(nFemaleMakeIndex); //雌灵兽
ExecuteScript(g_FunctionNPC, '@繁衍灵兽');
end;
end;
//五行令旗
procedure TPlayObject.ClientFelementOrderFlag(nMakeIndex, nMon: Integer);
var
i : Integer;
mon : TBaseObject;
Targe : TBaseObject;
UserItem : pTUserItem;
boEatOK : Boolean;
begin
boEatOK := False;
Targe := nil;
if GetUserItemByMakeIndex(nMakeIndex, UserItem) > -1 then begin
if nMon > 0 then Targe := TBaseObject(nMon);
if (nMon > 0) and (Targe <> nil) and (not Targe.m_boDeath) and
(not Targe.m_boGhost) and (Targe.m_btRaceServer = RC_MISSION) and
(Targe.m_boMission) then begin
if UserItem.Dura > 0 then Dec(UserItem.Dura);
if (UserItem.Dura <= 0) then begin
DelBagItem(nMakeIndex, '');
boEatOK := True;
end else begin
SendUpdateItem(UserItem);
end;
//指定攻击目标
for i := 0 to m_SlaveList.Count - 1 do begin
mon := m_SlaveList[i];
if not (mon.m_btRaceServer in [14, 21]) then Continue;
mon.m_FirstTargetCret := Targe;
mon.SetTargetCreat(Targe);
end;
SendDefMessage(3046, m_btDirection, LoWord(nMon), HiWord(nMon), 1, '');
SysMsg(Format('使用五行令旗成功,将<%s>指定为首要攻击目标!', [Targe.m_sFilterCharName]), c_Red, t_Hint);
end;
end;
if not boEatOK then SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
end;
procedure TPlayObject.ClientGemItems(NPC: Integer; nType: Integer; nItemCount:
Integer; nState: Integer; sData: string);
var
buf : array[0..9] of Integer;
i, j : Integer;
nCode, nRate : Integer;
ANpc : TNormNpc;
StdItem : pTStdItem;
UserItem : pTUserItem;
GemItems : array[0..9] of pTUserItem;
GemStdItems : array[0..9] of pTStdItem;
sMsg, sLable, DestItemName : string;
sLableOK : string;
begin
for i := 0 to 9 do begin
m_sScriptParam[i] := '';
GemItems[i] := nil;
GemStdItems[i] := nil;
end;
sLable := '';
sLableOK := '';
FillChar(buf, SizeOf(buf), #0);
DeCodeBuffer(sData, @buf, SizeOf(Integer) * nItemCount);
if m_btPermissionGM > 6 then begin
SysMsg(Format('当前指令编号为:%d', [nType]), c_Red, t_Hint);
SysMsg(Format('当前指令状态为:%d', [nState]), c_Red, t_Hint);
SysMsg(Format('当前NPC编号为:%d', [NPC]), c_Blue, t_Hint);
end;
if nType in [2, 5] then begin
if NPC = Integer(Self) then
ANpc := TNormNpc(m_SMELTNPC)
else
ANpc := UserEngine.FindMerchant(TObject(NPC));
end else begin
ANpc := UserEngine.FindMerchant(TObject(NPC));
end;
if ANpc = nil then ANpc := UserEngine.FindNPC(TObject(NPC));
if ANpc = nil then Exit;
{函数入口初始}
nCode := 0;
for i := 0 to nItemCount - 1 do begin
GemItems[i] := nil;
for j := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList[j];
if UserItem.MakeIndex = buf[i] then begin
GemItems[i] := UserItem;
GemStdItems[i] := UserEngine.GetStdItem(UserItem.wIndex);
Break;
end;
end;
end;
{函数标签初始}
case nType of
0: sLable := '@@gemcondense'; //宝石凝练
1: sLable := '@@gemcompound'; //宝石合成
2: sLable := '@@weaponcompound'; //武器铸造
3: sLable := '@@supercompound'; //装备合成
4: sLable := '';
5: sLable := '@@commoncodense'; //熔炼宝箱
6: sLable := '';
7: begin //黑暗升级
if (GemStdItems[0] <> nil) then begin
case GemStdItems[0].StdMode of
5, 6: sLable := '@@equiplevel';
10, 11, 15, 58, 81: sLable := '@@defitemlevel';
else sLable := '@@jewitemlevel';
end;
end;
end;
8: begin
sLable := '@@fushi';
if (nCode = 0) and (nState > 255) then begin
m_sScriptParam2[0] := IntToStr(nState div 256);
if (nState mod 256 = 0) then nState := 0 else nState := 1;
end;
end;
9: sLable := '@@hayifu';
10: sLable := '@@spriterefine';
11: sLable := '@@upgradeyuanshi';
12: sLable := '@@HEJINGPO';
13: sLable := '@@HELONGLING';
14: sLable := '@@gemxianguan';
end;
sLableOK := sLable + 'OK';
{函数触发开始}
if (nCode = 0) then begin
m_sScriptParam[0] := IntToStr(nItemCount);
for i := 0 to nItemCount - 1 do begin
m_sScriptParam[i + 1] := IntToStr(GemItems[i].MakeIndex);
StdItem := UserEngine.GetStdItem(GemItems[i].wIndex);
if StdItem <> nil then begin
if (StdItem.StdMode = 44) and (StdItem.Shape = 4) then
m_sScriptParam[10] := IntToStr(GemItems[i].MakeIndex);
end;
{$IF USESDK = DEBUG}
MainOutMessage('物品' + IntToStr(i) + ':' + IntToStr(GemItems[i].MakeIndex));
{$IFEND}
end;
if (nState = 1) then begin
if (IsEnvir(ANpc.m_PEnvir) and (abs(ANpc.m_nCurrX - m_nCurrX) < 15) and (abs(ANpc.m_nCurrY - m_nCurrY) < 15)) or (ANpc.m_boIsHide) then begin
if (sLable <> '') then ANpc.GotoLable(Self, sLable, False);
end;
end else begin
if (sLableOK <> '') then ANpc.GotoLable(Self, sLableOK, False);
end;
end;
end;
//接收Ident 993 Param 1 P1 0 P2 2318 P3 16 Msg ;zfxf@ruvfE 数据部分是放上的物品MakeIndex
procedure TPlayObject.ClientGemSmelt(nState: Integer; RedBaoshi, BlueBaoshi,
GreenBaoshi: Integer; sItems: string);
var
ItemMakeIndexs : array[0..14] of Integer;
i, ItemCount : Integer;
begin
FillChar(ItemMakeIndexs[0], SizeOf(Integer) * 15, 0);
ItemCount := Round(Length(sItems) * 3 / 4) div 4;
if ItemCount > 0 then
DeCodeBuffer(sItems, @ItemMakeIndexs, ItemCount * 4);
for i := 0 to 19 do
m_sScriptParam[i] := '';
m_sScriptParam[0] := IntToStr(RedBaoshi);
m_sScriptParam[1] := IntToStr(BlueBaoshi);
m_sScriptParam[2] := IntToStr(GreenBaoshi);
m_sScriptParam[3] := IntToStr(ItemCount - 1);
for i := 0 to ItemCount - 1 do
m_sScriptParam[4 + i] := IntToStr(ItemMakeIndexs[i]);
if m_SMELTNPC <> nil then
TNormNpc(m_SMELTNPC).GotoLable(Self, '@@gemsmelt', False);
end;
//CM_BUTCH 挖肉
function TPlayObject.ClientGetButchItem(BaseObject: TBaseObject; nX, nY:
Integer; btDir: byte; var dwDelayTime: LongWord): Boolean; //004DB7E0
var
N10, n14 : Integer;
dwCheckTime : LongWord;
begin
Result := False;
if (m_wShopItemCount > 0) then Exit;
dwDelayTime := 0;
if (not g_Config.boDisableM2SpeedCtrl) then begin
dwCheckTime := GetTickCount - m_dwTurnTick;
if dwCheckTime < g_Config.dwTurnIntervalTime then begin
dwDelayTime := g_Config.dwTurnIntervalTime - dwCheckTime;
Exit;
end;
m_dwTurnTick := GetTickCount;
end;
if (abs(nX - m_nCurrX) <= 2) and (abs(nY - m_nCurrY) <= 2) then begin
if m_PEnvir.IsValidObject(nX, nY, 2, BaseObject) then begin
if BaseObject.m_boDeath and ((not BaseObject.m_boSkeleton) or ((BaseObject.m_btRaceServer = RC_EVIL) and (BaseObject.m_btRaceImg = 253))) and (BaseObject.m_boAnimal) then begin
N10 := Random(16) + 5;
n14 := Random(100);
Dec(BaseObject.m_nBodyLeathery, N10);
Dec(BaseObject.m_nMeatQuality, n14);
if (BaseObject.m_btRaceServer = RC_EVIL) and (BaseObject.m_btRaceImg = 253) then begin //夺宝心魔
m_sScriptParam[0] := BaseObject.m_sOriginalName;
m_sScriptParam[1] := BaseObject.m_sCharName;
if BaseObject.m_boSkeleton then
m_sScriptParam[2] := '1'
else
m_sScriptParam[2] := '0'; //0:没挖过,1:挖过
m_sScriptParam[3] := IntToStr(BaseObject.m_nBodyLeathery);
//尸体坚韧度
ExecuteScript(g_FunctionNPC, '@弑魔掘宝');
end;
if BaseObject.m_nMeatQuality < 0 then BaseObject.m_nMeatQuality := 0;
if BaseObject.m_nBodyLeathery <= 0 then begin
BaseObject.m_boSkeleton := True;
if (BaseObject.m_btRaceServer in [RC_ANIMAL..RC_MONSTER - 1]) then begin
BaseObject.ApplyMeatQuality(); //计算肉的品质
BaseObject.SendRefMsg(RM_SKELETON, BaseObject.m_btDirection,
BaseObject.m_nCurrX, BaseObject.m_nCurrY, 0, '');
end;
if not TakeBagItems(BaseObject) then begin
SysMsg(sYouFoundNothing {未发现任何物品!!!}, c_Red, t_Hint);
end;
BaseObject.m_nBodyLeathery := 50;
end;
m_dwDeathTick := GetTickCount();
end;
end;
m_btDirection := btDir;
end;
SendRefMsg(RM_BUTCH, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
Result := True;
end;
//取小地图信息
procedure TPlayObject.ClientGetMinMap;
var
nMinMap : Integer;
begin
nMinMap := m_PEnvir.MinMap;
if nMinMap > 0 then begin
SendDefMessage(SM_READMINIMAP_OK, 0, nMinMap, 0, 0, '');
end else begin
SendDefMessage(SM_READMINIMAP_FAIL, 0, 0, 0, 0, '');
end;
end;
//CM_GROUPMODE
procedure TPlayObject.ClientGropuClose; //004C3C10
begin
if m_GroupOwner = nil then begin
m_boAllowGroup := False;
Exit;
end;
if m_GroupOwner <> Self then begin
m_GroupOwner.DelMember(Self);
m_boAllowGroup := False;
end else begin
SysMsg('如果你想退出,使用编组功能(删除按钮)', c_Red, t_Hint);
end;
end;
procedure TPlayObject.ClientGuildAddMember(sHumName: string); //004DEDB4
var
nC : Integer;
PlayObject : TPlayObject;
Castle : TUserCastle;
begin
nC := 1; //'你没有权利使用这个命令。'
if IsGuildMaster then begin
PlayObject := UserEngine.GetPlayObject(sHumName);
if PlayObject <> nil then begin
if not TGuild(m_MyGuild).IsFull then begin
if PlayObject.m_boAllowGuild then begin
if not TGuild(m_MyGuild).IsMember(sHumName) then begin
if (PlayObject.m_MyGuild = nil) and (TGuild(m_MyGuild).m_RankList.Count < 400) then begin
TGuild(m_MyGuild).AddMember(PlayObject);
UserEngine.SendServerGroupMsg(SS_207, g_Config.nServerNumber, TGuild(m_MyGuild).sGuildName);
PlayObject.m_MyGuild := m_MyGuild;
PlayObject.m_sGuildRankName := TGuild(m_MyGuild).GetRankName(PlayObject, PlayObject.m_nGuildRankNo);
PlayObject.RefShowName();
PlayObject.SysMsg('你已加入行会: ' + TGuild(m_MyGuild).sGuildName + ' 当前封号为: ' + PlayObject.m_sGuildRankName, c_Green, t_Hint);
//脚本入口函数
PlayObject.m_sScriptParam[0] := TGuild(m_MyGuild).sGuildName;
PlayObject.m_sScriptParam[1] := PlayObject.m_sGuildRankName;
Castle := g_CastleManager.IsCastleMember(PlayObject);
PlayObject.m_nGuildGold := 0;
PlayObject.GuildGoldChanged();
if Castle <> nil then begin
PlayObject.m_sScriptParam[2] := Castle.m_sName;
PlayObject.ExecuteScript(g_ManageNPC, '@ADDTOCASTLEGUILD');
end else
PlayObject.ExecuteScript(g_ManageNPC, '@ADDTOGUILD');
nC := 0;
end else
nC := 4; //'对方已经加入其他行会。'
end else
nC := 3; //'对方已经加入我们的行会。'
end else begin
nC := 5; //'对方不允许加入行会。'
PlayObject.SysMsg('你拒绝加入行会。 [允许命令为 @' + g_GameCommand.LETGUILD.sCmd + ']', c_Red, t_Hint);
end;
end else begin
nC := 1;
PlayObject.SysMsg('你所要加入的行会成员已经达到上限!', c_Red, t_Hint);
end;
end else nC := 2; //'想加入进来的成员应该来面对掌门人。'
end else
nC := 1;
if nC = 0 then begin
SendDefMessage(SM_GUILDADDMEMBER_OK, 0, 0, 0, 0, '');
end else begin
SendDefMessage(SM_GUILDADDMEMBER_FAIL, nC, 0, 0, 0, '');
end;
end;
procedure TPlayObject.ClientGuildAlly; //004DF3AC
var
N8 : Integer;
BaseObjectC : TBaseObject;
resourcestring
sExceptionMsg = '[Exception] TPlayObject::ClientGuildAlly';
begin
try
N8 := -1;
BaseObjectC := GetPoseCreate();
if (BaseObjectC <> nil) and
(BaseObjectC.m_MyGuild <> nil) and
(BaseObjectC.m_btRaceServer = RC_PLAYOBJECT) and
(BaseObjectC.GetPoseCreate = Self) then begin
if TGuild(BaseObjectC.m_MyGuild).m_boEnableAuthAlly then begin
if BaseObjectC.IsGuildMaster and IsGuildMaster then begin
if TGuild(m_MyGuild).IsNotWarGuild(TGuild(BaseObjectC.m_MyGuild)) and
TGuild(BaseObjectC.m_MyGuild).IsNotWarGuild(TGuild(m_MyGuild)) then begin
TGuild(m_MyGuild).AllyGuild(TGuild(BaseObjectC.m_MyGuild));
TGuild(BaseObjectC.m_MyGuild).AllyGuild(TGuild(m_MyGuild));
TGuild(m_MyGuild).SendGuildMsg(TGuild(BaseObjectC.m_MyGuild).sGuildName + '行会已经和您的行会联盟成功。');
TGuild(BaseObjectC.m_MyGuild).SendGuildMsg(TGuild(m_MyGuild).sGuildName + '行会已经和您的行会联盟成功。');
TGuild(m_MyGuild).RefMemberName;
TGuild(BaseObjectC.m_MyGuild).RefMemberName;
UserEngine.SendServerGroupMsg(SS_207, g_Config.nServerNumber,
TGuild(m_MyGuild).sGuildName);
UserEngine.SendServerGroupMsg(SS_207, g_Config.nServerNumber,
TGuild(BaseObjectC.m_MyGuild).sGuildName);
N8 := 0;
end else N8 := -2;
end else N8 := -3;
end else N8 := -4; //004DF57C
end;
if N8 = 0 then begin
SendDefMessage(SM_GUILDMAKEALLY_OK, 0, 0, 0, 0, '');
end else begin
SendDefMessage(SM_GUILDMAKEALLY_FAIL, N8, 0, 0, 0, '');
end;
except
on E: Exception do begin
MainOutMessage(sExceptionMsg);
MainOutMessage(E.Message);
end;
end;
end;
procedure TPlayObject.ClientGuildBreakAlly(sGuildName: string); //004DF604
var
N10 : Integer;
Guild : TGuild;
begin
N10 := -1;
if not IsGuildMaster() then Exit;
Guild := g_GuildManager.FindGuild(sGuildName);
if Guild <> nil then begin
if TGuild(m_MyGuild).IsAllyGuild(Guild) then begin
TGuild(m_MyGuild).DelAllyGuild(Guild);
Guild.DelAllyGuild(TGuild(m_MyGuild));
TGuild(m_MyGuild).SendGuildMsg(Guild.sGuildName + ' 行会与您的行会解除联盟成功!!!');
Guild.SendGuildMsg(TGuild(m_MyGuild).sGuildName + ' 行会解除了与您行会的联盟!!!');
TGuild(m_MyGuild).RefMemberName();
Guild.RefMemberName();
UserEngine.SendServerGroupMsg(SS_207, g_Config.nServerNumber, TGuild(m_MyGuild).sGuildName);
UserEngine.SendServerGroupMsg(SS_207, g_Config.nServerNumber, Guild.sGuildName);
N10 := 0;
end else N10 := -2;
end else N10 := -3; //004DF750
if N10 = 0 then begin
SendDefMessage(SM_GUILDBREAKALLY_OK, 0, 0, 0, 0, '');
end else begin
SendDefMessage(SM_GUILDMAKEALLY_FAIL, 0, 0, 0, 0, '');
end;
end;
procedure TPlayObject.ClientGuildDelMember(sHumName: string); //004DEFB8
var
nC : Integer;
s14 : string;
PlayObject : TPlayObject;
Castle : TUserCastle;
begin
nC := 1;
if (m_MyGuild <> nil) and IsGuildMaster then begin
if TGuild(m_MyGuild).IsMember(sHumName) then begin
if g_GuildManager.MemberOfClan(sHumName) = nil then begin
if m_sCharName <> sHumName then begin
if TGuild(m_MyGuild).DelMember(sHumName) then begin
nC := 0;
end else
nC := 4;
end else begin
nC := 3;
s14 := TGuild(m_MyGuild).sGuildName;
if TGuild(m_MyGuild).CancelGuld(sHumName) then begin
SysMsg('行会' + s14 + '已被取消!!!', c_Red, t_Hint);
nC := 0;
end
end;
end else
nC := 2;
end else
SysMsg('你无权删除宗族成员。', c_Red, t_Hint);
end;
if nC = 0 then begin
SendDefMessage(SM_GUILDDELMEMBER_OK, 0, 0, 0, 0, '');
end else begin
SendDefMessage(SM_GUILDDELMEMBER_FAIL, nC, 0, 0, 0, '');
end;
end;
procedure TPlayObject.ClientGuildHome; //004DEBDC
begin
ClientOpenGuildDlg();
end;
procedure TPlayObject.ClientGuildMemberList; //004DEBF0
var
GuildRank : pTGuildRank;
i, ii : Integer;
sSENDMSG, sName, sAmbit : string;
PlayObject : TPlayObject;
begin
if m_MyGuild = nil then Exit;
for i := 0 to TGuild(m_MyGuild).m_RankList.Count - 1 do begin
if i >= 50 then Break;
GuildRank := TGuild(m_MyGuild).m_RankList.Items[i];
sSENDMSG := sSENDMSG + '#' + IntToStr(GuildRank.nRankNo) + '/*' + GuildRank.sRankName + '/';
for ii := 0 to GuildRank.MemberList.Count - 1 do begin
if ii >= 200 then Break;
if Length(sSENDMSG) > 5000 then Break;
sName := GuildRank.MemberList.Keys[ii];
PlayObject := UserEngine.GetPlayObject(sName);
if PlayObject <> nil then begin
if PlayObject.m_btAmbitKind > 2 then begin
if (PlayObject.m_btAmbitKind mod 2) <> 0 then
sAmbit := '1'
else
sAmbit := '2';
end else
sAmbit := '0';
sSENDMSG := sSENDMSG + '1' + sAmbit + sName + '/';
end else
sSENDMSG := sSENDMSG + '00' + sName + '/';
end;
end;
m_defMsg := MakeDefaultMsg(SM_GUILDMEMBERLIST, 0, 0, 0, 0);
SendSocket(@m_defMsg, EnCodeString(sSENDMSG));
end;
procedure TPlayObject.ClientGuildOfficial(nCode, nRankNo: Integer; sChiefName: string);
var
ChiefPlayer : TPlayObject;
nPermission : Integer;
begin
if (not (nRankNo in [1..10])) or (sChiefName = '') then Exit;
if m_MyGuild = nil then Exit;
ChiefPlayer := UserEngine.GetPlayObject(sChiefName); //行会会长
if (ChiefPlayer <> nil) then begin
if nCode = 1 then begin
if m_nGuildGold >= nGuildOfficialPrice[nRankNo] then begin
TGuild(m_MyGuild).GetOfficial(nRankNo, sGuildOfficial[nRankNo], m_sCharName); //任命职位
Dec(m_nGuildGold, nGuildOfficialPrice[nRankNo]);
GuildGoldChanged;
if g_boGameLogGuildGold then begin
AddGameDataLog(Format(g_sGameLogMsg, [LOG_GUILDGOLD,
m_sMapName,
m_nCurrX,
m_nCurrY,
m_sCharName,
'行会银两',
nGuildOfficialPrice[nRankNo],
'-',
'官职任命']));
end;
end else
SysMsg('行会银两不足' + IntToStr(nGuildOfficialPrice[nRankNo]) + '个,无法任命该职位!', c_Red, t_Hint);
SysMsg('恭喜你获得了新的行会职位!', c_Green, t_Hint);
ChiefPlayer.SysMsg(m_sCharName + '被任命为' + sGuildOfficial[nRankNo], c_Red, t_Hint);
end else begin
ChiefPlayer.SysMsg(m_sCharName + '拒绝被任命为' + sGuildOfficial[nRankNo], c_Red, t_Hint);
end;
end;
end;
procedure TPlayObject.ClientGuildUpdateNotice(sNotict: string);
var
SC : string;
begin
if (m_MyGuild = nil) or (m_nGuildRankNo <> 1) then Exit;
TGuild(m_MyGuild).NoticeList.Clear;
while (sNotict <> '') do begin
sNotict := GetValidStr3(sNotict, SC, [#$D]);
TGuild(m_MyGuild).NoticeList.Add(SC);
end;
TGuild(m_MyGuild).UpdateGuildFile;
UserEngine.SendServerGroupMsg(SS_207, g_Config.nServerNumber,
TGuild(m_MyGuild).sGuildName);
ClientOpenGuildDlg();
end;
procedure TPlayObject.ClientGuildUpdateRankInfo(sRankInfo: string);
var
nC : Integer;
begin
if (m_MyGuild = nil) or (m_nGuildRankNo <> 1) then Exit;
nC := TGuild(m_MyGuild).UpdateRankNew(sRankInfo);
if nC = 0 then begin
UserEngine.SendServerGroupMsg(SS_207, g_Config.nServerNumber, TGuild(m_MyGuild).sGuildName);
ClientGuildMemberList();
end else begin
if nC <= -2 then begin
SendDefMessage(SM_GUILDRANKUPDATE_FAIL, nC, 0, 0, 0, '');
end;
end;
end;
//检测是否允许指定动作
function TPlayObject.CheckCanOperate(Action: TClientAction; nKey: Integer = 0): Boolean;
begin
Result := False;
if m_boGodCallBoss and m_boSuperMan then m_boSuperMan := False;
// if m_boInMagicCast then begin
// m_boInMagicCast := False;
// SendRefMsg(RM_MAGICFIREFAIL, 0, 0, 0, 0, '');
// end;
if m_boDeath or m_boGhost then Exit;
{ if nKey = SKILL_186 then begin
if (m_wStatusTimeArr[STATE_SILENCE] = 0) then
Result := True;
Exit;
end; }
if (m_wStatusTimeArr[STATE_FEAR {恐惧}] > 0) or (m_wStatusTimeArr[POISON_DONTMOVE] <> 0) or (m_wStatusTimeArr[STATE_FREEZECHAIN] <> 0) then Exit;
case Action of
cHit: begin
if ((m_wStatusTimeArr[POISON_STONE] <> 0) and not g_Config.ClientConf.boParalyCanHit) then Exit;
end;
cRun: begin
if (m_wStatusTimeArr[STATE_FREEZE {冰冻}] <> 0) or (m_wStatusTimeArr[STATE_FIXEDBODY] <> 0) or ((m_wStatusTimeArr[POISON_STONE] <> 0) and not g_Config.ClientConf.boParalyCanRun) then Exit;
end;
cWalk: begin
if (m_wStatusTimeArr[STATE_FREEZE {冰冻}] <> 0) or (m_wStatusTimeArr[STATE_FIXEDBODY] <> 0) or ((m_wStatusTimeArr[POISON_STONE] <> 0) and not g_Config.ClientConf.boParalyCanWalk) then Exit;
end;
cDigUp: begin
if (m_wStatusTimeArr[STATE_FREEZE {冰冻}] <> 0) or (m_wStatusTimeArr[STATE_FIXEDBODY] <> 0) or ((m_wStatusTimeArr[POISON_STONE] <> 0) and not g_Config.ClientConf.boParalyCanHit) then Exit;
end;
cTurn: begin
if (m_wStatusTimeArr[STATE_FREEZE {冰冻}] <> 0) or (m_wStatusTimeArr[STATE_FIXEDBODY] <> 0) or ((m_wStatusTimeArr[POISON_STONE] <> 0) and not g_Config.ClientConf.boParalyCanRun) then Exit;
end;
cMagHit: begin
if (m_wStatusTimeArr[STATE_SILENCE {沉默}] <> 0) or ((m_wStatusTimeArr[POISON_STONE] <> 0) and not g_Config.ClientConf.boParalyCanSpell) then Exit;
end;
end;
Result := True;
end;
//物理攻击命令的处理,包括
// CM_HIT、CM_HEAVYHIT、CM_BIGHIT、CM_POWERHIT、CM_LONGHIT、CM_WIDEHIT
// CM_FIREHIT、CM_CRSHIT、CM_TWNHIT、CM_42HIT、CM_42HIT、CM_3026
// 3014 普通攻击
// 3018 功杀
// 3019 刺杀
// 3024 半月
// 3025 烈火
function TPlayObject.ClientHitXY(wIdent: word; nX, nY, nDir, nMagicID: Integer;
boLateDelivery: Boolean; var dwDelayTime: LongWord): Boolean; //004CB7F8
var
n14, n18 : Integer;
StdItem : pTStdItem;
dwAttackTime, dwCheckTime : LongWord;
nPinjunTime : Integer;
AttackTarget : TBaseObject;
{$IF CATEXCEPTION = TRYEXCEPTION}
nCheckCode : Integer;
{$IFEND}
resourcestring
sExceptionMsg = '[Exception] TPlayObject::ClientHitXY Code=%d';
sHint1 = '摆摊或变身模式下禁止攻击';
sHint2 = '骑马禁止攻击';
sHint3 = '死亡或被麻痹禁止攻击';
sHint4 = '5次攻击超速!限制:%d,当前:%d';
sHint5 = '攻击忙复位!!!';
sHint6 = '攻击不忙!!!';
begin
Result := False;
dwDelayTime := 0;
{$IF CATEXCEPTION = TRYEXCEPTION}
nCheckCode := 0;
{$IFEND}
if not m_boCanHit or m_boCatapultAttackMode then Exit;
{$IF CATEXCEPTION = TRYEXCEPTION}
try
{$IFEND}
if m_boPneuma and m_PEnvir.m_MapFlag.boNoPneuma then Exit; //元神在不允许释放的地图,禁止攻击
if (m_wShopItemCount > 0) then begin
if g_Config.boOldClientShowHiLevel then SysMsg(sHint1, c_Blue, t_Hint);
Exit;
end;
if (m_wBianshenAppr > 0) and (m_boAttackMode = False) then begin
if g_Config.boOldClientShowHiLevel then SysMsg(sHint1, c_Blue, t_Hint); //2016.06.22 支持ChangeAppr变身支持攻击
Exit;
end;
if (m_boRideOn and not m_boRideFightOn) then begin
if g_Config.boOldClientShowHiLevel then SysMsg(sHint2, c_Blue, t_Hint);
Exit; //骑马不允许攻击
end;
if not CheckCanOperate(cHit) then begin
if g_Config.boOldClientShowHiLevel then SysMsg(sHint3, c_Blue, t_Hint);
Exit;
end;
//10指令时间控制
if (not g_Config.boDisableM2SpeedCtrl) then begin
if m_nHitCount = 0 then m_FirstHitTick := GetTickCount;
Inc(m_nHitCount);
if m_nHitCount >= 6 then begin
nPinjunTime := (GetTickCount - m_FirstHitTick) div 5;
m_FirstHitTick := GetTickCount;
m_nHitCount := 0;
if nPinjunTime < g_Config.n10HitTIme then begin
if m_boTestSpeedMode then
SysMsg(Format(sHint4, [g_Config.n10HitTIme, nPinjunTime]), c_Red, t_Hint);
Exit;
end;
end;
{$IF CATEXCEPTION = TRYEXCEPTION}
nCheckCode := 1;
{$IFEND}
if (not boLateDelivery) then begin
if not CheckActionStatus(wIdent, dwDelayTime) then begin
m_boFilterAction := False;
Exit;
end;
m_boFilterAction := True;
dwAttackTime := _Max(0, Integer(g_Config.dwHitIntervalTime) - m_nHitSpeed * g_Config.ClientConf.btItemSpeed); //防止负数出错
dwCheckTime := GetTickCount - m_dwAttackTick;
if dwCheckTime < dwAttackTime then begin
if m_dwWalkTick = 0 then
Inc(m_dwAttackCount);
dwDelayTime := dwAttackTime - dwCheckTime;
if dwDelayTime > g_Config.dwDropOverSpeed then begin
if m_dwAttackCount >= 4 then begin
m_dwAttackTick := GetTickCount();
m_dwAttackCount := 0;
dwDelayTime := g_Config.dwDropOverSpeed;
if m_boTestSpeedMode then
SysMsg(sHint5 + IntToStr(dwDelayTime), c_Red, t_Hint);
end else m_dwAttackCount := 0;
Exit;
end else begin
if m_boTestSpeedMode then
SysMsg(sHint6 + IntToStr(dwDelayTime), c_Red, t_Hint);
Exit;
end;
end;
end;
end;
{$IF CATEXCEPTION = TRYEXCEPTION}
nCheckCode := 2;
{$IFEND}
CheckProwlMagic(); //检测是否有潜行
if (nX = m_nCurrX) and (nY = m_nCurrY) or (wIdent = CM_HIT) then begin
Result := True;
m_dwAttackTick := GetTickCount();
if (wIdent = CM_HEAVYHIT) and (m_UseItems[U_WEAPON].Dura > 0) then begin //挖矿
if g_Config.boStartMapEvent then begin
if m_btRaceServer = RC_PLAYOBJECT then StartMapEventOfMine();
end;
if GetFrontPosition(n14, n18) and not m_PEnvir.CanWalk(n14, n18, False) then begin
StdItem := UserEngine.GetStdItem(m_UseItems[U_WEAPON].wIndex);
if (StdItem <> nil) and (StdItem.Shape = 19) then begin
if PileStones(n14, n18) then SendSocket(nil, sSTATUS_DIG);
Dec(m_nHealthTick, 30);
Dec(m_nSpellTick, 50);
m_nSpellTick := _Max(0, m_nSpellTick);
Dec(m_nPerHealth, 2);
Dec(m_nPerSpell, 2);
Exit;
end;
end
end else if (wIdent = CM_HIT) and (m_UseItems[U_WEAPON].Dura > 0) then begin
{$IF CATEXCEPTION = TRYEXCEPTION}
nCheckCode := 3;
{$IFEND}
AttackTarget := GetPoseCreate();
if (AttackTarget <> nil) and not AttackTarget.m_boDeath and not AttackTarget.m_boGhost and (AttackTarget.m_wAppr in [151..155]) then begin
StdItem := UserEngine.GetStdItem(m_UseItems[U_WEAPON].wIndex);
if (StdItem <> nil) and (StdItem.Shape = 39) then begin
if (m_Horse = nil) and (Random(10) = 0) and
((AttackTarget.m_wAppr <> 152) or (IsGuildMaster)) then begin //抓马成功,其中雪龙只有行会掌门才能抓
HorseName := FilterShowName(AttackTarget.m_sCharName);
m_Horse := MakeSlave(HorseName, 0, 0, 100, 24 * 60 * 60, -1);
if m_Horse <> nil then begin
m_btHorseType := AttackTarget.m_wAppr - 150;
if m_PEnvir.MoveToMovingObject(m_Horse.m_nCurrX, m_Horse.m_nCurrY, m_Horse, AttackTarget.m_nCurrX, AttackTarget.m_nCurrY, True) > 0 then begin
m_Horse.m_nCurrX := AttackTarget.m_nCurrX;
m_Horse.m_nCurrY := AttackTarget.m_nCurrY;
m_Horse.m_btDirection := AttackTarget.m_btDirection;
end;
m_Horse.TurnTo(m_btDirection);
SendDefMessage(34977, m_Horse.m_wAppr, 612, 1, 0, '');
SendRefMsg(RM_SITDOWN, m_btDirection, MakeLong(m_nCurrX, m_nCurrY), GetFeatureToLong(Self), 0, '');
AttackTarget.MakeGhost;
ExecuteScript(g_FunctionNPC, '@抓马成功');
end;
Exit;
end;
Exit;
end;
end;
end;
{$IF CATEXCEPTION = TRYEXCEPTION}
nCheckCode := 4;
{$IFEND}
if wIdent = CM_HIT then AttackDir(nil, 0, nDir); //普通攻击0
if wIdent = CM_HEAVYHIT then AttackDir(nil, 1, nDir); //普通攻击1 挖矿
if wIdent = CM_BIGHIT then AttackDir(nil, 2, nDir); //普通攻击2
if wIdent = CM_POWERHIT then AttackDir(nil, 3, nDir); //攻杀剑法
if wIdent = CM_LONGHIT then AttackDir(nil, 4, nDir); //刺杀剑术
if wIdent = CM_WIDEHIT then AttackDir(nil, 5, nDir); //半月弯刀
if wIdent = CM_FIREHIT then AttackDir(nil, 7, nDir); //烈火剑法
if wIdent = CM_CRSHIT then AttackDir(nil, 8, nDir);
if wIdent = CM_TWNHIT then AttackDir(nil, 9, nDir);
// if wIdent = CM_42HIT then AttackDir(nil, 10, nDir);
{$IF CATEXCEPTION = TRYEXCEPTION}
nCheckCode := 5;
{$IFEND}
if wIdent = CM_3026 then begin //战士新技能的攻击包处理:血影刀法\抱月刀\ 残影刀法 破击剑法、破盾斩
case nMagicID of
SKILL_59: AttackDir(nil, 12, nDir); //破击剑法
SKILL_60: AttackDir(nil, 13, nDir); //破盾斩
SKILL_43: AttackDir(nil, 14, nDir); //抱月刀
SKILL_44: AttackDir(nil, 15, nDir); //雷霆剑
SKILL_40: AttackDir(nil, 16, nDir); //残影刀法
SKILL_41: AttackDir(nil, 17, nDir); //血影刀法
SKILL_88: AttackDir(nil, 18, nDir); //强化攻杀
end;
end;
{$IF CATEXCEPTION = TRYEXCEPTION}
nCheckCode := 6;
{$IFEND}
if (m_MagicSkills[SKILL_YEDO] <> nil) and (m_UseItems[U_WEAPON].Dura > 0) then begin
Dec(m_btAttackSkillCount);
if m_btAttackSkillPointCount = m_btAttackSkillCount then begin
m_boPowerHit := True;
SendSocket(nil, '+PWR');
end;
//出刀几率
if m_btAttackSkillCount <= 0 then begin
if g_Config.boUseXMLMagicSkill then begin
//if (m_MagicSkills[SKILL_88] <> nil) then
// m_btAttackSkillCount := g_MagicSkill[SKILL_88].btLv[m_MagicSkills[SKILL_88].btLevel].btVal[5]
//else
m_btAttackSkillCount := g_MagicSkill[SKILL_YEDO].btLv[m_MagicSkills[SKILL_YEDO].btLevel].btVal[13];
end else begin
//if (m_MagicSkills[SKILL_88] <> nil) then
// m_btAttackSkillCount := 10 - _MIN(m_MagicSkills[SKILL_88].btLevel, 3)
//else
m_btAttackSkillCount := 8 - _MIN(m_MagicSkills[SKILL_YEDO].btLevel, 3);
end;
m_btAttackSkillPointCount := Random(m_btAttackSkillCount);
end;
end else if (m_MagicSkills[SKILL_40] <> nil) and (m_UseItems[U_WEAPON].Dura > 0) then begin
Dec(m_btAttackSkillCount);
if m_btAttackSkillPointCount = m_btAttackSkillCount then begin
m_boPowerHit := True;
SendSocket(nil, '+VIS');
end;
if m_btAttackSkillCount <= 0 then begin
if g_Config.boUseXMLMagicSkill then
m_btAttackSkillCount := g_MagicSkill[SKILL_40].btLv[m_MagicSkills[SKILL_40].btLevel].btVal[13]
else
m_btAttackSkillCount := 8 - _MIN(m_MagicSkills[SKILL_40].btLevel, 3);
m_btAttackSkillPointCount := Random(m_btAttackSkillCount);
end;
end else if (m_MagicSkills[SKILL_41] <> nil) and (m_UseItems[U_WEAPON].Dura > 0) then begin
Dec(m_btAttackSkillCount);
if m_btAttackSkillPointCount = m_btAttackSkillCount then begin
m_boPowerHit := True;
SendSocket(nil, '+SHAD');
end;
if m_btAttackSkillCount <= 0 then begin
if g_Config.boUseXMLMagicSkill then
m_btAttackSkillCount := g_MagicSkill[SKILL_41].btLv[m_MagicSkills[SKILL_41].btLevel].btVal[9]
else
m_btAttackSkillCount := 8 - _MIN(m_MagicSkills[SKILL_41].btLevel, 3);
m_btAttackSkillPointCount := Random(m_btAttackSkillCount);
end;
end;
{$IF CATEXCEPTION = TRYEXCEPTION}
nCheckCode := 7;
{$IFEND}
Dec(m_nHealthTick, 30);
Dec(m_nSpellTick, 100);
m_nSpellTick := _Max(0, m_nSpellTick);
Dec(m_nPerHealth, 2);
Dec(m_nPerSpell, 2);
end;
{$IF CATEXCEPTION = TRYEXCEPTION}
except
on E: Exception do begin
MainOutMessage(Format(sExceptionMsg, [nCheckCode]));
MainOutMessage(E.Message);
end;
end;
{$IFEND}
end;
//骑马(CM_HORSERUN 命令的处理)
(*
function TPlayObject.ClientHorseRunXY(wIdent: word; nX, nY: Integer;
boLateDelivery: Boolean; var dwDelayTime: LongWord): Boolean;
var
n14 : Integer;
dwCheckTime : LongWord;
resourcestring
sHint1 = '马跑步忙复位!!!';
sHint2 = '马跑步忙!!!';
begin
Result := False;
dwDelayTime := 0;
Exit;
if not m_boCanRun or (m_wShopItemCount > 0) then Exit;
if not CheckCanOperate(cHorseRun) then Exit;
if (not g_Config.boDisableM2SpeedCtrl) and (not boLateDelivery) then begin
if not CheckActionStatus(wIdent, dwDelayTime) then begin
m_boFilterAction := False;
Exit;
end;
m_boFilterAction := True;
dwCheckTime := GetTickCount - m_dwMoveTick;
if dwCheckTime < g_Config.dwRunIntervalTime then begin
Inc(m_dwMoveCount);
dwDelayTime := g_Config.dwRunIntervalTime - dwCheckTime;
if dwDelayTime > g_Config.dwDropOverSpeed then begin
if m_dwMoveCount >= 4 then begin
m_dwMoveTick := GetTickCount();
m_dwMoveCount := 0;
dwDelayTime := g_Config.dwDropOverSpeed;
if m_boTestSpeedMode then
SysMsg(sHint1 + IntToStr(dwDelayTime), c_Red, t_Hint);
end else m_dwMoveCount := 0;
Exit;
end else begin
if m_boTestSpeedMode then
SysMsg(sHint2 + IntToStr(dwDelayTime), c_Red, t_Hint);
Exit;
end;
end;
end;
m_dwMoveTick := GetTickCount();
m_boMoveSuccess := False;
{$IF USESDK = DEBUG}
SysMsg(Format('当前X:%d 当前Y:%d 目标X:%d 目标Y:%d', [m_nCurrX, m_nCurrY, nX, nY]), c_Green, t_Hint);
{$IFEND}
n14 := GetNextDirection(m_nCurrX, m_nCurrY, nX, nY);
if HorseRunTo(n14, False) then begin
if m_boTransparent and (m_boHideMode) then
m_wStatusTimeArr[STATE_TRANSPARENT] := 1; //004CB212
if m_boMoveSuccess or ((m_nCurrX = nX) and (m_nCurrY = nY)) then
Result := True;
Dec(m_nHealthTick, 60);
Dec(m_nSpellTick, 10);
m_nSpellTick := _Max(0, m_nSpellTick);
Dec(m_nPerHealth);
Dec(m_nPerSpell);
end else begin
m_dwMoveCount := 0;
m_dwMoveCountA := 0;
end;
end;
*)
procedure TPlayObject.ClientInjectPowerToTreasureBox(nPoint: Integer);
var
tm, tm2 : DWORD;
d : TDateTime;
n : Integer;
begin
if (nPoint <= 0) or (m_TreasureBoxItem = nil) then Exit;
if (m_Abil.wNimBusPoint < nPoint) then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, Format('你的灵力不足%d点,无法为灵犀宝盒注入灵力', [nPoint]));
Exit;
end;
Dec(m_Abil.wNimBusPoint, nPoint);
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
tm := MakeLong(MakeWord(m_TreasureBoxItem.btValue[4], m_TreasureBoxItem.btValue[5]), MakeWord(m_TreasureBoxItem.btValue[6], m_TreasureBoxItem.btValue[7]));
tm2 := DateTimeToWolTimeEx(Now);
if (tm2 > tm) then tm := tm2;
n := Round(7 * nPoint / m_TreasureBoxItem.DuraMax);
d := AddDateTimeOfDay(WolTimeToDateTime(tm), n + 1);
tm := DateTimeToWolTimeEx(d); //到期时间
Move(tm, m_TreasureBoxItem.btValue[4], 4);
ClientQueryTreasureBoxItems(False);
SendDefMessage(SM_INFORMATION, 0, 0, 0, 0,
Format('你已经为宝盒注入%d点灵力\(当前灵力可维持宝盒到%s)', [nPoint, FormatDateTime('yyyy-mm-dd hh:mm:ss', d)]));
end;
procedure TPlayObject.ClientInput(nParam1: Integer; Data: string);
var
NPC : TNormNpc;
s18, sLable : string;
nCheckCode : Integer;
begin
nCheckCode := 0;
try
if m_boDeath or m_boGhost then Exit;
if Length(Data) > 500 then Exit;
nCheckCode := 1;
if m_nQueryValIdx in [0..99] then begin
if m_btQueryValType = 1 then //整数型数据保存到M变量中
m_nMval[m_nQueryValIdx] := Str_ToInt(Data, 0)
else begin //字符型变量保存到S变量中
if CheckFilterWords(Data) then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, '输入内容含有非法字符!');
Exit;
end;
m_dyStrVal[m_nQueryValIdx] := Data;
end;
end else begin
m_sQueryData := Data;
end;
if m_sNextLabel = '' then Exit;
nCheckCode := 2;
NPC := UserEngine.FindMerchant(m_QUERYNPC);
if NPC = nil then
NPC := UserEngine.FindNPC(m_QUERYNPC);
if NPC = nil then Exit;
nCheckCode := 3;
if (IsEnvir(NPC.m_PEnvir) and
(abs(NPC.m_nCurrX - m_nCurrX) < 15) and
(abs(NPC.m_nCurrY - m_nCurrY) < 15)) or (NPC.m_boIsHide) then begin
nCheckCode := 4;
if CompareText(m_sNextLabel, sBUILDGUILDNOW) = 0 then begin //建立行会
nCheckCode := 5;
if NPC is TGuildOfficial then
TGuildOfficial(NPC).ReQuestBuildGuild(Self, Data);
end else if CompareText(m_sNextLabel, sSCL_GUILDWAR) = 0 then begin //行会战争
nCheckCode := 6;
if NPC is TGuildOfficial then
TGuildOfficial(NPC).ReQuestGuildWar(Self, Data);
end else if CompareText(m_sNextLabel, sWITHDRAWAL) = 0 then begin //取回金币
nCheckCode := 7;
if NPC.m_Castle = nil then begin
SysMsg('NPC不属于城堡!!!', c_Red, t_Hint);
Exit;
end;
case TUserCastle(NPC.m_Castle).WithDrawalGolds(Self, Str_ToInt(Data, 0))
of
-4: s18 := '输入的金币数不正确!!!';
-3: s18 := '您无法携带更多的东西了。';
-2: s18 := '该城内没有这么多金币.';
-1: s18 := '只有行会 ' + TUserCastle(NPC.m_Castle).m_sOwnGuild + ' 的掌门人才能使用!!!';
1: begin
s18 := '取回金币成功!';
NPC.GotoLable(Self, sMAIN, False);
end;
end;
SendMsg(NPC, RM_MENU_OK, 0, Integer(NPC), 0, 0, s18);
end else if CompareText(m_sNextLabel, sRECEIPTS) = 0 then begin //存放金币
nCheckCode := 8;
if NPC.m_Castle = nil then begin
SysMsg('NPC不属于城堡!!!', c_Red, t_Hint);
Exit;
end;
case TUserCastle(NPC.m_Castle).ReceiptGolds(Self, Str_ToInt(Data, 0)) of
-4: s18 := '输入的金币数不正确!!!';
-3: s18 := '你已经达到在城内存放货物的限制了。';
-2: s18 := '你没有那么多金币.';
-1: s18 := '只有行会 ' + TUserCastle(NPC.m_Castle).m_sOwnGuild + ' 的掌门人才能使用!!!';
1: begin
s18 := '存放金币成功!';
NPC.GotoLable(Self, sMAIN, False);
end;
end;
SendMsg(NPC, RM_MENU_OK, 0, Integer(NPC), 0, 0, s18);
end else begin
nCheckCode := 9;
sLable := m_sNextLabel;
m_sNextLabel := '';
NPC.GotoLable(Self, sLable, False); //其他标签
end;
end;
except
on E: Exception do begin
MainOutMessage(Format('TPlayObject.ClientInput:: nParam1: %d; Data: %s; Lable: %s Code: %d', [nParam1, Data, sLable, nCheckCode]));
MainOutMessage(E.Message);
end;
end;
end;
//炼药
procedure TPlayObject.ClientMakeDrugItem(NPC: TObject; nItemName: string);
//004DCAF8
var
Merchant : TMerchant;
begin
Merchant := UserEngine.FindMerchant(NPC);
if (Merchant = nil) or (not Merchant.m_boMakeDrug) then Exit;
if (IsEnvir(Merchant.m_PEnvir) and
(abs(Merchant.m_nCurrX - m_nCurrX) < 15) and
(abs(Merchant.m_nCurrY - m_nCurrY) < 15)) then
Merchant.ClientMakeDrugItem(Self, nItemName);
end;
//CM_MERCHANTDLGSELECT 选择标签
procedure TPlayObject.ClientMerchantDlgSelect(nParam1: Integer; sMsg: string; nType: Integer);
var
NPC : TNormNpc;
begin
if m_boDeath or m_boGhost then Exit;
// if nParam1 = 0 then begin
// ExecuteScript(g_FunctionNPC, sMsg);
// Exit;
// end;
//通灵塔NPC
case nParam1 of
-6:
begin
{$IF USESDK = DEBUG}
MainOutMessage('通灵塔跳转:' + sMsg);
{$IFEND}
if (g_GuildTowerNPC <> nil) and (sMsg <> '') then g_GuildTowerNPC.UserSelect(Self, Trim(sMsg));
Exit;
end;
-7:
begin
{$IF USESDK = DEBUG}
MainOutMessage('商城活动领奖:' + sMsg);
{$IFEND}
// GetScriptLabel('@VIP每日福利', false);
if (g_WolShopNPC <> nil) and (sMsg <> '') then ExecuteScript(g_WolShopNPC, '@_商城_活动领奖');
Exit;
end;
-12:
begin
{$IF USESDK = DEBUG}
MainOutMessage('时光倒流VIP每日福利:' + sMsg);
{$IFEND}
// GetScriptLabel('@VIP每日福利', false);
if (g_ManageNPC <> nil) and (sMsg <> '') then ExecuteScript(g_ManageNPC, '@_VIP_每日福利');
Exit;
end;
-13:
begin
{$IF USESDK = DEBUG}
MainOutMessage('时光倒流VIP神行千里:' + sMsg);
{$IFEND}
// GetScriptLabel('@VIP神行千里', false);
if (g_ManageNPC <> nil) and (sMsg <> '') then ExecuteScript(g_ManageNPC, '@_VIP_神行千里');
Exit;
end;
-14:
begin
{$IF USESDK = DEBUG}
MainOutMessage('时光倒流VIP神龙之魂:' + sMsg);
{$IFEND}
// GetScriptLabel('@VIP神龙之魂', false);
if (g_ManageNPC <> nil) and (sMsg <> '') then ExecuteScript(g_ManageNPC, '@_VIP_神龙之魂');
Exit;
end;
-15:
begin
{$IF USESDK = DEBUG}
MainOutMessage('未知:' + sMsg);
{$IFEND}
// GetScriptLabel('@未知', false);
if (g_FunctionNPC <> nil) and (sMsg <> '') then ExecuteScript(g_FunctionNPC, '@未知');
Exit;
end;
-16:
begin
{$IF USESDK = DEBUG}
MainOutMessage('战斗力:' + sMsg);
{$IFEND}
m_BattleVal.BattleVal := m_BattleVal.nMinVal[0] + m_BattleVal.nMinVal[1] +
m_BattleVal.nMinVal[2] + m_BattleVal.nMinVal[3] + m_BattleVal.nMinVal[4];
SendDefMessage(SM_BATTLEVAL, Integer(Self), m_BattleVal.BattleVal, 0, 0,
EnCodeBuffer(@m_BattleVal, SizeOf(TBattleData)), True);
if (g_ManageNPC <> nil) and (sMsg <> '') then
begin
if nType > 0 then
ExecuteScript(g_ManageNPC, '@_战斗力_HOME')
else
g_ManageNPC.UserSelect(self, sMsg);
end;
Exit;
end;
else
begin
{$IF USESDK = DEBUG}
MainOutMessage('Code: ' + inttostr(nParam1) + '其他NPC跳转:' + sMsg);
{$IFEND}
end;
end;
NPC := UserEngine.FindMerchant(TObject(nParam1));
if NPC = nil then NPC := UserEngine.FindNPC(TObject(nParam1));
if NPC = nil then Exit;
if (IsEnvir(NPC.m_PEnvir) and
(abs(NPC.m_nCurrX - m_nCurrX) < 15) and
(abs(NPC.m_nCurrY - m_nCurrY) < 15)) or (NPC.m_boIsHide) then
NPC.UserSelect(Self, Trim(sMsg));
end;
//计算商品价格
procedure TPlayObject.ClientMerchantQuerySellPrice(nParam1, nMakeIndex: Integer;
sMsg: string);
var
i : Integer;
UserItem : pTUserItem;
UserItem18 : pTUserItem;
Merchant : TMerchant;
sName : string;
begin
UserItem18 := nil;
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[i];
if UserItem.MakeIndex = nMakeIndex then begin
//取自定义物品名称
sName := '';
ItemUnit.GetCustomItemName(UserItem, sName);
if (CompareText(sMsg, sName) = 0) then begin
UserItem18 := UserItem;
Break;
end;
end;
end;
if UserItem18 = nil then begin
SendDefMessage(618, nMakeIndex, 1, 0, 0, '');
Exit;
end;
Merchant := UserEngine.FindMerchant(TObject(nParam1));
if Merchant = nil then Exit;
if (IsEnvir(Merchant.m_PEnvir) and
(Merchant.m_boSell) and
(abs(Merchant.m_nCurrX - m_nCurrX) < 15) and
(abs(Merchant.m_nCurrY - m_nCurrY) < 15)) then
Merchant.ClientQuerySellPrice(Self, UserItem18);
end;
procedure TPlayObject.ClientNamedStore(nParam1: Integer; nMakeIndex: Integer);
var
NPC : TNormNpc;
i, j : Integer;
UserItem : pTUserItem;
StdItem : pTStdItem;
retMsg, sLable : string;
tm : DWORD;
label
return;
begin
retMsg := '';
if m_boDeath or m_boGhost then goto return;
NPC := UserEngine.FindMerchant(TObject(nParam1));
if NPC = nil then NPC := UserEngine.FindNPC(TObject(nParam1));
if (NPC = nil) and not (m_nSpotDlgMode in [100..112, 200, 201, 202]) then
Exit;
sLable := m_sNextLabel;
m_sNextLabel := '';
if (m_nSpotDlgMode in [100..112, 200, 201, 202]) or
((IsEnvir(NPC.m_PEnvir) and
(abs(NPC.m_nCurrX - m_nCurrX) < 15) and
(abs(NPC.m_nCurrY - m_nCurrY) < 15)) or (NPC.m_boIsHide)) then begin
for i := m_ItemList.Count - 1 downto 0 do begin
UserItem := pTUserItem(m_ItemList.Items[i]);
if UserItem.MakeIndex = nMakeIndex then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if (StdItem = nil) then goto return;
if (m_nSpotDlgMode = 0) and (StdItem.StdMode = 3) and ((StdItem.Shape = 15) or ((StdItem.Shape = 17) and ((StdItem.Looks = 729) or (StdItem.Looks = 942)))) then begin //记录回城点
for j := 0 to 11 do
UserItem.btValue[j] := 0;
UserItem.btValue[0] := LoByte(m_nStoreX);
UserItem.btValue[1] := HiByte(m_nStoreX);
UserItem.btValue[2] := LoByte(m_nStoreY);
UserItem.btValue[3] := HiByte(m_nStoreY);
for j := 1 to _MIN(11, Length(m_sStoreName)) do
UserItem.btValue[j + 3] := byte(m_sStoreName[j]);
//更新物品
SendUpdateItem(UserItem);
if (sLable <> '') then
NPC.GotoLable(Self, sLable, False);
end else if (m_nSpotDlgMode = 1) and (StdItem.StdMode = 45) and
(StdItem.AniCount in [1..5]) then begin //宝石仓库
//检查宝石仓库容量
if m_wGemCount[StdItem.AniCount - 1] >= 200 then begin
retMsg := '仓库中已经有200颗这种宝石了,无法放下更多的宝石!';
goto return;
end;
Inc(m_wGemCount[StdItem.AniCount - 1]);
SendDefMessage(SM_STORAGE_OK, 0, 0, 0, 0, ''); //0419
if StdItem.boGameLog = 1 then
AddGameDataLog('1' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
StdItem.Name + #9 +
IntToStr(UserItem.MakeIndex) + #9 +
'1' + #9 +
'0');
if (sLable <> '') and (NPC <> nil) then
NPC.GotoLable(Self, sLable, False);
Dispose(UserItem);
m_ItemList.Delete(i);
WeightChanged();
end else if (m_nSpotDlgMode = 3) and (StdItem.StdMode = 33) and (StdItem.Shape = 0) then begin //绑马牌
if m_btSetHorseType > 0 then begin
if UserItem.btValue[0] <> 0 then begin
retMsg := '你提供的马牌不是空的马牌。';
Break;
end;
end else if UserItem.btValue[0] = 0 then begin
retMsg := '你提供的马牌是空的马牌,不需要清空。';
Break;
end;
for j := 0 to 12 do
UserItem.btValue[j] := 0;
UserItem.btValue[0] := m_btSetHorseType;
if m_btSetHorseType > 0 then
for j := 1 to Length(m_sHorseName) do
UserItem.btValue[j] := byte(m_sHorseName[j]);
UserItem.Dura := UserItem.DuraMax;
SendUpdateItem(UserItem);
if (sLable <> '') and (NPC <> nil) then
NPC.GotoLable(Self, sLable, False);
end else if (m_nSpotDlgMode = 4) and (StdItem.StdMode = 33) and (StdItem.Shape = 0) then begin //修理马牌
if UserItem.btValue[0] = 0 then begin
retMsg := '你提供的马牌是空马牌。';
Break;
end;
UserItem.Dura := UserItem.DuraMax;
SendUpdateItem(UserItem);
if (sLable <> '') then
NPC.GotoLable(Self, sLable, False);
end else if (m_nSpotDlgMode = 6) then begin //任意物品 ,触发当前NPC中的[@物品名称]脚本标签
try
m_sStoreName := StdItem.Name; //保存物品名字
m_nStoreMakeIndex := nMakeIndex;
m_sScriptParam[0] := StdItem.Name;
m_sScriptParam[1] := IntToStr(nMakeIndex);
if not NPC.GotoLable(Self, '@' + StdItem.Name, False) then
if sLable <> '' then begin
m_sNextLabel := sLable;
NPC.GotoLable(Self, sLable, False);
end;
except
end;
end else
retMsg := '你提供的物品不正确。';
sLable := '';
Break;
end;
end;
end;
return:
SendMsg(nil, $9590, 1, $FF, 0, 0, retMsg);
end;
procedure TPlayObject.ClientOpenDoor(nX, nY: Integer); //004DABD4
var
Door : pTDoorInfo;
Castle : TUserCastle;
begin
Door := m_PEnvir.GetDoor(nX, nY);
if Door = nil then Exit;
Castle := g_CastleManager.IsCastleEnvir(m_PEnvir);
if (Castle = nil) or
(Castle.m_DoorStatus <> Door.Status) or
(m_btRaceServer <> RC_PLAYOBJECT) or
Castle.CheckInPalace(m_nCurrX, m_nCurrY, Self) then begin
UserEngine.OpenDoor(m_PEnvir, nX, nY);
end;
end;
//行会
procedure TPlayObject.ClientOpenGuildDlg; //004DE8E0
var
i : Integer;
SC : string;
begin
if m_MyGuild <> nil then begin
SC := TGuild(m_MyGuild).sGuildName + #13 + ' ' + #13;
if m_nGuildRankNo = 1 then begin
SC := SC + '1' + #13;
end else begin
SC := SC + '0' + #13;
end;
SC := SC + '<Notice>' + #13;
for i := 0 to TGuild(m_MyGuild).NoticeList.Count - 1 do begin
if Length(SC) > 5000 then Break;
SC := SC + TGuild(m_MyGuild).NoticeList.Strings[i] + #13;
end; // for
SC := SC + '<KillGuilds>' + #13;
for i := 0 to TGuild(m_MyGuild).m_GuildWarList.Count - 1 do begin
if Length(SC) > 5000 then Break;
SC := SC + TGuild(m_MyGuild).m_GuildWarList.Keys[i] + #13;
end; // for
SC := SC + '<AllyGuilds>' + #13;
for i := 0 to TGuild(m_MyGuild).m_GuildAllList.Count - 1 do begin
if Length(SC) > 5000 then Break;
SC := SC + TGuild(m_MyGuild).m_GuildAllList.Keys[i] + #13;
end; // for
m_defMsg := MakeDefaultMsg(SM_OPENGUILDDLG, 0, 0, 0, 1);
SendSocket(@m_defMsg, EnCodeString(SC));
end else begin
SendDefMessage(SM_OPENGUILDDLG_FAIL, 0, 0, 0, 0, '');
end;
end;
procedure TPlayObject.ClientOpenHuanjing(nItemIdx: Integer; nOpCode: Integer; nCount: Integer);
var
i, j : Integer;
Huanjing, UserItem : pTUserItem;
StdItem : pTStdItem;
tm : DWORD;
boFind : Boolean;
begin
{点领取剩余奖励: Ident 34980 Param 0 P1 1073750150 P2 6 P3 0 Msg
点注入10点: Ident 34980 Param 0 P1 1073750150 P2 4 P3 10 Msg
镶嵌蓝宝:nItemIdx: 1073750152(蓝宝ID); sItemName: ;nPackIdx: 1073750150(幻镜ID) }
//找到幻镜:
if (m_nHuanjingIdx <> 0) and (m_nHuanjingIdx <> nItemIdx) then Exit;
Huanjing := nil;
for i := 0 to m_ItemList.Count - 1 do begin
if pTUserItem(m_ItemList[i]).MakeIndex = nItemIdx then begin
Huanjing := pTUserItem(m_ItemList[i]);
Break;
end;
end;
if Huanjing = nil then Exit;
case nOpCode of
1: begin //双击打开
if Huanjing.Dura > 0 then begin
SendDefMessage(34980, nItemIdx, 513, 300, 3000, '');
SendDefMessage(34980, nItemIdx, 769, 300, 3000, '');
Exit;
end else begin
SendDefMessage(34980, nItemIdx, 513, 300, 3000, '');
Exit;
end;
end;
4: begin //注入灵力
j := 0;
for i := m_ItemList.Count - 1 downto 0 do begin
UserItem := pTUserItem(m_ItemList[i]);
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if (StdItem <> nil) and (StdItem.StdMode = 3) and (StdItem.Shape in [202, 203]) then begin
if StdItem.Shape = 202 then begin
Dec(nCount);
SendDelItems(UserItem);
Dispose(UserItem);
m_ItemList.Delete(i);
WeightChanged;
Inc(j);
end else begin
if UserItem.Dura >= nCount then begin //持久大于等于 数值
Dec(UserItem.Dura, nCount);
Inc(j, nCount);
Dec(nCount, nCount);
end else begin
Inc(j, UserItem.Dura);
Dec(nCount, UserItem.Dura); //增加点数
UserItem.Dura := 0;
end;
if UserItem.Dura <= 0 then begin
SendDelItems(UserItem);
Dispose(UserItem);
m_ItemList.Delete(i);
WeightChanged;
end else
SendUpdateItem(UserItem);
end;
if nCount <= 0 then Break;
end;
end;
Inc(Huanjing.Dura, j);
if Huanjing.btValue[1] = 0 then begin //开启时间,也就是最后领奖时间
tm := DateTimeToWolTIme(Now);
Huanjing.btValue[2] := LoByte(LoWord(tm));
Huanjing.btValue[3] := HiByte(LoWord(tm));
Huanjing.btValue[4] := LoByte(HiWord(tm));
Huanjing.btValue[5] := HiByte(HiWord(tm));
end;
m_nHuanjingIdx := nItemIdx;
m_dwHuanjingTick := GetTickCount;
SendUpdateItem(Huanjing);
SendDefMessage(34980, nItemIdx, 769, 300, 3000, '');
SysMsg('你已成功为天关幻镜注入了' + IntToStr(j) + '个灵符的灵力', c_Red, t_Hint);
if nCount = 0 then begin
SysMsg('灵符的灵力使幻镜映射出无穷的宝藏,但如果灵力耗尽幻镜就会立刻碎裂', c_Red, t_Hint);
end;
end;
6: begin
if (Huanjing.Dura = 0) or ((Huanjing.btValue[1] = 1) and
(Huanjing.btValue[6] = 1)) then begin //破碎后还可以领一次
SysMsg('天关幻镜中没有累积的奖励可以领取', c_Red, t_Hint);
Exit;
end;
//检查时间间隔
tm := MakeLong(MakeWord(Huanjing.btValue[2], Huanjing.btValue[3]),
MakeWord(Huanjing.btValue[4], Huanjing.btValue[5]));
if tm + g_Config.nHuanjingGetGift <= DateTimeToWolTIme(Now) then begin
if g_FunctionNPC <> nil then begin
if tm = 0 then
m_sScriptParam[0] := '1'
else
m_sScriptParam[0] := IntToStr((DateTimeToWolTIme(Now) - tm + 1) div
g_Config.nHuanjingGetGift);
m_sScriptParam[1] := IntToStr(Huanjing.Dura); //幻境灵力
m_sScriptParam[2] := IntToStr(Huanjing.btValue[1]);
//幻境状态 0正常 1破碎
m_sScriptParam[3] := m_PEnvir.m_sMapName; //地图名
m_sScriptParam[4] := IntToStr(Huanjing.btValue[0]);
//幻境镶嵌宝石类型 1 2 3 表示 0普通幻境
m_sScriptParam[5] := IntToStr(Huanjing.MakeIndex); //幻境ID
ExecuteScript(g_FunctionNPC, '@天关幻镜奖励');
tm := DateTimeToWolTIme(Now);
Huanjing.btValue[2] := LoByte(LoWord(tm));
Huanjing.btValue[3] := HiByte(LoWord(tm));
Huanjing.btValue[4] := LoByte(HiWord(tm));
Huanjing.btValue[5] := HiByte(HiWord(tm));
if (Huanjing.btValue[1] = 1) and (Huanjing.btValue[6] = 0) then
Huanjing.btValue[6] := 1;
end;
end else begin
SysMsg('无法连续领取天关幻镜中奖励,请过会再来领取', c_Red, t_Hint);
{$IF USESDK = DEBUG}
SysMsg('上次时间:' + IntToStr(tm) + ',当前时间:' + IntToStr(DateTimeToWolTIme(Now)), c_Red, t_Hint);
{$IFEND}
end;
end;
260: begin
if m_nGameGold >= nCount then begin
Inc(Huanjing.Dura, nCount);
if Huanjing.btValue[1] = 0 then begin //开启时间,也就是最后领奖时间
tm := DateTimeToWolTIme(Now);
Huanjing.btValue[2] := LoByte(LoWord(tm));
Huanjing.btValue[3] := HiByte(LoWord(tm));
Huanjing.btValue[4] := LoByte(HiWord(tm));
Huanjing.btValue[5] := HiByte(HiWord(tm));
end;
SendUpdateItem(Huanjing);
//SendDefMessage(34980, nItemIdx, 513, 300, 3000, '');
SendDefMessage(34980, nItemIdx, 769, 300, 3000, '');
SysMsg('你已成功为天关幻镜注入了' + IntToStr(nCount) + '个灵符的灵力', c_Red, t_Hint);
SysMsg('灵符的灵力使幻镜映射出无穷的宝藏,但如果灵力耗尽幻镜就会立刻碎裂', c_Red, t_Hint);
Dec(m_nGameGold, nCount); //元宝减少
Inc(m_nGamePoint, nCount); //积分增加
GameGoldChanged;
m_nHuanjingIdx := nItemIdx;
m_dwHuanjingTick := GetTickCount;
end;
end;
end;
end;
function TPlayObject.ClientOpPneumaBagItem(sData: string): Boolean;
var
OpInfo : TPneumaItem;
UserItem : pTUserItem;
i, ii : Integer;
StdItem : pTStdItem;
resourcestring
sHint1 = '宝盒物品不能给元神分身';
sHint2 = '该物品不能放入元神分身的包裹';
sHint3 = '元神分身包裹里的东西太多或者负重不够';
sHint4 = '玩家包裹里的东西太多或者负重不够';
begin
Result := False;
if sData = '' then Exit;
if m_boGhost or m_boDeath then Exit;
if (m_PneumaObject = nil) or m_PneumaObject.m_boGhost or
m_PneumaObject.m_boDeath then Exit;
DeCodeBuffer(sData, @OpInfo, SizeOf(TPneumaItem));
if Integer(m_PneumaObject) <> OpInfo.nChrID then Exit;
if (OpInfo.btFlag = 1) then begin //移动物品到元神包裹
for i := m_ItemList.Count - 1 downto 0 do begin
UserItem := m_ItemList.Items[i];
if (UserItem <> nil) and (UserItem.MakeIndex = OpInfo.nMakeIndex) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem = nil then Break;
{物品控制-禁止放入元神包裹}
if CheckSPCode(StdItem.SPCode, SP_DISABLEINPNEUMABAG) then begin
SysMsg(sHint2, c_Red, t_Hint);
Break;
end;
{已放出豹禁止放入元神包裹}
if IsDownPetItem(UserItem.MakeIndex) then begin
Break;
end;
if TPlayObject(m_PneumaObject).IsEnoughBag and
TPlayObject(m_PneumaObject).IsAddWeightAvailable(UserEngine.GetStdItemWeight(UserItem.wIndex)) then begin
m_ItemList.Delete(i);
SendDelItems(UserItem);
m_PneumaObject.m_ItemList.Add(UserItem);
TPlayObject(m_PneumaObject).SendAddItem(UserItem);
Result := True;
WeightChanged();
TPlayObject(m_PneumaObject).WeightChanged;
end else begin
SysMsg(sHint3, c_Red, t_Hint);
end;
Break;
end;
end;
end else if (OpInfo.btFlag = 0) then begin //元神包裹中的物品移动到人物
for i := m_PneumaObject.m_ItemList.Count - 1 downto 0 do begin
UserItem := m_PneumaObject.m_ItemList.Items[i];
if (UserItem <> nil) and (UserItem.MakeIndex = OpInfo.nMakeIndex) then begin
if IsEnoughBag and
IsAddWeightAvailable(UserEngine.GetStdItemWeight(UserItem.wIndex)) then begin
m_PneumaObject.m_ItemList.Delete(i);
TPlayObject(m_PneumaObject).SendDelItems(UserItem);
m_ItemList.Add(UserItem);
SendAddItem(UserItem);
Result := True;
WeightChanged();
TPlayObject(m_PneumaObject).WeightChanged;
end else begin
SysMsg(sHint4, c_Red, t_Hint);
end;
Break;
end;
end;
end;
if Result then
OpInfo.btOpCode := 1
else
OpInfo.btOpCode := 0;
m_defMsg := MakeDefaultMsg(SM_9608, Integer(Self), 0, 0, 0);
SendSocket(@m_defMsg, EnCodeBuffer(@OpInfo, SizeOf(TPneumaItem)));
// UserEngine.SaveHumanRcd(Self);
// UserEngine.SaveHumanRcd(TPlayObject(m_PneumaObject));
end;
function TPlayObject.ClientOpPneumaGold(sData: string): Boolean;
var
OpInfo : TPneumaItem;
resourcestring
sHint1 = '你没有这么多钱';
sHint2 = '你的分身没有这么多钱';
begin
Result := False;
if sData = '' then Exit;
if m_boGhost or m_boDeath then Exit;
if (m_PneumaObject = nil) or m_PneumaObject.m_boGhost or
m_PneumaObject.m_boDeath then Exit;
DeCodeBuffer(sData, @OpInfo, SizeOf(TPneumaItem));
if (Integer(m_PneumaObject) <> OpInfo.nChrID) or (OpInfo.nMakeIndex <= 0) then
Exit;
if (OpInfo.btFlag = 1) then begin //移动金币到元神包裹
if OpInfo.nMakeIndex <= m_nGold then begin
if TPlayObject(m_PneumaObject).IncGold(OpInfo.nMakeIndex) then begin
TPlayObject(m_PneumaObject).GoldChanged;
DecGold(OpInfo.nMakeIndex);
GoldChanged;
Result := True;
end else
TPlayObject(m_PneumaObject).SysMsg(g_sYourGoldLargeThenLimit, c_Red, t_Hint);
end else
SysMsg(sHint1, c_Red, t_Hint);
end else if (OpInfo.btFlag = 0) then begin //元神包裹中的金币移动到人物
if OpInfo.nMakeIndex <= TPlayObject(m_PneumaObject).m_nGold then begin
if IncGold(OpInfo.nMakeIndex) then begin
GoldChanged;
TPlayObject(m_PneumaObject).DecGold(OpInfo.nMakeIndex);
TPlayObject(m_PneumaObject).GoldChanged;
Result := True;
end else
SysMsg(g_sYourGoldLargeThenLimit, c_Red, t_Hint);
end else
SysMsg(sHint2, c_Red, t_Hint);
end;
end;
procedure TPlayObject.ClientPersonalSet(Parm1, Parm2, Parm3: Word; sMsg: string);
var
StyleConfig : TConfigStyle;
resourcestring
sHint = '1分钟内只能设置一次';
sOK = '设置成功';
begin
if GetTickCount < m_dwLastPersonalSetTick + 60 * 1000 then begin
SysMsg(sHint, c_Red, t_Hint);
end else begin
m_dwLastPersonalSetTick := GetTickCount;
DeCodeBuffer(sMsg, @StyleConfig, SizeOf(TConfigStyle));
m_sTmpRank := StyleConfig.chTempRank;
m_sPersonalSign := StyleConfig.chStyleName; //UserEngine.m_PersonSignIni.WriteString(m_sCharName, 'Sign', m_sPersonalSign);
//参数3是几个选择项
m_wPersonalCode := Parm1;
SysMsg(sOK, c_Green, t_Hint);
SendDefMessage(SM_PERSONALSIGN, Integer(Self), 1, 0, m_wPersonalCode, m_sPersonalSign);
SendDefMessage(SM_PERSONALSIGN, Integer(Self), 3, 1, 0, '');
if m_sTmpRank <> '' then SendDefMessage(SM_PERSONALSIGN, Integer(Self), 2, 0, 0, m_sTmpRank);
RefShowName;
FeatureChanged;
m_sScriptParam[0] := m_sTmpRank;
ExecuteScript(g_ManageNpc, '@封号_个性设置');
end;
end;
//凤凰探宝
procedure TPlayObject.ClientPhoenixSearch(nPetItem, nParm2: Integer);
var
tm, tm1 : LongWord;
UserItem : pTUserItem;
begin
GetUserItemByMakeIndex(nPetItem, UserItem);
if UserItem = nil then Exit;
m_sScriptParam[0] := IntToStr(nPetItem);
case nParm2 of
0: begin //探宝
if (m_Pet = nil) then Exit;
if m_PetInfo[0].nMakeIndex <> nPetItem then Exit;
m_Pet.SendRefMsg(RM_510, 1, 0, 108, 0, ''); //凤凰消失
m_PetInfo[4] := m_PetInfo[0];
PetHide(m_PetInfo[0].nMakeIndex);
SendPetInfo($09);
//记录探宝的时间
tm := DateTimeToWolTIme(Now);
UserItem.btItemExt[6] := LoByte(LoWord(tm));
UserItem.btItemExt[7] := HiByte(LoWord(tm));
UserItem.btItemExt[8] := LoByte(HiWord(tm));
UserItem.btItemExt[9] := HiByte(HiWord(tm));
ExecuteScript(g_ManageNPC, '@凤凰探宝');
end;
1: begin //召唤 - 计算探宝的时间
//检查时间间隔
tm := MakeLong(MakeWord(UserItem.btItemExt[6], UserItem.btItemExt[7]), MakeWord(UserItem.btItemExt[8], UserItem.btItemExt[9]));
tm1 := MakeLong(MakeWord(UserItem.btValue[0], UserItem.btValue[1]), MakeWord(UserItem.btValue[2], UserItem.btValue[3]));
tm1 := tm1 + 86400 * 4; //饥饿
tm := _MIN(DateTimeToWolTIme(Now), tm1) - tm; //取最小的时间间隔
UserItem.btItemExt[6] := LoByte(LoWord(tm));
UserItem.btItemExt[7] := HiByte(LoWord(tm));
UserItem.btItemExt[8] := LoByte(HiWord(tm));
UserItem.btItemExt[9] := HiByte(HiWord(tm));
//刷新石头状态
m_defMsg := MakeDefaultMsg(34977, 0, 100, 0, 0);
SendSocket(@m_defMsg, EnCodeBuffer(@nPetItem, 4));
m_PetInfo[4].nMakeIndex := 0;
m_PetInfo[4].wLevel := 0;
m_PetInfo[4].btType := 0;
m_PetInfo[4].btReLive := 0;
end;
2: begin //领宝
//检查时间间隔
tm := MakeLong(MakeWord(UserItem.btItemExt[12], UserItem.btItemExt[13]), MakeWord(UserItem.btItemExt[14], UserItem.btItemExt[15]));
if tm + g_Config.nPhoenixGetGift <= DateTimeToWolTIme(Now) then begin
if g_ManageNPC <> nil then begin
//获取探宝时间秒数
tm := MakeLong(MakeWord(UserItem.btItemExt[6], UserItem.btItemExt[7]), MakeWord(UserItem.btItemExt[8], UserItem.btItemExt[9]));
m_sScriptParam[1] := IntToStr(tm div 60); //返回分钟
ExecuteScript(g_ManageNPC, '@凤凰领宝');
tm := DateTimeToWolTIme(Now);
UserItem.btItemExt[12] := LoByte(LoWord(tm));
UserItem.btItemExt[13] := HiByte(LoWord(tm));
UserItem.btItemExt[14] := LoByte(HiWord(tm));
UserItem.btItemExt[15] := HiByte(HiWord(tm));
end;
end else begin
SysMsg('无法连续领取凤凰探宝的奖励,请过会再来领取', c_Red, t_Hint);
{$IF USESDK = DEBUG}
SysMsg('上次时间:' + IntToStr(tm) + ',当前时间:' + IntToStr(DateTimeToWolTIme(Now)), c_Red, t_Hint);
{$IFEND}
end;
end;
end;
end;
function TPlayObject.ClientPickUpItem(nX, nY, nType: Integer): Boolean;
//捡物品
function IsSelf(BaseObject: TBaseObject): Boolean;
begin
Result := (BaseObject = nil) or (Self = BaseObject) or (BaseObject.m_Master = Self) or (BaseObject.m_PneumaObject = Self);
end;
function IsOfGroup(BaseObject: TBaseObject): Boolean;
var
i : Integer;
GroupMember, ItemOfCreat : TBaseObject;
begin
Result := False;
//如果是元神
if (m_btRaceServer = RC_PLAYOBJECT) and m_boPneuma and (m_PneumaObject <> nil) then begin
m_GroupOwner := m_PneumaObject.m_GroupOwner;
end;
ItemOfCreat := BaseObject;
if (BaseObject <> nil) and (BaseObject.m_btRaceServer = RC_PLAYOBJECT) and (BaseObject.m_boPneuma) and (BaseObject.m_PneumaObject <> nil) then begin
ItemOfCreat := BaseObject.m_PneumaObject;
end;
if m_GroupOwner = nil then Exit;
for i := 0 to m_GroupOwner.m_GroupMembers.Count - 1 do begin
GroupMember := TBaseObject(m_GroupOwner.m_GroupMembers.Objects[i]);
if GroupMember = ItemOfCreat then begin
Result := True;
Break;
end;
end;
end;
var
UserItem : pTUserItem;
MapItem : pTMapItem;
StdItem : pTStdItem;
resourcestring
sHint1 = '上古神魔的力量慢慢弱去,你的身体恢复正常。';
sHint2 = '来自上古的神魔赐予了你一股神奇的力量';
sHint3 = '你获得了秒杀的神力';
sHint4 = '被激发的神魔秒杀结界,将帮助你杀怪物时的攻击力大增';
sHint5 = '神力将持续%d分钟……';
sHint6 = '你获得了重击的神力';
sHint7 = '被激发的神魔重击结界,将帮助你有机会秒杀怪物';
sHint8 = '你获得了神御的神力';
sHint9 = '被激发的神魔防御结界,将帮助你抵御怪物的攻击';
sHint10 = '你获得了神佑的神力';
sHint11 = '神魔的眷顾可能让你在%d分钟内获得双倍的经验';
sHint12 = '进入炼狱更有可能获得三倍……';
begin
Result := False;
if m_boPneuma and (m_boPneumaEffMode) then Exit; //灵珠状态不能拾取物品
if m_boDealing or (m_wShopItemCount > 0) then Exit;
MapItem := m_PEnvir.GetItem(nX, nY);
if MapItem = nil then Exit;
//物品在2分钟之内不允许其他人捡
if (GetTickCount - MapItem.dwCanPickUpTick) > g_Config.dwFloorItemCanPickUpTime {2 * 60 * 1000} then begin
MapItem.OfBaseObject := nil;
end;
//宝物在冻结状态下不能拾取,请耐心等待冻结时间消失
if (MapItem.OfBaseObject = g_FunctionNPC) then begin
if (m_btRaceServer = RC_PLAYOBJECT) then
SysMsg(g_sCanPickUpItemByFreeze {'宝物在冻结状态下不能拾取,请耐心等待冻结时间消失!'}, c_Red, t_Hint);
Exit;
end;
//检查物品的主人
if not IsSelf(TBaseObject(MapItem.OfBaseObject)) and not IsOfGroup(TBaseObject(MapItem.OfBaseObject)) then begin
if (m_btRaceServer = RC_PLAYOBJECT) then
SysMsg(g_sCanotPickUpItem {'在一定时间以内无法捡起此物品!!!'}, c_Red, t_Hint);
Exit;
end;
//脚本参数入口
m_sScriptParam[21] := IntToStr(MapItem.UserItem.MakeIndex);
m_sScriptParam[22] := MapItem.Name;
m_sScriptParam[23] := IntToStr(MapItem.btDropBaseRace);
m_sScriptParam[24] := MapItem.sDropBaseNams;
m_sScriptParam[25] := IntToStr(nType); //是否豹子拾取
//捡金币
if CompareText(MapItem.Name, sSTRING_GOLDNAME) = 0 then begin
if m_PEnvir.DeleteFromMap(nX, nY, OS_ITEMOBJECT, TObject(MapItem)) = 1 then begin
if IncGold(MapItem.Count) then begin
SendRefMsg(RM_ITEMHIDE, 0, Integer(MapItem), nX, nY, ''); //物品消失
if g_boGameLogGold then
AddGameDataLog('4' + #9 +
m_sMapName + #9 +
IntToStr(nX) + #9 +
IntToStr(nY) + #9 +
m_sCharName + #9 +
sSTRING_GOLDNAME + #9 +
IntToStr(MapItem.Count) + #9 +
'1' + #9 +
'0');
GoldChanged;
Dispose(MapItem);
end else
m_PEnvir.AddToMap(nX, nY, OS_ITEMOBJECT, TObject(MapItem));
end;
if g_Config.boStartMapEvent and (m_btRaceServer = RC_PLAYOBJECT) then begin
StartMapEventOfPickUpItem(sSTRING_GOLDNAME);
end;
Exit;
end;
//绑定金币
if CompareText(MapItem.Name, sSTRING_BINDGOLDNAME) = 0 then begin
if m_PEnvir.DeleteFromMap(nX, nY, OS_ITEMOBJECT, TObject(MapItem)) = 1 then begin
if IncBindGold(MapItem.Count) then begin
SendRefMsg(RM_ITEMHIDE, 0, Integer(MapItem), nX, nY, ''); //物品消失
if g_boGameLogGold then
AddGameDataLog('4' + #9 +
m_sMapName + #9 +
IntToStr(nX) + #9 +
IntToStr(nY) + #9 +
m_sCharName + #9 +
sSTRING_BINDGOLDNAME + #9 +
IntToStr(MapItem.Count) + #9 +
'1' + #9 +
'0');
GoldChanged(1);
Dispose(MapItem);
end else
m_PEnvir.AddToMap(nX, nY, OS_ITEMOBJECT, TObject(MapItem));
end;
if g_Config.boStartMapEvent and (m_btRaceServer = RC_PLAYOBJECT) then begin
StartMapEventOfPickUpItem(sSTRING_BINDGOLDNAME);
end;
Exit;
end;
//捡到附身物品
StdItem := UserEngine.GetStdItem(MapItem.UserItem.wIndex);
if (StdItem <> nil) then begin
if (StdItem.StdMode = 57) and (m_btRaceServer = RC_PLAYOBJECT) and (nType = 0) then begin
if m_PEnvir.DeleteFromMap(nX, nY, OS_ITEMOBJECT, TObject(MapItem)) = 1 then begin
if m_wFushen > 0 then
SysMsg(sHint1, c_Red, t_Hint);
m_wFushen := StdItem.Shape;
m_dwFushenTime := StdItem.AniCount * 60000;
m_dwFushenTick := GetTickCount;
m_nMagicStatus := GetMagicStatus();
Status2Changed();
SysMsg(sHint2, c_Red, t_Hint);
case StdItem.Shape of
1: begin
SysMsg(sHint3, c_Red, t_Hint);
SysMsg(sHint4, c_Red, t_Hint);
SysMsg(Format(sHint5, [StdItem.AniCount]), c_Red, t_Hint);
end;
2: begin
SysMsg(sHint6, c_Red, t_Hint);
SysMsg(sHint7, c_Red, t_Hint);
SysMsg(Format(sHint5, [StdItem.AniCount]), c_Red, t_Hint);
end;
3: begin
SysMsg(sHint8, c_Red, t_Hint);
SysMsg(sHint9, c_Red, t_Hint);
SysMsg(Format(sHint5, [StdItem.AniCount]), c_Red, t_Hint);
end;
4: begin
SysMsg(sHint10, c_Red, t_Hint);
SysMsg(Format(sHint11, [StdItem.AniCount]), c_Red, t_Hint);
SysMsg(sHint12, c_Red, t_Hint);
end;
end;
SendMsg(Self, RM_ITEMHIDE, 0, Integer(MapItem), nX, nY, '');
Dispose(MapItem);
Result := True;
end;
if g_Config.boStartMapEvent then begin
StartMapEventOfPickUpItem(StdItem.Name);
end;
Exit;
end;
//禁止包裹重复
if CheckSPCode(StdItem.SPCode, SP_DISABLEDUPLICATE) then begin
if GetUserItemByIdx(MapItem.UserItem.wIndex, UserItem) <> -1 then begin
if (m_btRaceServer = RC_PLAYOBJECT) then
SysMsg(Format(g_sCanPickUpItemDuplicate {'你只能同时拥有一个%s'}, [StdItem.FilterName]), c_Red, t_Hint);
Exit;
end;
end;
if m_boPneuma and CheckSPCode(StdItem.SPCode, SP_DISABLEINPNEUMABAG) then Exit; //禁止元神捡取
if (nType = 1) and CheckSPCode(StdItem.SPCode, SP_DISABLEINPETBAG) then Exit; //禁止宠物捡取
if (nType = 1) and (m_PetInfo[0].btType < 6) and (m_PetInfo[0].wLevel < 2) then Exit; //1级丛林豹不允许捡物品
//龙凤绣球-禁止已婚或者女性捡取
if ((StdItem.StdMode = 50) and (StdItem.Looks = 513)) and
((m_sDearName <> '') or (m_btGender = 1)) then Exit;
//宝盒系统控制-骑马禁止捡取宝盒
if m_boRideOn and CheckSPCode(StdItem.Reserved, RE_TREASURE) then begin
Exit;
end;
//不是金币或附身,则放到包裹里
if IsEnoughBag then begin
if m_PEnvir.DeleteFromMap(nX, nY, OS_ITEMOBJECT, TObject(MapItem)) = 1 then begin
New(UserItem);
UserItem^ := MapItem.UserItem;
if IsAddWeightAvailable(UserEngine.GetStdItemWeight(UserItem.wIndex)) then begin
SendMsg(Self, RM_ITEMHIDE, 0, Integer(MapItem), nX, nY, '');
//物品消失
AddItemToBag(UserItem);
if StdItem.boGameLog = 1 then
AddGameDataLog('4' + #9 +
m_sMapName + #9 +
IntToStr(nX) + #9 +
IntToStr(nY) + #9 +
m_sCharName + #9 +
StdItem.Name + #9 +
IntToStr(UserItem.MakeIndex) + #9 +
'1' + #9 +
'0');
Dispose(MapItem);
if m_btRaceServer = RC_PLAYOBJECT then begin
SendAddItem(UserItem);
//捡取触发
if (g_FunctionNPC <> nil) then begin
ExecuteScript(g_FunctionNPC, '@拾取物品');
end;
if (g_FunctionNPC <> nil) and (not m_boPneuma) then begin
ExecuteScript(g_FunctionNPC, '@PickUpItem' + IntToStr(StdItem.AniCount));
end;
if g_Config.boStartMapEvent then begin
StartMapEventOfPickUpItem(StdItem.Name);
end;
end;
Result := True;
end else begin
Result := False;
Dispose(UserItem);
m_PEnvir.AddToMap(nX, nY, OS_ITEMOBJECT, TObject(MapItem));
end;
end;
end;
end;
if not Result then SysMsg(g_sBagIsFullOrWearWeightNot, c_Red, t_Hint);
end;
procedure TPlayObject.ClientQueryBaoshi;
var
i : Integer;
ItemCount : array[0..2] of Integer;
sItemName : string;
UserItem : pTUserItem;
StdItem : pTStdItem;
begin
ItemCount[0] := m_wGemCount[0];
ItemCount[1] := m_wGemCount[1];
ItemCount[2] := m_wGemCount[2];
m_SMELTNPC := m_ClickNPC; //记录当前NPC
SendDefMessage(SM_BAOSHI, Integer(Self), MakeWord(ItemCount[0], ItemCount[1]), ItemCount[2], 0, '');
end;
procedure TPlayObject.ClientQueryEvilFollower;
var
i, nCount : Integer;
Slave : TBaseObject;
EvilData : TEvilData;
begin
nCount := 0;
FillChar(EvilData, SizeOf(TEvilData), #0);
EvilData.dw1 := m_nEvilFollowerPowerMax;
EvilData.dw2 := 3500;
for i := 0 to m_SlaveList.Count - 1 do begin
if nCount > 4 then Break;
Slave := TBaseObject(m_SlaveList[i]);
if Slave.m_boDeath or Slave.m_boGhost or (Slave.m_btRaceServer <> RC_EVIL) then Continue;
EvilData.Evil[i].dwEvilID := Integer(Slave);
EvilData.Evil[i].btLevel := Slave.m_wSlaveExpLevel;
case Slave.m_btAmbitLevel of
0: EvilData.Evil[i].btAmbit := 0;
1..3: EvilData.Evil[i].btAmbit := 1;
4..6: EvilData.Evil[i].btAmbit := 2;
7..9: EvilData.Evil[i].btAmbit := 3;
10: EvilData.Evil[i].btAmbit := 4;
end;
EvilData.Evil[i].btJob := Slave.m_btJob;
Inc(nCount);
end;
m_defMsg := MakeDefaultMsg(CM_RECALLEVIL, 0, MakeWord(1, nCount),
m_nEvilFollowerPower, 0);
SendSocket(@m_defMsg, EnCodeBuffer(@EvilData, SizeOf(TEvilData)));
end;
procedure TPlayObject.ClientQueryMapLotusInfo();
var
i : Integer;
pLotusInfo : pTLotusInfo;
begin
g_LotusInfoList.Lock;
try
for i := 0 to g_LotusInfoList.Count - 1 do begin
pLotusInfo := g_LotusInfoList.Items[i];
if (CompareText(pLotusInfo^.sMapName, m_sMapName) = 0) then begin
SendDefMessage(SM_LOTUSINFO,
MakeWord(pLotusInfo^.btType, pLotusInfo^.btStatus),
pLotusInfo^.nX,
pLotusInfo^.nY,
0,
pLotusInfo^.sChrName + '/' + pLotusInfo^.sMapName);
end;
end;
finally
g_LotusInfoList.UnLock;
end;
end;
procedure TPlayObject.ClientQueryRepairCost(nParam1, nInt: Integer; nRepairType:
Integer; sMsg: string);
var
i : Integer;
UserItem : pTUserItem;
UserItemA : pTUserItem;
Merchant : TMerchant;
sName, sTmp : string;
StdItem : pTStdItem;
sSendMsg : string;
begin
UserItemA := nil;
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[i];
if (UserItem.MakeIndex = nInt) then begin
{取自定义物品名称}
sName := '';
ItemUnit.GetCustomItemName(UserItem, sName);
if (CompareText(sMsg, sName) = 0) then begin
UserItemA := UserItem;
Break;
end;
end;
end;
if UserItemA = nil then begin
SendDefMessage(618, nInt, 1, 0, 0, '');
Exit;
end;
if nParam1 <= 1 then begin
StdItem := UserEngine.GetStdItem(UserItemA.wIndex);
if (StdItem.StdMode in [5, 6, 10, 11, 15, 19..24, 26, 30, 58, 81]) and
(nRepairType = 3) and (UserItemA.btItemExt[4] = 4) then
begin
sSendMsg := Format('您的%s已经破碎了,运用%d点五色晶石的力量就可将其修复如新,您愿意修复吗?', [StdItem.Name, StdItem.Broken]);
m_sNextLabel := Format('Fracture:%d', [UserItemA.MakeIndex]);
SendDefMessage(SM_MENU_OKCANCEL, Integer(Self), 0, 0, 1, sSendMsg);
end;
end;
Merchant := UserEngine.FindMerchant(TObject(nParam1));
if (Merchant <> nil) and
(IsEnvir(Merchant.m_PEnvir) and
(abs(Merchant.m_nCurrX - m_nCurrX) < 15) and
(abs(Merchant.m_nCurrY - m_nCurrY) < 15)) then
Merchant.ClientQueryRepairCost(Self, UserItemA, nRepairType);
end;
//查看宝宝列表
procedure TPlayObject.ClientQuerySlaverState;
var
i : Integer;
SlaveInfo : TViewSlaveInfo;
SlaveInfoList : array[0..9] of TViewSlaveInfo;
Slave : TBaseObject;
s1C : string;
SlaveCount : Integer;
sName : string;
begin
SlaveCount := 0;
for i := 0 to m_SlaveList.Count - 1 do begin
if SlaveCount > 4 then Break;
Slave := TBaseObject(m_SlaveList[i]);
if Slave.m_boDeath or Slave.m_boGhost or (Slave = m_Horse) or Slave.m_boIsPet or
Slave.m_boGodCallBoss or Slave.m_boScapeGoat or (Slave.m_nSlaveType = -2) then Continue;
FillChar(SlaveInfo, SizeOf(TViewSlaveInfo), 0);
SlaveInfo.level := Slave.m_wSlaveExpLevel;
StrPLCopy(SlaveInfo.Name, Slave.m_sFilterCharName, 14);
if (Slave.m_btRaceServer = RC_EVIL) then begin
SlaveInfo.HP := m_nEvilFollowerPower div 500;
SlaveInfo.MaxHP := m_nEvilFollowerPowerMax div 500;
end else begin
SlaveInfo.HP := Slave.m_WAbil.dwHP;
SlaveInfo.MaxHP := Slave.m_WAbil.dwMaxHP;
end;
SlaveInfo.DC := MakeLong(loword(Slave.m_WAbil.DC), hiword(Slave.m_WAbil.DC));
SlaveInfo.AC := hiword(Slave.m_WAbil.AC);
SlaveInfo.MAC := hiword(Slave.m_WAbil.MAC);
SlaveInfo.C := '/';
SlaveInfoList[SlaveCount] := SlaveInfo;
Inc(SlaveCount);
end;
if SlaveCount > 0 then begin
s1C := EnCodeBuffer(@SlaveInfoList, SizeOf(TViewSlaveInfo) * SlaveCount);
m_defMsg := MakeDefaultMsg(SM_QUERYSLAVER, 0, 0, 0, 0);
SendSocket(@m_defMsg, s1C);
end;
end;
procedure TPlayObject.ClientQueryTreasureBoxItems(const boSend: Boolean = True);
begin
if Assigned(m_VersionManage) then
try
m_VersionManage.OnQueryTreasureBoxItems(Self, boSend);
except
MainOutMessage(Format('TPlayObject::OnQueryTreasureBoxItems SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
end;
//查询用户名
procedure TPlayObject.ClientQueryUserName(Target: TBaseObject; X, Y: Integer);
var
uname : string;
TagColor : Integer;
Def : TDefaultMessage;
i : Integer;
begin
if CretInNearXY(Target, X, Y) then begin
TagColor := GetCharColor(Target);
Def := MakeDefaultMsg(SM_USERNAME, Integer(Target), TagColor, 0, 0);
uname := Target.GetShowName;
SendSocket(@Def, EnCodeString(uname));
end else begin
Def := MakeDefaultMsg(SM_GHOST, Integer(Target), X, Y, 0);
i := 0;
SendSocket(@Def, EnCodeBuffer(@i, SizeOf(Integer)));
end;
end;
//召唤封元守卫
procedure TPlayObject.ClientReCallGuarder(nMakeIndex, nX, nY: Integer);
var
i : Integer;
UserItem : pTUserItem;
StdItem : pTStdItem;
boEatOK : Boolean;
begin
boEatOK := False;
if GetUserItemByMakeIndex(nMakeIndex, UserItem) >= 0 then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if (StdItem <> nil) then begin
if (StdItem.StdMode = 49) and (StdItem.Shape = 55) then begin
//封元神力不足
if (m_btFengYuanPoint < 2) then begin
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendDefMessage(3046, 0, 0, 0, 11, '');
SysMsg('封印神力不足,无法召唤此怪物,请在下轮防守时再召唤', c_Red, t_Hint);
Exit;
end;
if (StdItem.Looks = 5050) then begin
if ((nX = 19) and (nY = 28)) or ((nX = 23) and (nY = 32)) or
((nX = 27) and (nY = 36)) or ((nX = 31) and (nY = 40)) or
((nX = 27) and (nY = 44)) or ((nX = 23) and (nY = 48)) then
boEatOK := True
else
SendDefMessage(3046, 0, 0, 0, 10, '');
end else
boEatOK := True;
if boEatOK then begin
m_sScriptParam[0] := IntToStr(nMakeIndex);
m_sScriptParam[1] := IntToStr(nX);
m_sScriptParam[2] := IntToStr(nY);
boEatOK := ExecuteScript(g_ManageNPC, '@释放封元印');
end;
if boEatOK then
SendDefMessage(3046, 0, nX, nY, 6, '')
else
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
end;
end;
end;
end;
procedure TPlayObject.ClientReCallTiger();
var
i : Integer;
begin
if m_boGhost or m_boDeath then Exit;
if (m_Tiger <> nil) then begin
//删除宠物
for i := m_SlaveList.Count - 1 downto 0 do begin
if m_SlaveList[i] = m_Tiger then begin
m_SlaveList.Delete(i);
Break;
end;
end;
if (m_Tiger <> nil) and (not m_Tiger.m_boDeath) and (not m_Tiger.m_boGhost) then
m_Tiger.KickException;
m_Tiger := nil;
end;
SendDefMessage(CM_CALLTIGER, 0, 2, 0, 0, '');
end;
//合成魂骨
procedure TPlayObject.ClientEntopticSmelt(nState: Integer; sData: string);
var
buf : array[0..5] of Integer;
i, j : Integer;
nCode : Integer;
ANpc : TNormNpc;
StdItem : pTStdItem;
UserItem : pTUserItem;
pUserItems : array[0..5] of pTUserItem;
pStdItems : array[0..5] of pTStdItem;
sMsg, sLable : string;
sLableOK : string;
begin
for i := 0 to 5 do begin
m_sScriptParam[i] := '';
pUserItems[i] := nil;
pStdItems[i] := nil;
buf[i] := 0;
end;
sLable := '';
sLableOK := '';
if m_ClickNPC = nil then Exit;
ANpc := TNormNpc(m_ClickNPC);
DeCodeBuffer(sData, @buf[0], SizeOf(Integer) * 6);
nCode := 0;
for i := 0 to 5 do begin
for j := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList[j];
if UserItem.MakeIndex = buf[i] then begin
pUserItems[i] := UserItem;
pStdItems[i] := UserEngine.GetStdItem(UserItem.wIndex);
Break;
end;
end;
if ((pUserItems[i] = nil) or (pStdItems[i] = nil)) then begin
nCode := -1;
sMsg := '你所要魂骨没有在你的包裹里发现';
Break;
end;
end;
{函数标签初始}
sLable := '@@BoneCompound';
{函数触发开始}
if (nCode = 0) then begin
for i := 0 to 5 do begin
if pUserItems[i] <> nil then begin
m_sScriptParam[i] := IntToStr(pUserItems[i].MakeIndex);
{$IF USESDK = DEBUG}
SysMsg(Format('物品%d:%d', [i, pUserItems[i].MakeIndex]), c_Pink, t_Hint);
{$IFEND}
end;
end;
if (IsEnvir(ANpc.m_PEnvir) and (abs(ANpc.m_nCurrX - m_nCurrX) < 15) and (abs(ANpc.m_nCurrY - m_nCurrY) < 15)) or (ANpc.m_boIsHide) then begin
if (sLable <> '') then ANpc.GotoLable(Self, sLable, False);
end;
end;
if (nCode <> 0) and (sMsg <> '') then SendDefMessage(SM_MENU_OK, 0, 0, 0, 0, sMsg);
end;
//淬炼原石
procedure TPlayObject.ClientOriginalStoneSmelt(nItemIdx, nType, nState: Integer; sData: string);
var
buf : array[0..6] of Integer;
i, j, nLen : Integer;
nCode : Integer;
ANpc : TNormNpc;
StdItem : pTStdItem;
UserItem : pTUserItem;
pUserItems : array[0..6] of pTUserItem;
pStdItems : array[0..6] of pTStdItem;
sMsg, sLable : string;
sLableOK : string;
begin
for i := 0 to 6 do begin
m_sScriptParam[i] := '';
pUserItems[i] := nil;
pStdItems[i] := nil;
buf[i] := 0;
end;
sLable := '';
sLableOK := '';
if m_ClickNPC = nil then Exit;
ANpc := TNormNpc(m_ClickNPC);
nLen := Length(sData);
nLen := GetCodeMsgSize(nLen * 3 / 4);
DeCodeBuffer(sData, @buf[1], nLen);
buf[0] := nItemIdx;
if m_btPermissionGM > 6 then begin
SysMsg(Format('当前物品编号为:%d', [nItemIdx]), c_Red, t_Hint);
SysMsg(Format('当前指令编号为:%d', [nType]), c_Red, t_Hint);
SysMsg(Format('当前状态编号为:%d', [nState]), c_Red, t_Hint);
end;
nCode := 0;
for i := 0 to 6 do begin
for j := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList[j];
if UserItem.MakeIndex = buf[i] then begin
pUserItems[i] := UserItem;
pStdItems[i] := UserEngine.GetStdItem(UserItem.wIndex);
Break;
end;
end;
if ((pUserItems[i] = nil) or (pStdItems[i] = nil)) and (buf[i] <> 0) then begin
nCode := -1;
sMsg := '你所要淬炼的宝石或者原石没有在你的包裹里发现';
Break;
end;
end;
{函数标签初始}
sLable := '@@gemextract';
if nState = 0 then sLable := sLable + 'OK';
{函数触发开始}
if (nCode = 0) then begin
for i := 0 to 6 do begin
if pUserItems[i] <> nil then begin
m_sScriptParam[i] := IntToStr(pUserItems[i].MakeIndex);
{$IF USESDK = DEBUG}
SysMsg(Format('物品%d:%d', [i, pUserItems[i].MakeIndex]), c_Pink, t_Hint);
{$IFEND}
end;
end;
if (IsEnvir(ANpc.m_PEnvir) and (abs(ANpc.m_nCurrX - m_nCurrX) < 15) and (abs(ANpc.m_nCurrY - m_nCurrY) < 15)) or (ANpc.m_boIsHide) then begin
if (sLable <> '') then ANpc.GotoLable(Self, sLable, False);
end;
end;
if (nCode <> 0) and (sMsg <> '') then SendDefMessage(SM_MENU_OK, 0, 0, 0, 0, sMsg);
end;
//装备融合
procedure TPlayObject.ClientfuseequipItem(nState: Integer; nItemIdx, nItemIdx2: Integer; sData: string);
var
buf : array[0..3] of Integer;
i, j, nLen : Integer;
nCode : Integer;
ANpc : TNormNpc;
StdItem : pTStdItem;
UserItem : pTUserItem;
pUserItems : array[0..3] of pTUserItem;
pStdItems : array[0..3] of pTStdItem;
sMsg, sLable : string;
sLableOK : string;
begin
for i := 0 to 3 do begin
m_sScriptParam[i] := '';
pUserItems[i] := nil;
pStdItems[i] := nil;
buf[i] := 0;
end;
sLable := '';
sLableOK := '';
if m_ClickNPC = nil then Exit;
ANpc := TNormNpc(m_ClickNPC);
DeCodeBuffer(sData, @buf[2], SizeOf(Integer));
buf[0] := nItemIdx;
buf[1] := nItemIdx2;
if m_btPermissionGM > 6 then begin
SysMsg(Format('当前物品编号为:%d - %d - %d', [nItemIdx, nItemIdx2, buf[2]]), c_Red, t_Hint);
SysMsg(Format('当前指令状态为:%d', [nState]), c_Red, t_Hint);
end;
nCode := 0;
for i := 0 to 3 do begin
for j := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList[j];
if UserItem.MakeIndex = buf[i] then begin
pUserItems[i] := UserItem;
pStdItems[i] := UserEngine.GetStdItem(UserItem.wIndex);
Break;
end;
end;
if ((pUserItems[i] = nil) or (pStdItems[i] = nil)) and (buf[i] <> 0) then begin
nCode := -1;
sMsg := '你所要融合的装备没有在你的包裹里发现';
Break;
end;
end;
{函数标签初始}
case nState of
0: sLable := '@@fuseequip';
1: sLable := '@@equipfuse';
2: sLable := '@@xunzhangrh';
end;
{函数触发开始}
if (nCode = 0) then begin
for i := 0 to 3 do begin
if pUserItems[i] <> nil then begin
m_sScriptParam[i] := IntToStr(pUserItems[i].MakeIndex);
{$IF USESDK = DEBUG}
SysMsg(Format('物品%d:%d', [i, pUserItems[i].MakeIndex]), c_Pink, t_Hint);
{$IFEND}
end;
end;
if (IsEnvir(ANpc.m_PEnvir) and (abs(ANpc.m_nCurrX - m_nCurrX) < 15) and (abs(ANpc.m_nCurrY - m_nCurrY) < 15)) or (ANpc.m_boIsHide) then begin
if (sLable <> '') then ANpc.GotoLable(Self, sLable, False);
end;
end;
if (nCode <> 0) and (sMsg <> '') then SendDefMessage(SM_MENU_OK, 0, 0, 0, 0, sMsg);
end;
//装备精炼
procedure TPlayObject.ClientRefineItems(nType: Integer; nItemIdx, nItemIdx2: Integer; sData: string);
var
buf : array[0..6] of Integer;
i, j, nLen : Integer;
nCode : Integer;
ANpc : TNormNpc;
StdItem : pTStdItem;
UserItem : pTUserItem;
pUserItems : array[0..6] of pTUserItem;
pStdItems : array[0..6] of pTStdItem;
sMsg, sLable : string;
sLableOK : string;
begin
for i := 0 to 6 do begin
m_sScriptParam[i] := '';
pUserItems[i] := nil;
pStdItems[i] := nil;
buf[i] := 0;
end;
sLable := '';
sLableOK := '';
if m_ClickNPC = nil then Exit;
ANpc := TNormNpc(m_ClickNPC);
nLen := Length(sData);
nLen := GetCodeMsgSize(nLen * 3 / 4);
DeCodeBuffer(sData, @buf[1], nLen);
buf[0] := nItemIdx;
buf[6] := nItemIdx2;
if m_btPermissionGM > 6 then begin
SysMsg(Format('当前物品编号为:%d - %d', [nItemIdx, nItemIdx2]), c_Red, t_Hint);
SysMsg(Format('当前指令编号为:%d', [nType]), c_Red, t_Hint);
end;
nCode := 0;
for i := 0 to 6 do begin
for j := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList[j];
if UserItem.MakeIndex = buf[i] then begin
pUserItems[i] := UserItem;
pStdItems[i] := UserEngine.GetStdItem(UserItem.wIndex);
Break;
end;
end;
if ((pUserItems[i] = nil) or (pStdItems[i] = nil)) and (buf[i] <> 0) then begin
nCode := -1;
sMsg := '你所要精炼的装备或者原石没有在你的包裹里发现';
Break;
end;
end;
{函数标签初始}
sLable := Format('@@NUhaiSuitUp%d', [nType]);
{函数触发开始}
if (nCode = 0) then begin
for i := 0 to 6 do begin
if pUserItems[i] <> nil then begin
m_sScriptParam[i] := IntToStr(pUserItems[i].MakeIndex);
{$IF USESDK = DEBUG}
SysMsg(Format('物品%d:%d', [i, pUserItems[i].MakeIndex]), c_Pink, t_Hint);
{$IFEND}
end;
end;
if (IsEnvir(ANpc.m_PEnvir) and (abs(ANpc.m_nCurrX - m_nCurrX) < 15) and (abs(ANpc.m_nCurrY - m_nCurrY) < 15)) or (ANpc.m_boIsHide) then begin
if (sLable <> '') then ANpc.GotoLable(Self, sLable, False);
end;
end;
if (nCode <> 0) and (sMsg <> '') then SendDefMessage(SM_MENU_OK, 0, 0, 0, 0, sMsg);
end;
procedure TPlayObject.ClientRepairItem(nParam1, nInt: Integer; nRepairType:
Integer;
sMsg: string);
var
i : Integer;
UserItem : pTUserItem;
Merchant : TMerchant;
sName : string;
boFind : Boolean;
begin
UserItem := nil;
boFind := False;
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[i];
//取自定义物品名称
sName := '';
ItemUnit.GetCustomItemName(UserItem, sName);
if (UserItem.MakeIndex = nInt) and (CompareText(sMsg, sName) = 0) then begin
boFind := True;
Break;
end;
end;
if not boFind or (UserItem = nil) then Exit;
Merchant := UserEngine.FindMerchant(TObject(nParam1));
if (Merchant <> nil) and
(IsEnvir(Merchant.m_PEnvir) and
(abs(Merchant.m_nCurrX - m_nCurrX) < 15) and
(abs(Merchant.m_nCurrY - m_nCurrY) < 15)) then
Merchant.ClientRepairItem(Self, UserItem, nRepairType);
end;
procedure TPlayObject.ClientRequest(wIdent: word; nOp, nOpCode: Integer);
var
Hum : TPlayObject;
i, nCount : Integer;
begin
Hum := nil;
nCount := 0;
{$IF USESDK = DEBUG}
MainOutMessage(Format('请求消息:%d-%d-%d', [wIdent, nOp, nOpCode]));
{$IFEND}
if nOp > 0 then Hum := TPlayObject(nOp);
if (Hum <> nil) and (Hum is TPlayObject) then begin
//检测是否是元神
if (Hum <> nil) and (not Hum.m_boDeath) and (not Hum.m_boGhost) and
(not Hum.m_boPneuma) and (not m_boDeath) and (not m_boGhost) and (not
m_boPneuma) then begin
case wIdent of
CM_REQUESTMASTER: begin
case nOpCode of
1: begin //招收徒弟
//Hum 徒弟 self 师傅
for i := 1 to 3 do if m_sMasterName[i] <> '' then Inc(nCount);
if nCount >= g_Config.nPrenticeMaxCount then begin
//徒弟太多
SysMsg('你已收满徒弟', c_Red, t_Hint);
Exit;
end;
if m_Abil.level < g_Config.nMasterLoLevel then begin
//自己等级不够
SysMsg('你的等级不够,不能收徒', c_Red, t_Hint);
Exit;
end;
if Hum.m_Abil.level >= g_Config.nPrenticeHiLevel then begin
//对方等级太高
SendDefMessage(CM_REQUESTMASTER, Integer(Self), 258, 12, 0, '对方等级太高');
Exit;
end;
if Hum.m_sMasterName[1] <> '' then begin
//对方有师傅
SysMsg('对方已经有师傅', c_Red, t_Hint);
Exit;
end;
Hum.SendDefMessage(CM_REQUESTMASTER, Integer(Self), 4, 0, 0, '');
end;
2: begin //请求拜师
//Hum 师傅 self 徒弟
for i := 1 to 3 do if Hum.m_sMasterName[i] <> '' then
Inc(nCount);
if nCount >= g_Config.nPrenticeMaxCount then begin
SysMsg('对方已收满徒弟', c_Red, t_Hint);
Exit;
end;
if Hum.m_Abil.level < g_Config.nMasterLoLevel then begin
//对方等级不够
SysMsg('对方等级不够', c_Red, t_Hint);
Exit;
end;
if m_Abil.level >= g_Config.nPrenticeHiLevel then begin
//自己等级太高
SendDefMessage(CM_REQUESTMASTER, Integer(Self), 258, 12, 0, '你的等级太高');
Exit;
end;
if m_sMasterName[1] <> '' then begin
//自己已经有师傅
SysMsg('你已经有师傅', c_Red, t_Hint);
Exit;
end;
Hum.SendDefMessage(CM_REQUESTMASTER, Integer(Self), 3, 0, 0, '');
end;
3: begin //同意拜师
//Hum 徒弟 Self 师傅
for i := 1 to 3 do if m_sMasterName[i] <> '' then Inc(nCount);
if (nCount < g_Config.nPrenticeMaxCount) and (m_Abil.level >=
g_Config.nMasterLoLevel) and
(Hum.m_Abil.level < g_Config.nPrenticeHiLevel) then begin
ChangeMasterName(m_sCharName, Hum.m_sCharName, True);
ChangeMasterName(Hum.m_sCharName, m_sCharName, False);
SendMeOnlineState(1);
CheckMaster();
Hum.CheckMaster();
end;
end;
4: begin //同意收徒
//Hum 师傅 Self 徒弟
for i := 1 to 3 do if (Hum.m_sMasterName[i] <> '') then Inc(nCount);
if (nCount < g_Config.nPrenticeMaxCount) and (Hum.m_Abil.level >= g_Config.nMasterLoLevel) and
(m_Abil.level < g_Config.nPrenticeHiLevel) then begin
ChangeMasterName(m_sCharName, Hum.m_sCharName, False);
ChangeMasterName(Hum.m_sCharName, m_sCharName, True);
SendMeOnlineState(1);
CheckMaster();
Hum.CheckMaster();
end;
end;
259: Hum.SendDefMessage(CM_REQUESTMASTER, Integer(Self), 258, 16, 0, '对方拒绝收你为徒');
260: Hum.SendDefMessage(CM_REQUESTMASTER, Integer(Self), 258, 18, 0, '对方拒绝拜你为师傅');
end;
end;
CM_REQUESTDEAL: begin //请求交易
case nOpCode of
0: begin
CmdChangeAttackMode(HAM_PEACE);
Hum.SendDefMessage(CM_REQUESTDEAL, Integer(Self), 1, 20, 0, m_sCharName + '申请和你交易');
end;
1: begin
CmdChangeAttackMode(HAM_PEACE);
Hum.ClientDealTry(m_sCharName);
end;
else
Hum.SendDefMessage(CM_REQUESTDEAL, Integer(Self), 256, 16, 0, '对方拒绝与你交易');
end;
end;
end;
end;
end;
end;
//同意或拒绝加为好友
procedure TPlayObject.ClientRespAddFriend(nRespCode: word; FriendName: string);
var
human : TPlayObject;
begin
if nRespCode = 1 then begin //同意
human := UserEngine.GetPlayObject(FriendName);
if (human <> nil) and (not human.m_boDeath) and (not human.m_boGhost) then begin
{加到好有名单中}
AddToFriendList(FriendName);
{保存对方的好有名单}
human.AddToFriendList(m_sCharName);
SendMeOnlineState(1);
end else begin //对方不在线
SysMsg(FriendName + '当前不在线,请在他上线后再添加为好友.', c_Red, t_Hint);
end;
end else begin //拒绝
human := UserEngine.GetPlayObject(FriendName);
if (human <> nil) and (not human.m_boDeath) and (not human.m_boGhost) then begin
human.SysMsg(m_sCharName + '拒绝了你的好友添加申请。', c_Red, t_Hint);
end;
end;
end;
function TPlayObject.ClientRide(): Boolean;
var
i, nX, nY : Integer;
nCheckCount : Integer;
RidePet : TRidePet;
btReLive, btType, btSoul : byte;
btRideFightSpeed : byte;
boPetUnWater : Boolean;
Hum : TPlayObject;
begin
Result := False;
//判断是否使用了百变披风
if (m_wBianshenImg <> 0) then begin
if m_boRideOn then
SendMsg(Self, RM_205, 0, 0, 0, 1, '')
else
SendMsg(Self, RM_205, 0, 0, 0, 0, '');
Exit;
end;
if m_boPneuma and (m_PneumaObject <> nil) then
Hum := (m_PneumaObject as TPlayObject)
else
Hum := Self;
if m_boRideOn then begin
if m_boPneuma then begin
btReLive := Hum.m_PetInfo[3].btReLive; //元神骑乘
btType := Hum.m_PetInfo[3].btType;
btRideFightSpeed := Hum.m_PetInfo[3].btRideFightSpeed;
boPetUnWater := Hum.m_PetInfo[3].boUnWater;
btSoul := Hum.m_PetInfo[3].btSoul;
//化形骑战的灵兽 是否本体得下来?
if (Hum.m_PetInfo[3].nMakeIndex = Hum.m_PetInfo[2].nMakeIndex) and (m_PneumaObject <> nil) then begin
TPlayObject(m_PneumaObject).ClientRideOff();
end;
end else begin
btReLive := Hum.m_PetInfo[2].btReLive;
btType := Hum.m_PetInfo[2].btType;
btRideFightSpeed := Hum.m_PetInfo[2].btRideFightSpeed;
boPetUnWater := Hum.m_PetInfo[2].boUnWater;
btSoul := Hum.m_PetInfo[2].btSoul;
end;
end else begin
btReLive := Hum.m_PetInfo[0].btReLive;
btType := Hum.m_PetInfo[0].btType;
boPetUnWater := Hum.m_PetInfo[0].boUnWater;
btSoul := Hum.m_PetInfo[0].btSoul;
end;
if btType < 11 then btType := m_btHorseType;
if (btType in [11..PETMAXTYPE]) and (btReLive < 1) then begin
SendMsg(Self, RM_205, 0, 0, 0, 0, '');
SysMsg('你可骑乘的灵兽(饱食状态)或马匹不在身边', c_Red, t_Hint);
Exit;
end;
if (m_boPneuma and m_boInosculatePneuma) then begin
SendMsg(Self, RM_205, 0, 0, 0, 0, '');
SysMsg('融合状态,无法骑乘灵兽。', c_Red, t_Hint);
Exit;
end;
if m_boCatapultMode then begin
SendMsg(Self, RM_205, 0, 0, 0, 0, '');
SysMsg('投石车状态,禁止骑乘', c_Red, t_Hint);
Exit;
end;
if m_wBianshenAppr <> 0 then begin
if m_boRideOn then
SendMsg(Self, RM_205, 0, 0, 0, 1, '')
else
SendMsg(Self, RM_205, 0, 0, 0, 0, '');
SysMsg('你已使用变身披风,禁止骑马', c_Red, t_Hint);
Exit;
end;
//判断马、宠物的类型
if (not (Hum.m_btHorseType in [1..10])) and (not (btType in [11..PETMAXTYPE])) then begin
SendMsg(Self, RM_205, 0, 0, 0, 0, '');
m_boRideOn := False;
m_boRideFightOn := False;
m_Horse := nil;
Exit;
end;
//判断是否行会老大
if (m_btHorseType = 3) and (not IsGuildMaster) then begin
SendMsg(Self, RM_205, 0, 0, 0, 0, '');
SysMsg('你不是行会长,不能骑黑马', c_Red, t_Hint);
m_boRideOn := False;
Exit;
end;
if (m_btHorseType = 2) and (not (IsGuildMaster and (g_CastleManager.IsCastleMember(Self) <> nil))) then begin
SendMsg(Self, RM_205, 0, 0, 0, 0, '');
SysMsg('你不是沙城主,不能骑白马', c_Red, t_Hint);
m_boRideOn := False;
Exit;
end;
if (btType in [29..31, 35..37, 41]) and (m_btRulerLevel = 0) and (not g_Config.boUnRulerRidePet) then begin
SendMsg(Self, RM_205, 0, 0, 0, 0, '');
if (btType in [27..29]) then
SysMsg('你不是主宰者,不能骑帝王裂天犀', c_Red, t_Hint)
else if btType in [35..37] then
SysMsg('你不是主宰者,不能骑黄金战马', c_Red, t_Hint)
else
SysMsg('你不是主宰者,不能骑霜雪战熊', c_Red, t_Hint);
m_boRideOn := False;
Exit;
end;
if not m_boRideOn and (btType in [11..PETMAXTYPE]) and ((m_nDressShape and $000000C8) = 0) and (m_UseItems[U_RIDEDRESS].wIndex = 0) then begin
SendMsg(Self, RM_205, 0, 0, 0, 0, '');
SysMsg('请先穿上骑宠专用服装才可以骑宠', c_Red, t_Hint);
Exit;
end;
if not m_boRideOn and (btType in [26..28]) and (not m_PEnvir.m_MapFlag.boCanRideShark) then begin
SendMsg(Self, RM_205, 0, 0, 0, 0, '');
Exit;
end;
//有宝盒也不让骑马
if not m_boRideOn and m_boArrow then begin
SysMsg('正在执行抢宝任务,不允许骑宠。', c_Red, t_Hint);
if m_boRideOn then
SendMsg(Self, RM_205, 0, 0, 0, 1, '')
else
SendMsg(Self, RM_205, 0, 0, 0, 0, '');
Exit;
end;
try
nCheckCount := 0;
//地图不允许骑马和骑宠
if m_PEnvir.m_MapFlag.boNoRidePet and (not m_PEnvir.m_MapFlag.boRideOn) then begin
nCheckCount := 1;
SendMsg(Self, RM_205, 0, 0, 0, 0, '');
m_boRideOn := False;
m_boRideFightOn := False; //下马状态
HorseHide;
SysMsg('本地图不允许骑宠。', c_Red, t_Hint);
Exit;
end;
//判断地图是否允许骑马,宠物除外
if not m_PEnvir.m_MapFlag.boRideOn and (m_btHorseType in [1..10]) and (btReLive < 1) then begin //不允许骑马
SendMsg(Self, RM_205, 0, 0, 0, 0, '');
m_boRideOn := False; //下马状态
nCheckCount := 1;
HorseHide;
Result := True;
m_dwLastRide := GetTickCount;
SysMsg('本地图不允许骑宠。', c_Red, t_Hint);
Exit;
end;
//判断地图是否允许骑宠,马除外
if m_PEnvir.m_MapFlag.boNoRidePet and (btType in [11..PETMAXTYPE]) and (not (m_btHorseType in [1..10])) then begin //本地图禁止骑豹子
SendMsg(Self, RM_205, 0, 0, 0, 0, '');
m_boRideOn := False;
m_boRideFightOn := False;
SysMsg('本地图不允许骑宠。', c_Red, t_Hint);
Exit;
end;
{$IF USESDK = DEBUG}
SysMsg('骑宠类型:' + IntToStr(btType), c_Red, t_Hint);
{$IFEND}
m_dwLastRide := GetTickCount;
if m_boRideOn then begin //骑乘中
if btType in [11..PETMAXTYPE] then begin //灵兽
nCheckCount := 4;
if m_boRideFightOn or (btReLive < 2) then begin //骑战中
nCheckCount := 5;
ClientRideOff(); //步行
nCheckCount := 6;
end else begin
if m_PEnvir.m_MapFlag.boWaterNeed and (not (btType in [26..28])) and (not m_boUnWater) and (not boPetUnWater) then begin
SendMsg(Self, RM_205, 0, 0, 0, 0, '');
SysMsg('你没有开启避水护符(避水神符)或你的灵兽没有点化避水灵性,不能骑战', c_Red, t_Hint);
ClientRideOff();
Exit;
end;
nCheckCount := 7;
m_boRideFightOn := True;
RidePet.nFeature := GetFeatureToLong(Self);
RidePet.btState := 1 + btRideFightSpeed; //1 骑战 2 骑战速度+1
RidePet.btSoul := btSoul; //魂佑灵兽
SendRefMsg(RM_SITDOWN,
m_btDirection,
MakeLong(m_nCurrX, m_nCurrY),
GetFeatureToLong(Self),
1,
EnCodeBuffer(@RidePet, SizeOf(TRidePet)));
SendMsg(Self, RM_205, 0, 0, 0, 1, '');
nCheckCount := 8;
if m_boPneuma then Hum.SendPetInfo($08) else Hum.SendPetInfo($06);
nCheckCount := 9;
end;
end else begin //下马
nCheckCount := 10;
ClientRideOff();
nCheckCount := 11;
end;
nCheckCount := 12;
Result := True;
end else begin
nCheckCount := 13;
if (Hum.m_Pet <> nil) and (btType in [11..PETMAXTYPE]) then begin //先骑宠物
if (abs(m_nCurrX - Hum.m_Pet.m_nCurrX) > 2) or (abs(m_nCurrY - Hum.m_Pet.m_nCurrY) > 2) then begin
SysMsg('你的坐骑不在身边。', c_Red, t_Hint);
Exit;
end;
nCheckCount := 14;
m_boRideOn := True;
nCheckCount := 15;
if m_PEnvir.MoveToMovingObject(m_nCurrX, m_nCurrY, Self, Hum.m_Pet.m_nCurrX, Hum.m_Pet.m_nCurrY, True) > 0 then begin
m_nCurrX := Hum.m_Pet.m_nCurrX;
m_nCurrY := Hum.m_Pet.m_nCurrY;
end;
nCheckCount := 16;
if m_boPneuma then
Hum.m_PetInfo[3] := Hum.m_PetInfo[0]
else
Hum.m_PetInfo[2] := Hum.m_PetInfo[0];
m_btDirection := Hum.m_Pet.m_btDirection;
nCheckCount := 19;
RidePet.nFeature := GetFeatureToLong(Self);
RidePet.btState := 0;
RidePet.btSoul := btSoul;
SendRefMsg(RM_SITDOWN,
Hum.m_Pet.m_btDirection,
MakeLong(Hum.m_Pet.m_nCurrX, Hum.m_Pet.m_nCurrY),
GetFeatureToLong(Self),
1,
EnCodeBuffer(@RidePet, SizeOf(TRidePet)));
SendMsg(Self, RM_205, 0, 0, 0, 1, '');
nCheckCount := 20;
if m_boPneuma then Hum.SendPetInfo($07) else Hum.SendPetInfo($02);
//化形骑战, 元神直接骑战状态
if (not m_boPneuma) and (m_PneumaObject <> nil) and (btReLive > 2) {and (m_MagicSkills[SKILL_CLONEPET] <> nil)} then begin
Hum.m_PetInfo[3] := Hum.m_PetInfo[0];
btRideFightSpeed := Hum.m_PetInfo[3].btRideFightSpeed;
TPlayObject(m_PneumaObject).m_boRideOn := True;
TPlayObject(m_PneumaObject).m_boRideFightOn := True;
//化形骑战的元神有御兽天衣的外观
m_PneumaObject.m_nDressShape := MakeLong($00C8, HiWord(m_PneumaObject.m_nDressShape));
RidePet.nFeature := m_PneumaObject.GetFeatureToLong(Self);
RidePet.btState := 1 + btRideFightSpeed; //1 骑战 2 骑战速度+1
RidePet.btSoul := btSoul;
m_PneumaObject.SendRefMsg(RM_SITDOWN,
m_PneumaObject.m_btDirection,
MakeLong(m_PneumaObject.m_nCurrX, m_PneumaObject.m_nCurrY),
m_PneumaObject.GetFeatureToLong(Self),
1,
EnCodeBuffer(@RidePet, SizeOf(TRidePet)));
m_PneumaObject.SendMsg(m_PneumaObject, RM_205, 0, 0, 0, 1, '');
m_PneumaObject.SendRefMsg(RM_510, 1, 0, 180, 0, '');
m_PneumaObject.FeatureChanged;
m_PneumaObject.RecalcAbilitys();
end;
//删除灵兽
Hum.PetHide(Hum.m_PetInfo[0].nMakeIndex);
Result := True;
nCheckCount := 22;
end else if (m_Horse <> nil) and (m_btHorseType in [1..10]) then begin //上马
nCheckCount := 23;
//判断马和人的距离
if (abs(m_nCurrX - m_Horse.m_nCurrX) > 2) or (abs(m_nCurrY - m_Horse.m_nCurrY) > 2) then begin
SysMsg('你的马不在身边。', c_Red, t_Hint);
Exit;
end;
nCheckCount := 24;
m_boRideOn := True;
if m_PEnvir.MoveToMovingObject(m_nCurrX, m_nCurrY, Self, m_Horse.m_nCurrX, m_Horse.m_nCurrY, True) > 0 then begin
m_nCurrX := m_Horse.m_nCurrX;
m_nCurrY := m_Horse.m_nCurrY;
end;
nCheckCount := 25;
m_btDirection := m_Horse.m_btDirection;
nCheckCount := 26;
RidePet.nFeature := GetFeatureToLong(Self);
RidePet.btState := 0;
SendRefMsg(RM_SITDOWN,
m_Horse.m_btDirection,
MakeLong(m_Horse.m_nCurrX, m_Horse.m_nCurrY),
GetFeatureToLong(Self),
1,
EnCodeBuffer(@RidePet, SizeOf(RidePet)));
SendMsg(Self, RM_205, 0, 0, 0, 1, '');
nCheckCount := 27;
SendDefMessage(34977, m_Horse.m_wAppr, 612, 2, 0, '');
//删除马宝宝
nCheckCount := 28;
HorseHide;
Result := True;
end;
end;
FeatureChanged;
RecalcAbilitys(); //计算骑战属性
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
except
on E: Exception do
MainOutMessage(m_sCharName + '骑马下马出错:#' + IntToStr(nCheckCount) + ' ' + E.Message);
end;
end;
procedure TPlayObject.ClientRideOff;
var
i, nX, nY, nMakeIndex : Integer;
Hum : TPlayObject;
UserItem : pTUserItem;
StdItem : pTStdItem;
btPet : byte;
begin
if m_boRideOn then begin
if m_boPneuma and (m_PneumaObject <> nil) then begin
Hum := TPlayObject(m_PneumaObject);
Hum.GetUserItemByMakeIndex(Hum.m_PetInfo[3].nMakeIndex, UserItem); //元神骑乘
btPet := Hum.m_PetInfo[3].btType;
end else begin
Hum := Self;
Hum.GetUserItemByMakeIndex(Hum.m_PetInfo[2].nMakeIndex, UserItem);
btPet := Hum.m_PetInfo[2].btType;
end;
if (btPet in [11..PETMAXTYPE]) and (UserItem = nil) then Exit;
if (not (Hum.m_btHorseType in [1..10])) and (not (btPet in [11..PETMAXTYPE])) then begin
m_boRideOn := False;
m_boRideFightOn := False;
HorseName := '';
Exit;
end;
if m_boPneuma then begin
nMakeIndex := Hum.m_PetInfo[3].nMakeIndex;
Hum.m_PetInfo[3].nMakeIndex := 0;
Hum.m_PetInfo[3].wLevel := 0;
Hum.m_PetInfo[3].btType := 0;
Hum.m_PetInfo[3].btReLive := 0;
Hum.m_PetInfo[3].btRideFightSpeed := 0;
end else begin
nMakeIndex := Hum.m_PetInfo[2].nMakeIndex;
Hum.m_PetInfo[2].nMakeIndex := 0;
Hum.m_PetInfo[2].wLevel := 0;
Hum.m_PetInfo[2].btType := 0;
Hum.m_PetInfo[2].btReLive := 0;
Hum.m_PetInfo[2].btRideFightSpeed := 0;
//化形骑战的灵兽
if (Hum.m_PetInfo[3].nMakeIndex = nMakeIndex) and (m_PneumaObject <> nil) then begin
Hum.m_PetInfo[3].nMakeIndex := 0;
Hum.m_PetInfo[3].wLevel := 0;
Hum.m_PetInfo[3].btType := 0;
Hum.m_PetInfo[3].btReLive := 0;
Hum.m_PetInfo[3].btRideFightSpeed := 0;
TPlayObject(m_PneumaObject).m_boRideOn := False;
TPlayObject(m_PneumaObject).m_boRideFightOn := False;
//取消御兽天衣的外观
if m_PneumaObject.m_UseItems[0].wIndex = 0 then
m_PneumaObject.m_nDressShape := 0
else begin
StdItem := UserEngine.GetStdItem(m_PneumaObject.m_UseItems[0].wIndex);
if StdItem = nil then
m_PneumaObject.m_nDressShape := 0
else
m_PneumaObject.m_nDressShape := MakeLong(MakeWord(StdItem.Shape, $00), HiWord(m_PneumaObject.m_nDressShape));
end;
m_PneumaObject.SendRefMsg(RM_SITDOWN,
m_PneumaObject.m_btDirection,
MakeLong(m_PneumaObject.m_nCurrX, m_PneumaObject.m_nCurrY),
m_PneumaObject.GetFeature(Self),
0,
'');
m_PneumaObject.SendMsg(m_PneumaObject, RM_205, 0, 0, 0, 0, '');
m_PneumaObject.FeatureChanged;
m_PneumaObject.RecalcAbilitys(); //计算骑战属性
m_PneumaObject.SendMsg(m_PneumaObject, RM_ABILITY, 0, 0, 0, 0, '');
m_PneumaObject.SendMsg(m_PneumaObject, RM_SUBABILITY, 0, 0, 0, 0, '');
//融合元神需要强制刷新外观
if TPlayObject(m_PneumaObject).m_boInosculatePneuma then
m_PneumaObject.SendRefMsg(RM_TURN,
m_PneumaObject.m_btDirection,
m_PneumaObject.m_nCurrX,
m_PneumaObject.m_nCurrY,
CalcCent(m_PneumaObject.m_WAbil.dwHP, m_PneumaObject.m_WAbil.dwMaxHP),
m_PneumaObject.GetShowName);
end;
end;
end else begin
nMakeIndex := m_PetInfo[0].nMakeIndex;
btPet := m_PetInfo[0].btType;
end;
if (btPet in [26..28]) and (not m_PEnvir.m_MapFlag.boCanRideShark) then begin //鲨鱼在普通地图不能出现
PetHide(nMakeIndex);
end;
if m_boRideOn and (btPet in [11..PETMAXTYPE]) then begin //踏云豹在任何地图都可以去
if (Hum.m_Pet = nil) and (Hum.m_PetInfo[0].nMakeIndex = 0) then begin
Hum.PetShow(UserItem.MakeIndex);
if Hum.m_Pet <> nil then begin
if m_PEnvir.MoveToMovingObject(Hum.m_Pet.m_nCurrX, Hum.m_Pet.m_nCurrY, Hum.m_Pet, m_nCurrX, m_nCurrY, True) > 0 then begin
Hum.m_Pet.m_nCurrX := m_nCurrX;
Hum.m_Pet.m_nCurrY := m_nCurrY;
end;
Hum.m_Pet.TurnTo(m_btDirection);
Hum.m_Pet.GetLeftPosition(nX, nY);
if m_PEnvir.MoveToMovingObject(m_nCurrX, m_nCurrY, Self, nX, nY, True) > 0 then begin
m_nCurrX := nX;
m_nCurrY := nY;
end;
end;
end else begin
m_defMsg := MakeDefaultMsg(34977, 0, 100, 0, 0);
Hum.SendSocket(@m_defMsg, EnCodeBuffer(@nMakeIndex, 4));
end;
end else if m_PEnvir.m_MapFlag.boRideOn and (m_btHorseType in [1..10]) then begin //允许骑马地图,则出现马
if (m_Horse = nil) then begin
m_Horse := MakeSlave(HorseName, 7, 7, 100, 24 * 60 * 60, -1);
if m_Horse <> nil then begin
if not GetRightPosition(nX, nY) then begin
nX := m_nCurrX;
nY := m_nCurrY;
end;
if m_PEnvir.MoveToMovingObject(m_Horse.m_nCurrX, m_Horse.m_nCurrY, m_Horse, nX, nY, True) > 0 then begin
m_Horse.m_nCurrX := nX;
m_Horse.m_nCurrY := nY;
end;
m_Horse.TurnTo(m_btDirection);
SendDefMessage(34977, m_Horse.m_wAppr, 612, 1, 0, '');
end;
end;
end else begin //不允许骑马
//不允许骑马的地图
if m_Horse <> nil then begin //删除马宝宝
HorseHide;
SysMsg('您的' + HorseName + '无法进入此地,暂时在外面等候', c_Red, t_Hint);
end;
end;
if m_boRideOn then begin //在骑马,则下马
m_boRideOn := False;
m_boRideFightOn := False;
SendRefMsg(RM_SITDOWN, m_btDirection, MakeLong(m_nCurrX, m_nCurrY), GetFeatureToLong(Self), 0, '');
SendMsg(Self, RM_205, 0, 0, 0, 0, '');
end;
end;
//CM_RUN命令的处理
function TPlayObject.ClientRunXY(wIdent: word; nX, nY: Integer; nFlag: Integer;
var dwDelayTime: LongWord): Boolean; //004CB11C
var
nDir : Integer;
dwCheckTime : LongWord;
runOK : Boolean;
nPinjunTime : Integer;
nCheckTime : Integer;
btRideFightSpeed : byte;
nStep : byte;
begin
Result := False;
dwDelayTime := 0;
if (not m_boCanRun) or (m_wShopItemCount > 0) or (m_boCatapultAttackMode) then Exit;
if not CheckCanOperate(cRun) then Exit;
if (not g_Config.boDisableM2SpeedCtrl) then begin
//10指令时间控制
if m_nRunCount = 0 then m_FirstRunTick := GetTickCount;
m_nWalkCount := 0;
Inc(m_nRunCount);
if m_nRunCount >= 11 then begin
nPinjunTime := (GetTickCount - m_FirstRunTick) div 10;
{$IF USESDK = DEBUG}
//SysMsg('跑10次平均时间:'+inttostr(nPinjunTime),c_blue,t_hint);
{$IFEND}
m_FirstRunTick := GetTickCount;
m_nRunCount := 0;
if nPinjunTime < g_Config.n10RunTIme then begin
if m_boTestSpeedMode then
SysMsg(Format('10次跑超速!限制:%d,当前:%d', [g_Config.n10RunTIme, nPinjunTime]), c_Red, t_Hint);
Exit;
end;
end;
if nFlag <> wIdent then begin
if not CheckActionStatus(wIdent, dwDelayTime) then begin
m_boFilterAction := False;
Exit;
end;
m_boFilterAction := True;
dwCheckTime := GetTickCount - m_dwMoveTick;
//上次移动时间和本次移动时间间隔
if (dwCheckTime < g_Config.dwRunIntervalTime + m_dwWalkTick) then begin //两次行动间隔比要求的小,则可能加速
if m_dwWalkTick = 0 then
Inc(m_dwMoveCount); //增加移动次数
dwDelayTime := _Max(0, Integer(g_Config.dwRunIntervalTime) -
Integer(dwCheckTime)); //计算超过的时间
if dwDelayTime > g_Config.dwRunIntervalTime div 3 then begin //在默认的67%-100%之间的,允许4次
if m_dwMoveCount >= 4 then begin
m_dwMoveTick := GetTickCount();
m_dwMoveCount := 0;
dwDelayTime := g_Config.dwRunIntervalTime div 3;
if m_boTestSpeedMode then
SysMsg('跑步忙复位!!!' + IntToStr(dwDelayTime), c_Red, t_Hint);
end else m_dwMoveCount := 0;
Exit;
end else begin //超速达到33%以上的,直接认为超速
if m_boTestSpeedMode then
SysMsg('跑步忙!!!' + IntToStr(dwDelayTime), c_Red, t_Hint);
Exit;
end;
end;
end;
end;
m_dwMoveTick := GetTickCount();
nCheckTime := GetTickCount - m_dwDoMotaeboMoveTick;
if nCheckTime < g_Config.dwRunIntervalTime div 4 then Exit;
m_dwDoMotaeboMoveTick := GetTickCount();
m_boMoveSuccess := False;
nDir := GetNextDirection(m_nCurrX, m_nCurrY, nX, nY);
if m_boPneuma and (m_PneumaObject <> nil) then begin
btRideFightSpeed := TPlayObject(m_PneumaObject).m_PetInfo[3].btRideFightSpeed;
end else begin
btRideFightSpeed := m_PetInfo[2].btRideFightSpeed;
end;
nStep := _Max(abs(m_nCurrX - nX), abs(m_nCurrY - nY));
if ((m_boRideOn and not m_boRideFightOn)) or m_boFlyer or
(m_boRideOn and (btRideFightSpeed = 1) and (m_boRideFightOn)) or
(m_btGodRunTime > 0) then begin
if nStep > 2 then begin
runOK := HorseRunTo(nDir, False);
end else if nStep > 1 then begin
runOK := Runto(nDir, False)
end else
runOK := WalkTo(nDir, False);
end else if (m_dwTotemStatusTimeOutTick[3] > 0) or (m_wStatusTimeArr[STATE_GRAVITY] <> 0) then begin //重力图腾
runOK := WalkTo(nDir, False)
end else
runOK := Runto(nDir, False);
if runOK then begin
if m_boTransparent and (m_boHideMode) then //隐身模式跑动效果消失
m_wStatusTimeArr[STATE_TRANSPARENT] := 1; //004CB212
if m_boMoveSuccess or ((m_nCurrX = nX) and (m_nCurrY = nY)) then Result := True;
if Result then //行走有伤害
RunStepToDamage(nStep);
{$IF USESDK = DEBUG}
if not Result then
SysMsg(Format('移动失败:目标坐标:(%d,%d),新坐标:(%d,%d)', [m_nCurrX, m_nCurrY, nX, nY]), c_Pink, t_Hint);
{$IFEND}
Dec(m_nHealthTick, 60);
Dec(m_nSpellTick, 10);
m_nSpellTick := _Max(0, m_nSpellTick);
Dec(m_nPerHealth);
Dec(m_nPerSpell);
end else begin
m_dwMoveCount := 0;
m_dwMoveCountA := 0;
end;
m_dwWalkTick := 0;
end;
procedure TPlayObject.ClientSendBlessMsg(NPC: Integer; MsgFlag: Integer; sMsg:
string);
var
ANpc : TNormNpc;
sLabel : string;
begin
if not g_Config.boSendCustemMsg then begin
SysMsg(g_sSendCustMsgCanNotUseNowMsg, c_Red, t_Hint);
Exit;
end;
ANpc := UserEngine.FindMerchant(TObject(NPC));
if ANpc = nil then ANpc := UserEngine.FindNPC(TObject(NPC));
if ANpc = nil then begin
UserEngine.SendBroadCastMsgExt(m_sCharName + '祝福:' + sMsg, t_Flymsg);
Exit;
end;
if (IsEnvir(ANpc.m_PEnvir) and
(abs(ANpc.m_nCurrX - m_nCurrX) < 15) and
(abs(ANpc.m_nCurrY - m_nCurrY) < 15)) or (ANpc.m_boIsHide) then begin
m_sScriptParam[0] := sMsg;
if MsgFlag = 2 then
sLabel := '@@blessname'
else
sLabel := '@@sendbless';
if not ANpc.GotoLable(Self, sLabel, False) then
UserEngine.SendBroadCastMsgExt(m_sCharName + '祝福:' + sMsg, t_Flymsg);
Exit;
end;
end;
{客户端发送的包裹顺序}
procedure TPlayObject.ClientSetBagOrder(nItemCount: Integer; sData: string);
var
BagItemOrder : array[0..125] of TClientItemOrder;
i, ii : Integer;
begin
if m_boPneuma then Exit; //元神不发送
if nItemCount > 125 then
nItemCount := 125;
DeCodeBuffer(sData, @BagItemOrder[0], nItemCount * SizeOf(TClientItemOrder));
for i := 0 to nItemCount - 1 do begin
ii := m_ItemList.IndexOf(BagItemOrder[i].MakeIndex);
if ii >= 0 then
m_ItemList.Pos[ii] := BagItemOrder[i].Order;
end;
end;
//把包裹顺序发送到客户端
procedure TPlayObject.ClientSendBagOrder();
var
BagOrder : array[0..125] of TClientItemOrder;
i : Integer;
sData : string;
UserItem : pTUserItem;
bo : Boolean;
begin
if m_boPneuma then Exit; //元神不发送
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[i];
BagOrder[i].MakeIndex := UserItem.MakeIndex;
BagOrder[i].Order := m_ItemList.Pos[i];
if i >= 125 then
Break;
end;
m_defMsg := MakeDefaultMsg($46, 0, 0, 0, m_ItemList.Count);
if m_ItemList.Count <> 0 then
SendSocket(@m_defMsg, EnCodeBuffer(@BagOrder[0], m_ItemList.Count * SizeOf(TClientItemOrder)));
end;
procedure TPlayObject.ClientSetTigerTarget(nMonID, nOp, nX, nY: Integer);
var
Monster : TBaseObject;
begin
if (m_Tiger <> nil) and (not m_Tiger.m_boDeath) and (not m_Tiger.m_boGhost) then begin
if (nOp = 0) or (nOp = 257) then begin
if (nMonID > 0) and (CretInNear10XY(TBaseObject(nMonID), m_nCurrX, m_nCurrY)) then begin
Monster := TBaseObject(nMonID);
if (Monster <> nil) and (Monster <> m_Tiger) and (not Monster.m_boDeath) and (not Monster.m_boGhost) then begin
if IsProperTarget(Monster) then begin
m_Tiger.m_FirstTargetCret := Monster;
m_Tiger.SetTargetCreat(Monster);
SetTargetCreat(Monster);
if m_TorDDM.Tiger.DB.Dragon > 0 then
SendDefMessage(CM_TIGERATTACK, nMonID, 2, 0, 0, '')
else
SendDefMessage(CM_TIGERATTACK, nMonID, 1, 0, 0, '');
end;
end;
end else
m_Tiger.DelTargetCreat;
Exit;
end;
case HiByte(nOp) of
0: begin
m_Tiger.m_nMissionX := -1;
m_Tiger.m_nMissionY := -1;
m_Tiger.m_boMission := False;
m_Tiger.DelTargetCreat;
SendDefMessage(CM_TIGERATTACK, 0, 3, 0, 0, '');
end;
2: begin
if m_TorDDM.Tiger.DB.Dragon > 0 then begin
if (m_nCurrX - nX <= 10) and (m_nCurrY - nY <= 10) then begin
m_Tiger.m_nMissionX := nX;
m_Tiger.m_nMissionY := nY;
m_Tiger.m_boMission := True;
SendDefMessage(CM_TIGERATTACK, 0, 4, 0, 0, '');
end;
end;
end;
end;
end;
end;
//CM_SITDOWN
function TPlayObject.ClientSitDownHit(nX, nY, nDir: Integer; var dwDelayTime:
LongWord): Boolean; //004CC248
var
dwCheckTime : LongWord;
begin
Result := False;
if not CheckCanOperate(cDigUp) then Exit;
if not g_Config.boDisableM2SpeedCtrl then begin
dwCheckTime := GetTickCount - m_dwTurnTick;
if dwCheckTime < g_Config.dwTurnIntervalTime then begin
dwDelayTime := g_Config.dwTurnIntervalTime - dwCheckTime;
Exit;
end;
m_dwTurnTick := GetTickCount;
end;
SendRefMsg(RM_BUTCH, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
//执行脚本:挖宝
if g_Config.boStartMapEvent then begin
StartMapEventOfButch();
end;
Result := True;
end;
//魔法(CM_SPELL命令的处理)
function TPlayObject.ClientSpellXY(wIdent: word; nKey: Integer; nTargetX,
nTargetY: Integer; TargeTBaseObject: TBaseObject; boLateDelivery: Boolean; var
dwDelayTime: LongWord): Boolean; //004CBCEC
var
UserMagic : pTUserMagic;
nSpellPoint : Integer;
n14 : Integer;
BaseObject : TBaseObject;
dwCheckTime : LongWord;
boIsWarrSkill : Boolean;
NextMagic : pTUserMagic;
wPercen : Word;
function isNoCheckTimeSkill(wMagIdx: Integer): Boolean;
begin
Result := wMagIdx in [SKILL_SHIELD, SKILL_MOOTEBO, SKILL_42, SKILL_59, SKILL_60, SKILL_61, SKILL_62, SKILL_70];
end;
begin
Result := False;
dwDelayTime := 0;
if m_boPneuma and m_PEnvir.m_MapFlag.boNoPneuma then Exit; //元神在不允许释放的地图,禁止攻击
if (not m_boCanSpell) or (m_wShopItemCount > 0) or (m_boCatapultAttackMode) then Exit;
if (m_wBianshenAppr > 0) and (m_boAttackMode = False) then Exit; //2016.06.22 支持ChangeAppr变身支持攻击
if (m_boRideOn and not m_boRideFightOn) then Exit; //骑马不允许使用魔法
if not CheckCanOperate(cMagHit, nKey) then Exit;
UserMagic := GetMagicInfo(nKey); //根据MagicID获取魔法
if (nKey in [78..81, 83, 85]) then begin
if (not m_boPneuma) and (m_PneumaObject <> nil) then begin
if m_PneumaObject.m_boPneumaEffMode then begin
SysMsg('元神灵珠状态不允许使用组合技能。', c_Red, t_Notice);
Exit;
end;
UserMagic := m_PneumaObject.GetMagicInfo(nKey);
end;
end;
if (nKey in [100..105]) and (not m_boPneuma) and (m_PneumaObject <> nil) and (not g_Config.boMergeSkillByOneself) then begin
if m_PneumaObject.m_boPneumaEffMode then begin
SysMsg('元神灵珠状态不允许使用组合技能。', c_Red, t_Notice);
Exit;
end;
end;
if UserMagic = nil then Exit;
//检查是否为本地图禁止使用的技能
if m_PEnvir.ForbidMagic(UserMagic.MagicInfo.sMagicName) then begin
SysMsg('本地图禁止使用' + UserMagic.MagicInfo.sMagicName, c_Red, t_Hint);
Exit;
end;
//检查是否为禁止使用该技能状态
if m_dwStopMagic[UserMagic.GetMagIdx] > GetTickCount() then begin
SysMsg('当前' + UserMagic.MagicInfo.sMagicName + '被禁止使用状态', c_Red, t_Hint);
Exit;
end;
boIsWarrSkill := MagicManager.IsWarrSkill(UserMagic.GetMagIdx);
if (not g_Config.boDisableM2SpeedCtrl) then begin
if (not boLateDelivery) and not boIsWarrSkill and not isNoCheckTimeSkill(UserMagic.GetMagIdx) then begin //战士技能不做处理
// if not CheckActionStatus(wIdent, dwDelayTime) then begin
// m_boFilterAction := False;
// Exit;
// end;
m_boFilterAction := True;
dwCheckTime := GetTickCount - m_dwMagicAttackTick;
if dwCheckTime < m_dwMagicAttackInterval then begin
Inc(m_dwMagicAttackCount);
dwDelayTime := m_dwMagicAttackInterval - dwCheckTime;
if dwDelayTime > g_Config.dwMagicHitIntervalTime div 3 then begin
if m_dwMagicAttackCount >= 4 then begin
m_dwMagicAttackTick := GetTickCount();
m_dwMagicAttackCount := 0;
dwDelayTime := g_Config.dwMagicHitIntervalTime div 3;
if m_boTestSpeedMode then
SysMsg('魔法忙复位!!!' + IntToStr(dwDelayTime), c_Red, t_Hint);
end else
m_dwMagicAttackCount := 0;
Exit;
end else begin
if m_boTestSpeedMode then
SysMsg('魔法忙!!!' + IntToStr(dwDelayTime), c_Red, t_Hint);
Exit;
end;
end;
end;
Dec(m_nSpellTick, 450);
m_nSpellTick := _Max(0, m_nSpellTick);
if boIsWarrSkill then begin //战士的技能不做处理
//m_dwMagicAttackInterval:=0;
//m_dwMagicAttackInterval:=g_Config.dwMagicHitIntervalTime; //01/21 改成此行
end else begin
m_dwMagicAttackInterval := UserMagic.MagicInfo.dwDelayTime + g_Config.dwMagicHitIntervalTime;
end;
m_dwMagicAttackTick := GetTickCount();
end;
CheckProwlMagic; //检查是否有潜行
case UserMagic.GetMagIdx of //
SKILL_ERGUM {12}: begin //刺杀剑法
if m_MagicSkills[12] <> nil then begin
if not m_boUseThrusting then begin
ThrustingOnOff(True);
SendSocket(nil, '+LNG');
end else begin
ThrustingOnOff(False);
SendSocket(nil, '+ULNG');
end;
end;
Result := True;
end;
SKILL_BANWOL {25}: begin //半月弯刀
if m_MagicSkills[25] <> nil then begin
if not m_boUseHalfMoon then begin
HalfMoonOnOff(True);
SendSocket(nil, '+WID');
end else begin
HalfMoonOnOff(False);
SendSocket(nil, '+UWID');
end;
end;
Result := True;
end;
SKILL_FIRESWORD {26}: begin //烈火剑法
if m_MagicSkills[26] <> nil then begin
if AllowFireHitSkill then begin
nSpellPoint := GetSpellPoint(UserMagic);
if m_WAbil.dwMP >= nSpellPoint then begin
if nSpellPoint > 0 then begin
DamageSpell(nSpellPoint);
//HealthSpellChanged();
end;
SendSocket(nil, '+FIR');
end;
end;
end;
Result := True;
end;
SKILL_MOOTEBO {27}, SKILL_62: begin //野蛮冲撞 ,突斩
Result := True;
if (GetTickCount - m_dwDoMotaeboTick) > 3 * 1000 then begin
m_dwDoMotaeboTick := GetTickCount();
m_btDirection := nTargetX;
nSpellPoint := GetSpellPoint(UserMagic);
if m_WAbil.dwMP >= nSpellPoint then begin
if nSpellPoint > 0 then begin
DamageSpell(nSpellPoint);
//HealthSpellChanged();
end;
if DoMotaebo(m_btDirection, UserMagic.btLevel, UserMagic.GetMagIdx) then
TrainSkill(UserMagic, Random(3) + 1, 1000);
end;
end;
end;
SKILL_WINDTEBO, SKILL_75, SKILL_77{, SKILL_176}: begin
m_btDirection := nTargetX;
nSpellPoint := GetSpellPoint(UserMagic);
if m_WAbil.dwMP >= nSpellPoint then begin
if nSpellPoint > 0 then begin
DamageSpell(nSpellPoint);
end;
if MagDoBatfly(UserMagic, nTargetX, nTargetY) then begin
Result := True;
TrainSkill(UserMagic, Random(3) + 1, 1000);
end;
end;
end;
SKILL_40: begin //双龙斩
if m_MagicSkills[40] <> nil then begin
if not m_boCrsHitkill then begin
SkillCrsOnOff(True);
SendSocket(nil, '+CRS');
end else begin
SkillCrsOnOff(False);
SendSocket(nil, '+UCRS');
end;
end;
Result := True;
end;
SKILL_43: begin //抱月刀
if m_MagicSkills[43] <> nil then begin
if not m_bo43Skill then begin
Skill43OnOff(True);
SendSocket(nil, '+CIR');
end else begin
Skill43OnOff(False);
SendSocket(nil, '+UCIR');
end;
end;
Result := True;
end;
SKILL_44: begin //雷霆剑
if m_MagicSkills[44] <> nil then begin
if AllowThunderHitSkill then begin
nSpellPoint := GetSpellPoint(UserMagic);
if m_WAbil.dwMP >= nSpellPoint then begin
if nSpellPoint > 0 then begin
DamageSpell(nSpellPoint);
//HealthSpellChanged();
end;
SendSocket(nil, '+THU'); //'+FIR');
end;
end;
end;
Result := True;
end;
SKILL_59: begin //破击剑法
if m_MagicSkills[59] <> nil then begin
if not m_bo59Skill then begin
Skill59OnOff(True);
SendSocket(nil, '+PJ');
end else begin
Skill59OnOff(False);
SendSocket(nil, '+UPJ');
end;
end;
Result := True;
end;
SKILL_60: begin //破盾斩
if m_MagicSkills[60] <> nil then begin
if not m_bo60Skill then begin
Skill60OnOff(True);
SendSocket(nil, '+PD');
end else begin
Skill60OnOff(False);
SendSocket(nil, '+UPD');
end;
end;
Result := True;
end;
else begin
BaseObject := nil;
//检查目标角色,与目标座标误差范围,如果在误差范围内则修正目标座标
if CretInNearXY(TargeTBaseObject, nTargetX, nTargetY) then begin
BaseObject := TargeTBaseObject;
nTargetX := BaseObject.m_nCurrX;
nTargetY := BaseObject.m_nCurrY;
end;
//元神目标修正
if ((nTargetX = 0) or (nTargetY = 0)) and m_boPneuma then begin
nTargetX := m_nCurrX;
nTargetY := m_nCurrY;
end;
//铁血神技处理
{if (UserMagic.GetMagIdx in [SKILL_220..SKILL_235]) then begin
NextMagic := nil;
NextMagic := MagicManager.GetMagicOrder(Self, m_btMagicOrder);
Inc(m_btMagicOrder);
if NextMagic <> nil then begin
UserMagic := NextMagic;
if m_btMagicOrder = $01 then begin
wPercen := Round((m_WAbil.wMaxVitaLity * 5) / 10);
if m_wVitaLity < wPercen then begin
SysMsg('元气值不足', c_Red, t_Hint);
Exit;
end;
//减少元气
DamageVitaLity(wPercen);
SendRefMsg(RM_510, m_nCurrX, m_nCurrY, 321, 0, '');
end;
end;
end; }
//魔法攻击(法师、道士的技能)
Result := DoSpell(UserMagic, nTargetX, nTargetY, BaseObject);
if not Result then begin
SendMsg(Self, RM_MAGICFIREFAIL, 0, 0, 0, 0, '');
end ;{else if (UserMagic.GetMagIdx in [SKILL_220..SKILL_235]) then begin //铁血技能处理
NextMagic := nil;
NextMagic := MagicManager.GetMagicOrder(Self, m_btMagicOrder);
if (NextMagic <> nil) and (m_boComboMagic) then begin
case m_btJob of
0: SendDelayMsg(Self, 3017, NextMagic.GetMagIdx, nTargetX, nTargetY, Integer(BaseObject), '', 1000);
1: SendDelayMsg(Self, 3017, NextMagic.GetMagIdx, nTargetX, nTargetY, Integer(BaseObject), '', 1500);
2: SendDelayMsg(Self, 3017, NextMagic.GetMagIdx, nTargetX, nTargetY, Integer(BaseObject), '', 1500);
3: SendDelayMsg(Self, 3017, NextMagic.GetMagIdx, nTargetX, nTargetY, Integer(BaseObject), '', 1500);
end;
end else if NextMagic = nil then begin
m_btMagicOrder := 0;
case m_btJob of
0: SendDelayMsg(Self, 1653, m_MagicSkills[SKILL_220].MagicInfo.dwCoolDownTime div 1000, SKILL_220, 0, 0, '', 2000);
1: SendDelayMsg(Self, 1653, m_MagicSkills[SKILL_224].MagicInfo.dwCoolDownTime div 1000, SKILL_224, 0, 0, '', 2000);
2: SendDelayMsg(Self, 1653, m_MagicSkills[SKILL_228].MagicInfo.dwCoolDownTime div 1000, SKILL_228, 0, 0, '', 2000);
3: SendDelayMsg(Self, 1653, m_MagicSkills[SKILL_232].MagicInfo.dwCoolDownTime div 1000, SKILL_232, 0, 0, '', 2000);
end;
SendRefMsg(RM_510, m_nCurrX, m_nCurrY, 321, 0, '');
end;
end; }
end;
end;
end;
//拆分物品
procedure TPlayObject.ClientSplitItem(nMakeIndex: Integer; nCount: Integer; boScript: Boolean);
var
SplitItem, UserItem : pTUserItem;
StdItem : pTStdItem;
begin
if m_boDeath or m_boGhost then Exit;
if (nMakeIndex <= 0) or (nCount <= 0) then Exit;
if GetUserItemByMakeIndex(nMakeIndex, UserItem) >= 0 then begin
if (UserItem <> nil) then
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
end else
Exit;
if (UserItem <> nil) and (StdItem <> nil) then begin
//脚本拆分物品
if boScript then begin
if (TNormNpc(m_SMELTNPC) <> nil) and
IsEnvir(TNormNpc(m_SMELTNPC).m_PEnvir) and
((abs(TNormNpc(m_SMELTNPC).m_nCurrX - m_nCurrX) < 15) and
(abs(TNormNpc(m_SMELTNPC).m_nCurrY - m_nCurrY) < 15)) or
(TNormNpc(m_SMELTNPC).m_boIsHide) then begin
m_sScriptParam[0] := IntToStr(nMakeIndex); //IDX
m_sScriptParam[1] := StdItem.Name;
m_sScriptParam[2] := IntToStr(nCount); //数量
TNormNpc(m_SMELTNPC).GotoLable(Self, m_sNextLabel, False);
end;
end else begin
//只有支持自动叠加的物品才支持拆分
if IsEnoughBag then begin
if CheckSPCode(StdItem.Reserved, RE_ALLOWPILE) then begin
if (UserItem.Dura > nCount) then begin
New(SplitItem);
if UserEngine.CopyToUserItemFromName(StdItem.Name, SplitItem) then begin
SplitItem^.Dura := nCount;
SplitItem^.DuraMax := StdItem.DuraMax;
//检测绑定
if (UserItem.btItemExt[4] = 1) then SplitItem^.btItemExt[4] := 1;
Dec(UserItem.Dura, nCount);
SendUpdateItem(UserItem);
AddItemToBag(SplitItem);
SendAddItem(SplitItem);
if StdItem.boGameLog = 1 then
AddGameDataLog('9' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
StdItem.Name + #9 +
IntToStr(UserItem.MakeIndex) + #9 +
IntToStr(SplitItem.MakeIndex) + #9 +
IntToStr(nCount));
end else
Dispose(SplitItem);
end;
end;
end else begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, '包裹空间不够!!!');
end;
end;
end;
end;
//存物品到宠物
procedure TPlayObject.ClientStorageItemToPetBag(nItemIdx: Integer);
var
i : Integer;
UserItem : pTUserItem;
bo19 : Boolean;
StdItem : pTStdItem;
begin
if (m_PetInfo[0].nMakeIndex = 0) and (m_PetInfo[1].nMakeIndex = 0) and
(m_PetInfo[2].nMakeIndex = 0) and (m_PetInfo[3].nMakeIndex = 0) and
(m_PetInfo[4].nMakeIndex = 0) and (m_PetInfo[5].nMakeIndex = 0) then begin
SendDefMessage(SM_9604, Integer(Self), 0, 0, 0, '');
SysMsg('你没有宠物,无法使用本功能。', c_Red, t_Hint);
Exit;
end;
//检查宠物包裹是否已经满了
if m_PetItemList.Count >= m_nPetBagSize then begin
SendDefMessage(SM_9604, Integer(Self), 0, 0, 0, '');
SysMsg('宠物包裹已经满了,无法放入更多的东西。', c_Red, t_Hint);
Exit;
end;
bo19 := False;
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[i];
if (UserItem.MakeIndex = nItemIdx) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
{物品控制,禁止放入宠物包裹}
if CheckSPCode(StdItem.SPCode, SP_DISABLEINPETBAG) then begin
SysMsg(StdItem.FilterName + '不允许放入宠物包裹', c_Red, t_Hint);
bo19 := False;
Break;
end;
//魂佑灵兽禁止放入宠物包裹
if (StdItem.StdMode = 49) and (StdItem.Shape = 51) and (UserItem.btItemExt[29] >= 2) then begin
bo19 := False;
Break;
end;
{已放出豹禁止放入宠物包裹}
if IsDownPetItem(UserItem.MakeIndex) then begin
bo19 := False;
Break;
end;
m_PetItemList.Add(UserItem);
m_ItemList.Delete(i);
WeightChanged();
SendDefMessage(SM_9604, 0, 0, 0, 1, '');
SendAddPetItem(UserItem);
bo19 := True;
Break;
end;
end;
end;
if not bo19 then
SendDefMessage(SM_9604, Integer(Self), 0, 0, 0, '');
end;
procedure TPlayObject.CheckStoreBagDupeItem;
var
i, ii : Integer;
UserItem, UserItem1 : pTUserItem;
StdItem : pTStdItem;
s14 : string;
begin
//检查背包中是否有复制品
for i := m_ItemList.Count - 1 downto 0 do begin
UserItem := m_ItemList.Items[i];
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem = nil then Continue;
if StdItem = nil then begin
{$IF USESDK = DEBUG}
SysMsg('删除非法物品:' + IntToStr(UserItem.MakeIndex), c_Pink, t_Hint);
{$IFEND}
m_ItemList.Delete(i);
Dispose(UserItem);
Continue;
end;
s14 := StdItem.Name;
for ii := i - 1 downto 0 do begin
UserItem1 := m_ItemList.Items[ii];
if (UserItem.MakeIndex = UserItem1.MakeIndex) and (UserEngine.GetStdItemName(UserItem1.wIndex) = s14) then begin
{$IF USESDK = DEBUG}
SysMsg('删除复制品:' + IntToStr(UserItem.MakeIndex), c_Pink, t_Hint);
{$IFEND}
m_ItemList.Delete(ii);
Dispose(UserItem1);
Break;
end;
end;
//检查背包物品和身上装备是否有复制
for ii := Low(THumItems) to High(THumItems) do begin
if (m_UseItems[ii].wIndex > 0) and (UserItem.MakeIndex = m_UseItems[ii].MakeIndex) and (UserEngine.GetStdItemName(m_UseItems[ii].wIndex) = s14) then begin
{$IF USESDK = DEBUG}
SysMsg('删除复制品:' + IntToStr(m_UseItems[ii].MakeIndex), c_Pink, t_Hint);
{$IFEND}
m_UseItems[ii].wIndex := 0;
Break;
end;
end;
end;
end;
procedure TPlayObject.ClientStorageItem(NPC: TObject; nItemIdx: Integer; boFast:
Boolean; sMsg: string);
var
Merchant : TMerchant;
i : Integer;
UserItem : pTUserItem;
bo19 : Boolean;
StdItem : pTStdItem;
sName : string;
StdItem80 : TStdItem;
begin
bo19 := False;
UserItem := nil;
if (m_wShopItemCount > 0) or m_boArrow or (not m_boCanGetBackItem) then begin
SysMsg('您现在不可以使用仓库功能!!!', c_Red, t_Hint);
Exit;
end;
if (m_nPayMent = 1) and not g_Config.boTryModeUseStorage then begin
SysMsg(g_sTryModeCanotUseStorage {'试玩模式不可以使用仓库功能!!!'}, c_Red, t_Hint);
Exit;
end;
for i := m_ItemList.Count - 1 downto 0 do begin
UserItem := m_ItemList.Items[i];
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem = nil then Break;
StdItem80 := StdItem^;
{取自定义物品名称}
sName := '';
ItemUnit.GetCustomItemName(UserItem, sName);
if (UserItem.MakeIndex = nItemIdx) and CompareLStr(sName, sMsg, Length(sMsg)) then begin
{物品控制-禁止存仓物品}
if CheckSPCode(StdItem.SPCode, SP_DISABLESTORAGE) then begin
SendDefMessage(38288, 1, 255, 0, 0, sName + ' 不允许放入仓库。');
Break;
end;
{魂佑灵兽禁止存仓}
if (StdItem.StdMode = 49) and (StdItem.Shape = 51) and (UserItem.btItemExt[29] >= 2) then begin
SendDefMessage(38288, 1, 255, 0, 0, '魂佑灵兽石不允许保存。');
Break;
end;
{已放出豹禁止存仓}
if IsDownPetItem(UserItem.MakeIndex) then begin
SendDefMessage(38288, 1, 255, 0, 0, sName + ' 放出宠物时不允许保存。');
Break;
end;
Merchant := UserEngine.FindMerchant(NPC);
if (Merchant <> nil) and
(Merchant.m_boStorage) and {检查NPC是否允许存物品}
((IsEnvir(Merchant.m_PEnvir) and
(abs(Merchant.m_nCurrX - m_nCurrX) < 15) and
(abs(Merchant.m_nCurrY - m_nCurrY) < 15)) or (Merchant = g_FunctionNPC)) then begin
if m_StorageItemList.Count < m_btStorageSize {49} then begin
m_StorageItemList.Add(UserItem);
m_ItemList.Delete(i);
WeightChanged();
{快捷存取}
if boFast then begin
m_defMsg := MakeDefaultMsg(3039, Integer(NPC), 1, 2, 0);
if Assigned(m_VersionManage) then
try
SendSocket(@m_defMsg, m_VersionManage.OnGetClientItemToMsg(Self, UserItem));
except
MainOutMessage(Format('TPlayObject::OnGetClientItemToMsg SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
end else
SendDefMessage(SM_STORAGE_OK, 0, 0, 0, 0, '');
//记录日志
if StdItem.boGameLog = 1 then
AddGameDataLog('1' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
StdItem.Name + #9 +
IntToStr(UserItem.MakeIndex) + #9 +
'1' + #9 +
'0');
end else begin
SendDefMessage(SM_STORAGE_FULL, 0, 0, 0, 0, ''); {仓库满了}
end;
bo19 := True;
end;
Break;
end;
end;
CheckStoreBagDupeItem; //检测重复id
if not bo19 then
SendDefMessage(SM_STORAGE_FAIL, 0, 0, 0, 0, '');
end;
//取回宠物包裹中的物品
procedure TPlayObject.ClientTakebackPetItem(nItemIdx: Integer);
var
i : Integer;
UserItem : pTUserItem;
bo19 : Boolean;
StdItem : pTStdItem;
begin
bo19 := False;
UserItem := nil;
if (m_PetInfo[0].nMakeIndex = 0) and (m_PetInfo[1].nMakeIndex = 0) and
(m_PetInfo[2].nMakeIndex = 0) and (m_PetInfo[3].nMakeIndex = 0) and
(m_PetInfo[4].nMakeIndex = 0) and (m_PetInfo[5].nMakeIndex = 0) then begin
SendDefMessage(SM_9604, Integer(Self), 0, 0, 0, '');
SendDefMessage(618, nItemIdx, 1, 0, 0, '');
SysMsg('你没有宠物,无法使用本功能。', c_Red, t_Hint);
Exit;
end;
for i := m_PetItemList.Count - 1 downto 0 do begin
UserItem := m_PetItemList.Items[i];
if (UserItem.MakeIndex = nItemIdx) then begin
if (IsAddWeightAvailable(UserEngine.GetStdItemWeight(UserItem.wIndex))) then begin
if AddItemToBag(UserItem) then begin
SendDefMessage(SM_9605, Integer(Self), 0, 0, 1, '');
SendAddItem(UserItem);
m_PetItemList.Delete(i);
SendDefMessage(SM_TAKEBACKSTORAGEITEM_OK, nItemIdx, 0, 0, 0, '');
bo19 := True;
end else begin
SendDefMessage(SM_TAKEBACKSTORAGEITEM_FULLBAG, 0, 0, 0, 0, '');
end;
end else begin
SysMsg(g_sCanotGetItems {'无法携带更多的东西!!!'}, c_Red,
t_Hint);
end;
Break;
end;
end;
if not bo19 then begin
SendDefMessage(SM_9605, 0, 0, 0, 0, '');
SendDefMessage(SM_TAKEBACKSTORAGEITEM_FAIL, 0, 0, 0, 0, '');
end;
end;
procedure TPlayObject.ClientTakeBackStorageItem(NPC: TObject; nItemIdx: Integer;
boFast: Boolean; sMsg: string); //004DC664
var
Merchant : TMerchant;
i : Integer;
UserItem : pTUserItem;
bo19 : Boolean;
StdItem : pTStdItem;
sName : string;
begin
bo19 := False;
UserItem := nil;
Merchant := UserEngine.FindMerchant(NPC);
if Merchant = nil then Exit;
if (m_wShopItemCount > 0) or m_boArrow then begin
SysMsg('您现在不可以使用仓库功能!!!', c_Red, t_Hint);
Exit;
end;
if (m_nPayMent = 1) and not g_Config.boTryModeUseStorage then begin
SysMsg(g_sTryModeCanotUseStorage {'试玩模式不可以使用仓库功能!!!'}, c_Red, t_Hint);
Exit;
end;
if not m_boCanGetBackItem then begin
if m_boPasswordLocked then begin
if not ExecuteScript(g_FunctionNPC, '@仓库锁定') then
SendMsg(Merchant, RM_MENU_OK, 0, Integer(Self), 0, 0,
g_sStorageIsLockedMsg + #13#10#13#10
+ '仓库开锁命令: @' + g_GameCommand.UNLOCKSTORAGE.sCmd + #13#10
+ '仓库加锁命令: @' + g_GameCommand.Lock.sCmd + #13#10
+ '设置密码命令: @' + g_GameCommand.SETPASSWORD.sCmd + #13#10
+ '修改密码命令: @' + g_GameCommand.CHGPASSWORD.sCmd);
end;
Exit;
end;
for i := m_StorageItemList.Count - 1 downto 0 do begin
UserItem := m_StorageItemList.Items[i];
//取自定义物品名称
sName := '';
ItemUnit.GetCustomItemName(UserItem, sName);
if (UserItem.MakeIndex = nItemIdx) and (CompareText(sMsg, sName) = 0) then begin
if (IsAddWeightAvailable(UserEngine.GetStdItemWeight(UserItem.wIndex))) then begin
if (Merchant <> nil) and
(Merchant.m_boGetback) and //检查NPC是否允许取物品
((IsEnvir(Merchant.m_PEnvir) and
(abs(Merchant.m_nCurrX - m_nCurrX) < 15) and
(abs(Merchant.m_nCurrY - m_nCurrY) < 15)) or (Merchant = g_FunctionNPC)) then begin
if AddItemToBag(UserItem) then begin
SendAddItem(UserItem);
m_StorageItemList.Delete(i);
if boFast then begin
SendDefMessage(3039, nItemIdx, 1, 3, 0, '');
end else
SendDefMessage(SM_TAKEBACKSTORAGEITEM_OK, nItemIdx, 0, 0, 0, '');
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem.boGameLog = 1 then
AddGameDataLog('0' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
StdItem.Name + #9 +
IntToStr(UserItem.MakeIndex) + #9 +
'1' + #9 +
'0');
m_sScriptParam[0] := StdItem.Name;
m_sScriptParam[1] := IntToStr(UserItem.MakeIndex);
ExecuteScript(g_FunctionNPC, '@仓库取物品');
end else begin
SendDefMessage(SM_TAKEBACKSTORAGEITEM_FULLBAG, 0, 0, 0, 0, '');
end;
bo19 := True;
end;
end else begin
SysMsg(g_sCanotGetItems {'无法携带更多的东西!!!'}, c_Red, t_Hint);
end;
Break;
end;
end;
if not bo19 then SendDefMessage(SM_TAKEBACKSTORAGEITEM_FAIL, 0, 0, 0, 0, '');
end;
procedure TPlayObject.ClientTakeItemOutTreasureBox(nItemID: Integer);
var
i, ii : Integer;
tm : DWORD;
UserItem : pTUserItem;
StdItem : pTStdItem;
begin
if m_TreasureBoxItem = nil then Exit;
tm := MakeLong(MakeWord(m_TreasureBoxItem.btValue[4], m_TreasureBoxItem.btValue[5]), MakeWord(m_TreasureBoxItem.btValue[6], m_TreasureBoxItem.btValue[7]));
if (tm < DateTimeToWolTimeEx(Now)) and (tm <> 0) then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, sNeedInjectPower);
Exit;
end;
for i := m_TreasureBoxItemList.Count - 1 downto 0 do begin
UserItem := m_TreasureBoxItemList.Items[i];
if (UserItem <> nil) and (UserItem.MakeIndex = nItemID) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem = nil then Break;
if IsEnoughBag and IsAddWeightAvailable(UserEngine.GetStdItemWeight(UserItem.wIndex)) then begin
m_TreasureBoxItemList.Delete(i);
SendDefMessage(CM_TREASUREBOX, nItemID, 2, 0, 0, '');
m_ItemList.Add(UserItem);
SendAddItem(UserItem);
WeightChanged();
end else begin
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SysMsg('包裹空间或者负重不够!!!', c_Red, t_Hint);
end;
Break;
end;
end;
end;
procedure TPlayObject.ClientTakeItemToTreasureBox(nItemID: Integer);
var
i, ii : Integer;
tm : DWORD;
UserItem : pTUserItem;
StdItem : pTStdItem;
begin
if m_TreasureBoxItem = nil then Exit;
if (m_TreasureBoxItemList.Count >= m_TreasureBoxItem.DuraMax) then begin
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, '你的灵犀宝盒空间已满,不能存放更多物品');
Exit;
end;
tm := MakeLong(MakeWord(m_TreasureBoxItem.btValue[4], m_TreasureBoxItem.btValue[5]), MakeWord(m_TreasureBoxItem.btValue[6], m_TreasureBoxItem.btValue[7]));
if (tm < DateTimeToWolTimeEx(Now)) and (tm <> 0) then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, sNeedInjectPower);
Exit;
end;
for i := m_ItemList.Count - 1 downto 0 do begin
UserItem := m_ItemList.Items[i];
if (UserItem <> nil) and (UserItem.MakeIndex = nItemID) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem = nil then Break;
{物品控制-禁止放入灵犀宝盒}
if CheckSPCode(StdItem.SPCode, SP_DISABLEGINREASUREBOX) then begin
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, Format(sCanNotInTreasureBox, [StdItem.Name]));
Break;
end;
//魂佑灵兽禁止放入灵犀宝盒
if (StdItem.StdMode = 49) and (StdItem.Shape = 51) and (UserItem.btItemExt[29] >= 2) then begin
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
Exit;
end;
{已放出豹禁止放入灵犀}
if IsDownPetItem(UserItem.MakeIndex) then begin
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
Exit;
end;
m_ItemList.Delete(i);
m_TreasureBoxItemList.Add(UserItem);
SendDefMessage(CM_TREASUREBOX, nItemID, 3, 0, 0, '');
WeightChanged();
Break;
end;
end;
end;
//取下装备
procedure TPlayObject.ClientTakeOffItems(btWhere: byte; nItemIdx: Integer; sItemName: string);
var
N10, i : Integer;
StdItem : pTStdItem;
UserItem : pTUserItem;
sName : string;
nCheckCode : Integer;
label
FailExit;
begin
N10 := 0;
nCheckCode := 0;
if m_PEnvir.m_MapFlag.boNOTAKEON then begin
SysMsg('当前地图禁止取下物品!!!', c_Red, t_Hint);
N10 := -4;
goto FailExit;
end;
if (btWhere = U_RIDEDRESS) or m_boInosculatePneuma then begin
N10 := -4;
goto FailExit;
end;
if not m_boDealing and (btWhere < MAX_HUMITEM_COUNT) then begin
if m_UseItems[btWhere].wIndex > 0 then begin
if m_UseItems[btWhere].MakeIndex = nItemIdx then begin
StdItem := UserEngine.GetStdItem(m_UseItems[btWhere].wIndex);
if (StdItem <> nil) then begin
if (StdItem.StdMode in [15, 19, 20, 21, 22, 23, 24, 26]) then begin
if (not m_boUserUnLockDurg) and (m_UseItems[btWhere].btValue[10] <> 0) then begin
SysMsg(g_sCanotTakeOffItem {'无法取下物品!!!'}, c_Red, t_Hint);
N10 := -4;
goto FailExit;
end;
end;
//物品控制-禁止取下物品
if CheckSPCode(StdItem.SPCode, SP_DISABLETAKEOFF) then begin
SysMsg(g_sCanotTakeOffItem {'无法取下物品!!!'}, c_Red, t_Hint);
N10 := -4;
goto FailExit;
end;
//取下的是马牌
try
if (StdItem.StdMode = 33) then begin
nCheckCode := 1;
if m_Horse <> nil then begin //下马状态
HorseHide;
if m_PEnvir.m_MapFlag.boRideOn then
SysMsg('你的' + HorseName + '已被收起', c_Red, t_Hint);
end else begin //在马上,或者这个地图不能骑马
if m_PEnvir.m_MapFlag.boRideOn and (HorseName <> '') then
SysMsg('你的' + HorseName + '已被收起', c_Red, t_Hint);
end;
m_btHorseType := 0;
HorseName := '';
if m_boRideOn and (m_PetInfo[2].nMakeIndex = 0) then m_boRideOn := False; //本体骑乘灵兽
end;
//虎王盾
if (StdItem.StdMode = 12) and (StdItem.Shape in [61..72]) and (m_Tiger <> nil) then begin
ClientReCallTiger;
end;
except
end;
//取自定义物品名称
sName := '';
ItemUnit.GetCustomItemName(@m_UseItems[btWhere], sName);
if (CompareText(sItemName, sName) = 0) then begin
New(UserItem);
UserItem^ := m_UseItems[btWhere];
if AddItemToBag(UserItem) then begin
m_UseItems[btWhere].wIndex := 0;
//取下装备触发脚本
SendAddItem(UserItem);
SendDefMessage(SM_TAKEOFF_OK, GetFeatureToLong(Self), GetGender, 0, 0, '');
RecalcAbilitys(True);
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
//刷新镶嵌玉石的属性
if (btWhere in [U_NECKLACE..U_BELT]) and (StdItem.StdItemAdd.btHole > 0) and
(m_UseItems[btWhere]).IsGem then begin
RecalcGemSacredDam();
end;
m_sScriptParam[0] := StdItem.Name;
m_sScriptParam[1] := StdItem.FilterName;
m_sScriptParam[2] := IntToStr(btWhere);
if not ExecuteScript(g_FunctionNPC, '@TakeOff' + IntToStr(btWhere)) then
ExecuteScript(g_FunctionNPC, '@TakeOffAll');
if btWhere = 0 then begin
m_nMagicStatus := GetMagicStatus;
Status2Changed;
end;
FeatureChanged();
end else begin
Dispose(UserItem);
N10 := -3;
end;
end;
end;
end;
end else N10 := -2;
end else N10 := -1;
FailExit:
if N10 <= 0 then
SendDefMessage(SM_TAKEOFF_FAIL, N10, 0, 0, 0, '');
end;
//装备物品 MakeIndex
function TPlayObject.ClientTakeOnItems(btWhere: byte; nItemIdx: Integer; sItemName: string; boFlag: Boolean): Boolean; //004DAC70
var
i, n14, n18, j : Integer;
UserItem, TakeoffItem : pTUserItem;
StdItem, StdItem20 : pTStdItem;
StdItem58 : TStdItem;
sName : string;
boCanTakeOn, boSacredBelt : Boolean;
label
FailExit;
begin
StdItem := nil;
UserItem := nil;
Result := False;
n14 := -1;
if m_PEnvir.m_MapFlag.boNOTAKEON then begin
SysMsg('当前地图禁止穿戴物品!!!', c_Red, t_Hint);
n18 := -1;
goto FailExit;
end;
if (btWhere = U_RIDEDRESS) or m_boInosculatePneuma then begin
n18 := -1;
goto FailExit;
end;
if m_boPneuma then begin
//灵珠状态下不能使用武器
if (btWhere = U_WEAPON) and m_boPneumaEffMode then begin
n18 := -1;
goto FailExit;
end;
end;
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[i]; //包裹里的物品
if (UserItem <> nil) and (UserItem.MakeIndex = nItemIdx) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
sName := '';
ItemUnit.GetCustomItemName(UserItem, sName);
if (CompareText(sItemName, sName) = 0) then begin
n14 := i;
Break;
end;
end;
end;
UserItem := nil;
end;
n18 := 0;
if (StdItem <> nil) and (UserItem <> nil) then begin
if CheckUserItems(btWhere, StdItem) then begin
//物品控制-禁止元神、红名、本体穿戴
if m_boPneuma then
boCanTakeOn := not (CheckSPCode(StdItem.SPCode, SP_DISABLEPNEUMATAKEON))
else if (PKLevel > 2) then
boCanTakeOn := not (CheckSPCode(StdItem.SPCode, SP_DISABLEREDTAKEON))
else
boCanTakeOn := not (CheckSPCode(StdItem.SPCode, SP_DISABLEHUMANTAKEON));
if boCanTakeOn then begin
case StdItem.NeedRace of
1: begin
if m_btJob < 3 then begin
boCanTakeOn := False;
{此物品仅支持妖士佩戴!!!}
end;
end;
3: begin
if m_btJob <> 0 then begin
boCanTakeOn := False;
{此物品仅支持战士佩戴!!!}
end;
end;
4: begin
if m_btJob <> 1 then begin
boCanTakeOn := False;
{此物品仅支持法师佩戴!!!}
end;
end;
5: begin
if m_btJob <> 2 then begin
boCanTakeOn := False;
{此物品仅支持道士佩戴!!!}
end;
end;
6: begin
if (m_btJob <> 0) and (m_btJob <> 1) then begin
boCanTakeOn := False;
{此物品仅支持战士、法师佩戴!!!}
end;
end;
7: begin
if (m_btJob <> 0) and (m_btJob <> 2) then begin
boCanTakeOn := False;
{此物品仅支持战士、道士佩戴!!!}
end;
end;
8: begin
if (m_btJob <> 0) and (m_btJob <> 3) then begin
boCanTakeOn := False;
{此物品仅支持战士、妖士佩戴!!!}
end;
end;
9: begin
if (m_btJob <> 1) and (m_btJob <> 2) then begin
boCanTakeOn := False;
{此物品仅支持法师、道士佩戴!!!}
end;
end;
10: begin
if (m_btJob <> 1) and (m_btJob <> 3) then begin
boCanTakeOn := False;
{此物品仅支持法师、妖士佩戴!!!}
end;
end;
11: begin
if (m_btJob <> 2) and (m_btJob <> 3) then begin
boCanTakeOn := False;
{此物品仅支持道士、妖士佩戴!!!}
end;
end;
12: begin
if (m_btJob <> 1) and (m_btJob <> 2) and (m_btJob <> 3) then begin
boCanTakeOn := False;
{此物品仅支持法师、道士、妖士佩戴!!!}
end;
end;
13: begin
if (m_btJob <> 0) and (m_btJob <> 2) and (m_btJob <> 3) then begin
boCanTakeOn := False;
{此物品仅支持战士、道士、妖士佩戴!!!}
end;
end;
14: begin
if (m_btJob <> 0) and (m_btJob <> 1) and (m_btJob <> 3) then begin
boCanTakeOn := False;
{此物品仅支持战士、法师、妖士佩戴!!!}
end;
end;
end;
end;
if not boCanTakeOn then begin
SysMsg('你不能佩戴此物品!!!', c_Red, t_Hint);
n18 := -1;
goto FailExit;
end;
//马牌检测
if (StdItem.StdMode = 33) and (m_btHorseType <> 0) then begin
n18 := -1;
end;
if m_boPneuma then begin
//破碎装备不能佩戴
if (UserItem.btItemExt[4] = 4) and (UserItem.Dura <= 0) then begin
n18 := -1;
goto FailExit;
end;
end;
StdItem58 := StdItem^;
ItemUnit.GetItemAddValue(UserItem, StdItem58);
if (n18 = 0) and CheckTakeOnItems(btWhere, StdItem58) and CheckItemBindUse(UserItem) then begin
TakeoffItem := nil;
if btWhere in [0..MAX_HUMITEM_COUNT - 1] then begin
//取下物品
if m_UseItems[btWhere].wIndex > 0 then begin //当前位置已装备了物品,则取下
StdItem20 := UserEngine.GetStdItem(m_UseItems[btWhere].wIndex);
if (StdItem20 <> nil) then begin
if (StdItem20.StdMode in [15, 19, 20, 21, 22, 23, 24, 26]) then begin //神秘物品
if (not m_boUserUnLockDurg) and (m_UseItems[btWhere].btValue[10] <> 0) then begin
SysMsg(g_sCanotTakeOffItem {'无法取下物品!!!'}, c_Red, t_Hint);
n18 := -4;
goto FailExit;
end;
end;
if not m_boUserUnLockDurg and ((StdItem20.Reserved and 2) <> 0) then begin
SysMsg(g_sCanotTakeOffItem {'无法取下物品!!!'}, c_Red, t_Hint);
n18 := -4;
goto FailExit;
end; //004DAE78
if (StdItem20.Reserved and 4) <> 0 then begin
SysMsg(g_sCanotTakeOffItem {'无法取下物品!!!'}, c_Red, t_Hint);
n18 := -4;
goto FailExit;
end;
//物品控制-禁止取下物品
if CheckSPCode(StdItem20.SPCode, SP_DISABLETAKEOFF) then begin
SysMsg(g_sCanotTakeOffItem {'无法取下物品!!!'}, c_Red, t_Hint);
n18 := -4;
goto FailExit;
end;
if StdItem20.StdMode = 33 then begin //取下马牌
HorseHide;
if m_boRideOn and (m_PetInfo[2].nMakeIndex = 0) then begin
m_boRideOn := False;
end;
if m_PEnvir.m_MapFlag.boRideOn then
SysMsg('你的' + HorseName + '被收起', c_Red, t_Hint); //只有可以骑马的地图才提示
end;
HorseName := '';
//虎王盾
if (StdItem.StdMode = 12) and (StdItem.Shape in [61..72]) and (m_Tiger <> nil) then begin
ClientReCallTiger;
end;
end;
New(TakeoffItem);
TakeoffItem^ := m_UseItems[btWhere];
//取下装备触发脚本
if (TakeoffItem <> nil) then begin
m_sScriptParam[0] := StdItem20.Name;
m_sScriptParam[1] := StdItem20.FilterName;
m_sScriptParam[2] := IntToStr(btWhere);
if not ExecuteScript(g_FunctionNPC, '@TakeOff' + IntToStr(btWhere)) then
ExecuteScript(g_FunctionNPC, '@TakeOffAll');
end;
end;
if (StdItem58.StdMode in [15, 19, 20, 21, 22, 23, 24, 26]) then begin
if StdItem.Shape in [130, 131, 132] then begin
if (UserItem.btValue[14] <> 0) then
UserItem.btValue[14] := 0;
SendUpdateItem(UserItem);
end;
end;
m_UseItems[btWhere] := UserItem^;
DelBagItem(n14);
boCanTakeOn := False;
if TakeoffItem <> nil then begin
AddItemToBag(TakeoffItem);
SendAddItem(TakeoffItem);
if TakeoffItem^.IsGem then
boCanTakeOn := True;
end;
//马牌的处理:装上马牌
if StdItem.StdMode = 33 then begin
//取得马的名字
m_btHorseType := StdItem.Shape;
if m_btHorseType = 0 then begin
m_btHorseType := UserItem.btValue[0];
HorseName := UserEngine.GetHorseName(UserItem);
end else begin
HorseName := StdItem.Name;
ArrestStringEx(StdItem.Name, '(', ')', HorseName);
end;
if m_btHorseType in [51..60] then Dec(m_btHorseType, 50);
//地图允许骑马,则生成马
if not boFlag then begin
//扣持久
m_UseItems[btWhere].Dura := m_UseItems[btWhere].Dura - 500;
if m_UseItems[btWhere].Dura <= 0 then begin
SendDelItems(@m_UseItems[btWhere]);
m_UseItems[btWhere].wIndex := 0;
end else
SendMsg(Self, RM_DURACHANGE, btWhere, m_UseItems[btWhere].Dura, m_UseItems[btWhere].DuraMax, 0, '');
if (m_UseItems[btWhere].wIndex > 0) and (m_btHorseType > 0) and (HorseName <> '') then begin
if (m_PEnvir.m_MapFlag.boRideOn) then begin
m_Horse := MakeSlave(HorseName, 7, 7, 100, 24 * 60 * 60, -1);
if m_Horse <> nil then begin
m_Horse.TurnTo(m_btDirection);
SysMsg('你的' + HorseName + '被放出', c_Red, t_Hint);
SendDefMessage(34977, m_Horse.m_wAppr, 612, 1, 0, '');
end else
SysMsg('释放马失败', c_Red, t_Hint);
end else begin
m_Horse := nil;
if m_UseItems[btWhere].wIndex > 0 then
SysMsg('本地图不允许骑宠', c_Red, t_Hint);
end;
end;
end else
SendMsg(Self, RM_TAKEON2, btWhere, m_UseItems[btWhere].MakeIndex, 0, 0, '');
{超级技能项链}
end else if StdItem.StdMode = 18 then begin
if CheckUserItemTimeOut(@m_UseItems[btWhere], StdItem) then begin
m_UseItems[btWhere].wIndex := 0;
SendDelItems(@m_UseItems[btWhere]);
SysMsg(Format('你的%s已经到期', [StdItem.FilterName]), c_Red, t_Hint);
n18 := -1;
goto FailExit;
end;
{灵鼠神佑、金牛神佑}
end else if StdItem.StdMode = 29 then begin
if CheckUserItemTimeOut(@m_UseItems[btWhere], StdItem) then begin
m_UseItems[btWhere].wIndex := 0;
SendDelItems(@m_UseItems[btWhere]);
SysMsg(Format('你的%s已经到期', [StdItem.FilterName]), c_Red, t_Hint);
n18 := -1;
goto FailExit;
end;
end else if (StdItem.StdMode = 6) and (StdItem.Shape = 20) then begin
if CheckUserItemTimeOut(@m_UseItems[btWhere], StdItem) then begin
m_UseItems[btWhere].wIndex := 0;
SendDelItems(@m_UseItems[btWhere]);
SysMsg(Format('你的%s已经到期', [StdItem.FilterName]), c_Red, t_Hint);
n18 := -1;
goto FailExit;
end;
end;
//检查要装备的物品是否已经附魔
if (m_UseItems[btWhere].Evil.MakeIndex <> 0) and (m_UseItems[btWhere].Evil.sName <> '') then begin
if not m_boPneuma then //人物穿戴
SysMsg('主体佩带附魔装备,不能发挥出附魔属性的威力,请将附魔装备给元神佩带!', c_Red, t_Hint)
end;
boSacredBelt := m_boSacredBelt;
RecalcAbilitys(True);
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
//刷新镶嵌玉石的属性
if (btWhere in [U_NECKLACE..U_BELT]) and
(((StdItem.StdItemAdd.btHole > 0) and (m_UseItems[btWhere]).IsGem) or boCanTakeOn) then begin
RecalcGemSacredDam();
end;
//神圣腰带
if m_boSacredBelt and (not boSacredBelt) then
SendDefMessage(SM_HOLYBELT, Integer(Self), 3, 0, 0, '');
//穿上装备触发脚本
m_sScriptParam[0] := StdItem.Name;
m_sScriptParam[1] := StdItem.FilterName;
m_sScriptParam[2] := IntToStr(btWhere);
if not ExecuteScript(g_FunctionNPC, '@TakeOn' + IntToStr(btWhere)) then
ExecuteScript(g_FunctionNPC, '@TakeOnAll');
if btWhere = 0 then begin
if m_UseItems[btWhere].btValue[10] = 0 then begin
m_UseItems[btWhere].btValue[14] := Random(16);
m_UseItems[btWhere].btValue[10] := 1;
end;
m_nMagicStatus := GetMagicStatus;
Status2Changed;
end;
n18 := 1;
FeatureChanged();
SendDefMessage(SM_TAKEON_OK, GetFeatureToLong(Self), GetGender, 0, 0, '');
if m_UseItems[btWhere].IsGod() then begin
if (StdItem58.StdMode = 5) then begin
if m_UseItems[btWhere].btItemExt[20] >= 100 then begin
Dec(m_UseItems[btWhere].btItemExt[20], _Max(m_UseItems[btWhere].btValue[19], 1));
end;
m_UseItems[btWhere].btValue[15] := 0;
m_UseItems[btWhere].btValue[17] := 0;
SendDelayMsg(Self, RM_SENDGODUSEVAL, 0, m_UseItems[btWhere].btItemExt[20], 0, 0, '', 500);
end else if (StdItem58.StdMode in [10, 11]) then
SendDelayMsg(Self, RM_SENDGODUSEVAL, 1, m_UseItems[btWhere].btValue[15], 0, 0, '', 500);
end;
Result := True;
end;
end else n18 := -1;
end else n18 := -1;
end;
FailExit:
if n18 <= 0 then
SendDefMessage(SM_TAKEON_FAIL, n18, 0, 0, 0, '');
end;
procedure TPlayObject.ClientTakeOnTigerItem(nWhere, nMakeIndex: Integer);
var
n18, n14, i : Integer;
StdItem : pTStdItem;
UserItem, TakeoffItem : pTUserItem;
sName : string;
StdItem18 : TStdItem;
label
FailExit;
begin
if m_boPneuma then Exit;
if m_btJob = 3 then Exit; //妖士是没有虎王盾的
StdItem := nil;
UserItem := nil;
n14 := -1;
n18 := 0;
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[i]; //包裹里的物品
if (UserItem <> nil) and (UserItem.MakeIndex = nMakeIndex) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
n14 := i;
Break;
end;
end;
UserItem := nil;
end;
if (m_Tiger <> nil) and (StdItem <> nil) and (UserItem <> nil) then begin
if CheckTigerUserItems(nWhere, StdItem) then begin
StdItem18 := StdItem^;
if (m_TorDDM.Tiger.DB.Dragon <> StdItem18.Shape) then begin
if StdItem18.Shape = 0 then
SysMsg('请先招出虎王', c_Red, t_Hint)
else
SysMsg('请先招出龙王', c_Red, t_Hint);
n18 := -1;
goto FailExit;
end;
if (m_TorDDM.Tiger.DB.level < StdItem18.NeedLevel) then begin
SysMsg('等级不满足条件,无法佩戴。', c_Red, t_Hint);
n18 := -1;
goto FailExit;
end;
TakeoffItem := nil;
if nWhere in [0..MAX_TIGER_ITEM_COUNT - 1] then begin
//取下物品
if m_TorDDM.Tiger.Items[nWhere].wIndex > 0 then begin
New(TakeoffItem);
TakeoffItem^ := m_TorDDM.Tiger.Items[nWhere];
end;
m_TorDDM.Tiger.Items[nWhere] := UserItem^;
DelBagItem(n14);
if TakeoffItem <> nil then begin
AddItemToBag(TakeoffItem);
SendAddItem(TakeoffItem);
end;
n18 := 1;
SendDefMessage(SM_TAKETIGER_OK, 1, 1, 0, 0, '');
RecalcTigerAbility;
end;
end;
end;
FailExit:
if n18 <= 0 then
SendDefMessage(SM_TAKEON_FAIL, n18, 0, 0, 0, '');
end;
procedure TPlayObject.ClientTakeOffTigerItem(nWhere, nMakeIndex: Integer);
var
n18 : Integer;
StdItem : pTStdItem;
UserItem : pTUserItem;
label
FailExit;
begin
if m_boPneuma then Exit;
if m_btJob = 3 then Exit; //妖士是没有虎王盾的
n18 := 0;
if nWhere in [0..MAX_TIGER_ITEM_COUNT - 1] then begin
if m_TorDDM.Tiger.Items[nWhere].wIndex > 0 then begin
if m_TorDDM.Tiger.Items[nWhere].MakeIndex = nMakeIndex then begin
StdItem := UserEngine.GetStdItem(m_TorDDM.Tiger.Items[nWhere].wIndex);
if (StdItem <> nil) then begin
New(UserItem);
UserItem^ := m_TorDDM.Tiger.Items[nWhere];
if AddItemToBag(UserItem) then begin
m_TorDDM.Tiger.Items[nWhere].wIndex := 0;
SendAddItem(UserItem);
SendDefMessage(SM_TAKETIGER_OK, 0, 1, 0, 0, '');
RecalcTigerAbility;
n18 := 1;
end else begin
Dispose(UserItem);
n18 := -1;
end;
end;
end;
end;
end;
FailExit:
if n18 <= 0 then
SendDefMessage(SM_TAKEOFF_FAIL, n18, 0, 0, 0, '');
end;
procedure TPlayObject.ClientUPGradeTreasureBox(nCount: Integer; sBuf: string);
var
i, j, nCode : Integer;
sMsg : string;
ANpc : TNormNpc;
buf : array[0..5] of Integer;
UserItem : pTUserItem;
pUserItems : array[0..5] of pTUserItem;
pStdItems : array[0..5] of pTStdItem;
tm : DWORD;
begin
if (m_ClickNPC = nil) or (nCount <= 0) or (nCount > 6) then Exit;
ANpc := TNormNpc(m_ClickNPC);
FillChar(buf, SizeOf(Integer) * 6, 0);
DeCodeBuffer(sBuf, @buf[0], SizeOf(Integer) * nCount);
nCode := 0;
if (m_TreasureBoxItem = nil) then begin
nCode := -1;
sMsg := '你的灵犀宝盒还没有注入灵力,无法强化';
end;
if (nCode = 0) then begin
tm := MakeLong(MakeWord(m_TreasureBoxItem.btValue[4], m_TreasureBoxItem.btValue[5]), MakeWord(m_TreasureBoxItem.btValue[6], m_TreasureBoxItem.btValue[7]));
if (tm < DateTimeToWolTimeEx(Now)) and (tm <> 0) then begin
sMsg := '你的灵犀宝盒灵力已经耗尽,无法强化';
Exit;
end;
end;
if (nCode = 0) then begin
tm := MakeLong(MakeWord(m_TreasureBoxItem.btValue[4], m_TreasureBoxItem.btValue[5]), MakeWord(m_TreasureBoxItem.btValue[6], m_TreasureBoxItem.btValue[7]));
if (tm = 0) then begin
nCode := -1;
sMsg := '你的灵犀宝盒已经强化,不需要再次强化';
end;
end;
if (nCode = 0) then begin
for i := 0 to nCount - 1 do begin
for j := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList[j];
if UserItem.MakeIndex = buf[i] then begin
pUserItems[i] := UserItem;
pStdItems[i] := UserEngine.GetStdItem(UserItem.wIndex);
Break;
end;
end;
if ((pUserItems[i] = nil) or (pStdItems[i] = nil)) and (buf[i] <> 0) then begin
nCode := -1;
sMsg := '没有在你的包裹中发现强化宝盒所需要的元灵晶石或幸运符';
Break;
end;
end;
end;
{函数触发开始}
if (nCode = 0) then begin
m_sScriptParam[0] := IntToStr(nCount);
for i := 0 to nCount - 1 do begin
if pUserItems[i] <> nil then begin
m_sScriptParam[i + 1] := IntToStr(pUserItems[i].MakeIndex);
{$IF USESDK = DEBUG}
SysMsg(Format('物品%d:%d', [i, pUserItems[i].MakeIndex]), c_Pink, t_Hint);
{$IFEND}
end;
end;
if (IsEnvir(ANpc.m_PEnvir) and
(abs(ANpc.m_nCurrX - m_nCurrX) < 15) and
(abs(ANpc.m_nCurrY - m_nCurrY) < 15)) or (ANpc.m_boIsHide) then begin
ANpc.GotoLable(Self, '@强化灵犀宝盒', False);
end;
end;
if (nCode <> 0) and (sMsg <> '') then begin
SendMsg(ANpc, RM_MERCHANTDLGCLOSE, 0, Integer(ANpc), 0, 0, '');
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, sMsg);
end;
end;
//使用物品
procedure TPlayObject.ClientUseItems(nItemIdx: Integer; sItemName: string; nPackIdx: Integer);
//根据物品名字获得打包后的物品Shape
function GetBindItemShape(sName: string): Integer;
var
i : Integer;
begin
Result := -1;
for i := 0 to g_UnbindList.Count - 1 do begin
if g_UnbindList.Strings[i] = sName then begin
Result := Integer(g_UnbindList.Objects[i]);
Break;
end;
end;
end;
//叠加物品
function PileItems(UserItem: pTUserItem; nMakeIndex: Integer; pStd: pTStdItem): Boolean;
var
i : Integer;
PileItem : pTUserItem;
nCount : Integer;
begin
Result := False;
//获得要叠加的物品
nCount := 0;
for i := 0 to m_ItemList.Count - 1 do begin
if (pTUserItem(m_ItemList[i]).MakeIndex = nMakeIndex) and
(pTUserItem(m_ItemList[i]).wIndex = UserItem.wIndex) and (pTUserItem(m_ItemList[i]).Dura > 0) then
begin
PileItem := pTUserItem(m_ItemList[i]);
Result := True;
Break;
end;
end;
if Result then begin
//叠加上限检测
if (UserItem.Dura >= pStd.Stock) or (PileItem.Dura >= pStd.Stock) then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, g_sCanotPileItemsMsg);
Result := True;
Exit;
end;
//检测绑定
if (UserItem.btItemExt[4] = 1) or (PileItem.btItemExt[4] = 1) then begin
UserItem.btItemExt[4] := 1;
end;
//检测持久
if (UserItem.Dura + PileItem.Dura) > pStd.Stock then begin
nCount := pStd.Stock - UserItem.Dura;
Dec(PileItem.Dura, nCount);
SendUpdateItem(PileItem);
end else begin
nCount := PileItem.Dura;
SendDelItems(PileItem);
DelBagItem(PileItem.MakeIndex, pStd.Name);
end;
Inc(UserItem.Dura, nCount);
SendUpdateItem(UserItem);
end;
end;
//乾坤袋打包物品
function PackageItems(nMakeIndex: Integer): Boolean;
var
i : Integer;
UserItem : pTUserItem;
BindItem : pTStdItem;
pStdItem : pTStdItem;
nItemIdx : Integer;
nCount : Integer;
nShape : Integer;
begin
Result := False;
//获得要打包的物品名字
nItemIdx := -1;
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := pTUserItem(m_ItemList[i]);
if (UserItem.wIndex > 0) and (UserItem.MakeIndex = nMakeIndex) then begin
pStdItem := UserEngine.GetStdItem(UserItem.wIndex);
nItemIdx := UserItem.wIndex;
if pStdItem <> nil then Result := True;
Break;
end;
end;
if Result then begin //如果获得名字,则获得打包后的物品
nShape := GetBindItemShape(pStdItem.Name);
BindItem := UserEngine.GetBindItem(nShape);
if (BindItem = nil) then Result := False;
end;
if Result then begin
//检查要打包的物品数量够不够
nCount := 0;
for i := m_ItemList.Count - 1 downto 0 do begin
UserItem := pTUserItem(m_ItemList[i]);
if (UserItem.wIndex > 0) and (UserItem.Dura = UserItem.DuraMax) and (UserItem.wIndex = nItemIdx) then Inc(nCount);
end;
if nCount < 6 then begin
SysMsg(pStdItem.FilterName + '数量不足6个,不可被乾坤药袋收纳。', c_Red, t_Hint);
Result := False;
end else begin
//删除6个要打包的物品
nCount := 0;
for i := m_ItemList.Count - 1 downto 0 do begin
UserItem := pTUserItem(m_ItemList[i]);
if (UserItem.wIndex > 0) and (UserItem.wIndex = nItemIdx) then begin
SendDelItems(UserItem);
Dispose(UserItem);
m_ItemList.Delete(i);
Inc(nCount);
if nCount >= 6 then Break;
end;
end;
//给一个打包后的物品
New(UserItem);
if UserEngine.CopyToUserItemFromName(BindItem.Name, UserItem) then begin
m_ItemList.Add(UserItem);
SendAddItem(UserItem);
end else begin
Dispose(UserItem);
Result := False;
end;
WeightChanged; //重量改变
end;
end else begin
SysMsg('此物品不可被乾坤药袋收纳', c_Red, t_Hint);
end;
end;
function CheckUserItemTimeOut(UserItem: pTUserItem; StdItem: pTStdItem): Boolean;
var
tm, nowtm : DWORD;
begin
Result := False;
tm := MakeLong(MakeWord(UserItem.btValue[0], UserItem.btValue[1]),
MakeWord(UserItem.btValue[2], UserItem.btValue[3]));
if (tm = 0) and (StdItem.Shape <> 53) then begin //第一次使用
tm := DateTimeToWolTIme(Now);
UserItem.btValue[0] := LoByte(LoWord(tm));
UserItem.btValue[1] := HiByte(LoWord(tm));
UserItem.btValue[2] := LoByte(HiWord(tm));
UserItem.btValue[3] := HiByte(HiWord(tm));
UserItem.btItemExt[4] := 1; //绑定
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
case StdItem.Shape of
1, 2, 3, 4, 22, 51, 52, 53: ;
61..80: begin
SysMsg('您开启了小时卡,使用期限:开启后' + IntToStr(UserItem.Dura) + '小时。', c_Red, t_Hint);
end else begin
SysMsg('您开启了天数卡,使用期限:开启后' + IntToStr(UserItem.Dura) + '天。', c_Red, t_Hint);
end;
end;
end else begin
nowtm := DateTimeToWolTIme(Now);
if (tm + UserItem.Dura * 86400 < nowtm) or
((StdItem.Shape in [61..80]) and (tm + UserItem.Dura * 3600 < nowtm)) then begin
Result := True;
SysMsg('该物品已经到期', c_Red, t_Hint);
end;
end;
end;
var
j, n14, i : Integer;
boEatOK, boFind : Boolean;
UserItem, UserItem2 : pTUserItem;
ObjList : TList;
StdItem : pTStdItem;
StdItem2 : pTStdItem;
StdItem3 : pTStdItem;
StdItem24 : TStdItem;
UserItem34 : TUserItem;
Monster, BaseObject : TBaseObject;
nX, nY, nCode, nCheckCode : Integer;
sMAP, sTmp : string;
tm : DWORD;
TargeList : array of Integer;
UserMagic : pTUserMagic;
Magic : pTMagic;
label
EAT_END;
resourcestring
sExceptionMsg = 'CM_EAT:: %d 人物:%s,参数:%d,%s,%d';
begin
nCheckCode := 0;
boEatOK := False;
n14 := 0;
m_nEatItemMakeIndex := 0;
m_sScriptParam[0] := '';
m_sScriptParam[1] := '';
m_sScriptParam[2] := '';
m_sScriptParam[3] := '';
m_sScriptParam[4] := '';
m_sScriptParam[5] := '';
Monster := nil;
try
StdItem := nil;
if m_boCanUseItem then begin
if not m_boDeath then begin
nCheckCode := 1;
GetUserItemByMakeIndex(nItemIdx, UserItem);
if (UserItem <> nil) and (UserItem.MakeIndex = nItemIdx) then begin
UserItem34 := UserItem^;
nCheckCode := 2;
StdItem := UserEngine.GetStdItem(UserItem34.wIndex);
if StdItem <> nil then begin //物品存在
m_sScriptParam[0] := IntToStr(nItemIdx);
m_sScriptParam[1] := IntToStr(nPackIdx);
m_sScriptParam[2] := StdItem.Name;
GetStdItemByMakeIndex(nPackIdx, StdItem3);
if StdItem3 <> nil then m_sScriptParam[3] := StdItem3.Name;
m_nEatItemMakeIndex := UserItem34.MakeIndex;
sItemName := StdItem.Name;
nCheckCode := 3;
//自动叠加的物品
if CheckSPCode(StdItem.Reserved, RE_ALLOWPILE) and (nPackIdx > 0) then begin
if PileItems(UserItem, nPackIdx, StdItem) then begin
m_nEatItemMakeIndex := 0;
boEatOK := False;
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
goto EAT_END;
end;
end;
{$IF USESDK = DEBUG}
SysMsg(Format('nItemIdx: %d; sItemName: %s;nPackIdx: %d', [nItemIdx, sItemName, nPackIdx]), c_Red, t_Hint);
{$IFEND}
//检查是否为本地图禁止使用的物品
if m_PEnvir.ForbidItem(sItemName) then begin
SysMsg('本地图禁止使用 ' + StdItem.FilterName, c_Red, t_Hint);
goto EAT_END;
end;
nCheckCode := 4;
//灵符类物品控制
if (StdItem.StdMode = 3) and (StdItem.Shape in [27, 29, 202, 203, 206, 207]) then begin
if m_PEnvir.m_MapFlag.boCanUseSuperItem and m_PEnvir.AllowSoulItem(sItemName) then begin
nCheckCode := 5;
if (nPackIdx > 0) then Monster := TBaseObject(nPackIdx);
nCheckCode := 6;
if (nPackIdx > 0) and CretInNear10XY(TBaseObject(nPackIdx), m_nCurrX, m_nCurrY) and (Monster <> nil) and (not Monster.m_boDeath) and (not Monster.m_boGhost) and (Monster.m_btRaceServer >= RC_ANIMAL) then
{$IF USESDK = DEBUG}
//SysMsg('灵符攻击目标有效', c_Red, t_Hint)
OutputDebugString('灵符攻击目标有效')
{$IFEND}
else
goto EAT_END;
end else begin
{$IF USESDK = DEBUG}
SysMsg('本地图不允许使用此道具。', c_Red, t_Hint);
{$IFEND}
goto EAT_END;
end;
end;
nCheckCode := 190;
case StdItem.StdMode of
0..2: begin //药,肉(食物)
if EatItems(StdItem) then begin
if (StdItem.StdMode = 0) and (StdItem.Shape in [200..202, 206, 207, 219]) then begin
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
if UserItem.Dura > 0 then Dec(UserItem.Dura);
if (UserItem.Dura <= 0) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end else begin
boEatOK := False;
//SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end;
end;
end else if (StdItem.StdMode = 0) and (StdItem.Shape = 211) then begin //海神生命神水
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
//n14 := _MIN(High(byte), LoWord(StdItem.AC)) * _Max(1, HiWord(StdItem.AC));
n14 := _MIN(m_WAbil.dwMaxHP - m_WAbil.dwHP, UserItem.Dura);
if n14 > 0 then begin
IncHealthSpell(n14, 0);
Dec(UserItem.Dura, n14);
end;
if (UserItem.Dura <= 0) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end else begin
boEatOK := False;
//SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end;
end;
end else if (StdItem.StdMode = 0) and (StdItem.Shape = 212) then begin //海神魔法神水
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
n14 := _MIN(m_WAbil.dwMaxMP - m_WAbil.dwMP, UserItem.Dura);
if n14 > 0 then begin
IncHealthSpell(0, n14);
Dec(UserItem.Dura, n14);
end;
if (UserItem.Dura <= 0) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end else begin
boEatOK := False;
//SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end;
end;
end else begin
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) and (StdItem.Shape <> 5) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end;
end;
end;
goto EAT_END;
end;
3: begin
case StdItem.Shape of
27, 29: begin //镇魔符、镇魔神符
if (not m_PEnvir.m_MapFlag.boCanReCallEvil) or
(Monster.m_btRaceServer <> RC_EVIL) or (Monster.m_Master <> nil) or (not IsProperTarget(Monster)) then begin
{$IF USESDK = DEBUG}
SysMsg(FilterItemShowName(StdItem.Name) + '攻击目标无效!', c_Red, t_Hint);
{$IFEND}
goto EAT_END;
end;
for j := 0 to m_SlaveList.Count - 1 do begin
if TBaseObject(m_SlaveList[j]).m_btRaceServer = RC_EVIL then begin
Inc(n14);
if n14 >= g_Config.nMaxRecallEvilCount then Break;
end;
end;
if n14 >= g_Config.nMaxRecallEvilCount then begin
SysMsg('你已无法召唤更多的心魔', c_Red, t_Hint);
goto EAT_END;
end;
TurnTo(GetNextDirection(m_nCurrX, m_nCurrY, Monster.m_nCurrX, Monster.m_nCurrY));
//显示一个效果
SendRefMsg(RM_ASSISTSKILL, $0D, Integer(Monster), m_btDirection, MakeLong(Monster.m_nCurrX, Monster.m_nCurrY), '');
if Random(g_Config.nRecallEvilRate) = 0 then begin
//镇魔符召怪
ExecuteScript(g_FunctionNPC, '@镇魔符召怪');
Monster.m_Master := Self;
Monster.m_btRaceImg := 254;
Monster.m_dwMasterRoyaltyTick := GetTickCount + 20 * 60 * 60 * 1000;
Monster.m_boSuperMan := g_Config.boEvilSlaveSuperMan;
Monster.RecalcAbilitys;
m_SlaveList.Add(Monster);
Monster.SetTargetCreat(m_TargetCret);
Monster.m_wStatusTimeArr[POISON_DONTMOVE] := 1;
Monster.HealthSpellChanged;
Monster.RefShowName;
Monster.SendRefMsg(RM_510, 1, 0, 72, 0, '');
//显示心魔控制面板
m_nEvilFollowerPower := _MIN(m_nEvilFollowerPowerMax, m_nEvilFollowerPower + StdItem.AC * 1000);
ClientQueryEvilFollower;
ClearEvilFollower(4);
m_dwClearObjTick := GetTickCount();
SendDefMessage(CM_RECALLEVIL, Integer(Self), 3, LoWord(m_nEvilFollowerPower), HiWord(m_nEvilFollowerPower), '');
end else begin
//镇魔符冻结心魔
Monster.MakePosion(POISON_DONTMOVE, Round(StdItem.AC / 10) * g_Config.nAntiEvilDontMoveTime, 0);
end;
{减少持久}
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
if UserItem.Dura > 0 then Dec(UserItem.Dura);
if (UserItem.Dura <= 0) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end else begin
boEatOK := False;
//SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end;
end;
end;
202, 203: begin //灵符
if (not IsProperTarget(Monster)) or (Monster.m_Master <> nil) or (Monster.m_boHideMode) or (CheckSPCode(Monster.m_dwRuleCtrlCode, SP_MON_DISABLELINGFU)) then begin
{$IF USESDK = DEBUG}
SysMsg('灵符攻击目标无效', c_Red, t_Hint);
{$IFEND}
boEatOK := False;
//SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
goto EAT_END;
end else begin
TurnTo(GetNextDirection(m_nCurrX, m_nCurrY, Monster.m_nCurrX, Monster.m_nCurrY));
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
if StdItem.Shape = 203 then begin //灵符(捆)
//快速救公主地图
if m_PEnvir.m_MapFlag.boFastUseItem then begin
n14 := 0;
SetLength(TargeList, 0);
ObjList := TList.Create;
try
m_PEnvir.GetRangeBaseObject(Monster.m_nCurrX, Monster.m_nCurrY, 20, True, ObjList);
for j := 0 to ObjList.Count - 1 do begin
BaseObject := TBaseObject(ObjList.Items[j]);
if (BaseObject = Monster) or (BaseObject.m_btRaceServer = RC_PRINCESSGUARD) or
(BaseObject.m_Master <> nil) or (BaseObject.m_boHideMode) or
CheckSPCode(BaseObject.m_dwRuleCtrlCode, SP_MON_DISABLELINGFU) or
BaseObject.m_boDeath or BaseObject.m_boGhost or BaseObject.m_boHideMode then Continue;
if IsProperTarget(BaseObject) then begin
BaseObject.m_boHideMode := True;
BaseObject.SendDelayMsg(Self, RM_LINGFUSTRUCK, 0, g_Config.nLinfuDecHP, 0, 0, '', 300);
Inc(n14);
SetLength(TargeList, n14);
TargeList[n14 - 1] := Integer(BaseObject);
end;
if n14 >= UserItem.Dura then Break;
end;
finally
ObjList.free;
end;
//扣除灵符持久
if n14 >= UserItem.Dura then UserItem.Dura := 0;
end else
n14 := 1;
//发送效果
if n14 > 1 then begin
sTmp := EnCodeBuffer(@TargeList[0], SizeOf(Integer) * n14);
SendRefMsg(RM_USEBINDLINGFU, n14, Integer(Monster), $0D, m_btDirection, sTmp);
end else begin
SendRefMsg(RM_ASSISTSKILL, $0D, Integer(Monster), m_btDirection, MakeLong(Monster.m_nCurrX, Monster.m_nCurrY), '');
end;
//目标怪物
Monster.m_boHideMode := True;
Monster.SendDelayMsg(Self, RM_LINGFUSTRUCK, 0, g_Config.nLinfuDecHP, 0, 0, '', 300);
//扣除灵符
if (UserItem.Dura > 0) then Dec(UserItem.Dura, n14);
if (UserItem.Dura <= 0) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end else begin
boEatOK := False;
//SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end;
end else begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
n14 := 1;
end;
//触发脚本
m_sScriptParam[5] := IntToStr(n14); //杀怪数量
ExecuteScript(g_FunctionNPC, '@灵符杀怪');
end;
end;
end;
206, 207: begin
if (not CheckSPCode(Monster.m_dwRuleCtrlCode, SP_MON_ALLOWCATCH)) then begin
SysMsg('灵兽项圈不能用来捕捉此怪物!', c_Red, t_Hint);
goto EAT_END;
end;
if (Monster.m_Master <> nil) or (Monster.m_boIsPet) then begin
SysMsg('灵兽已有主人,不能被捕捉', c_Red, t_Hint);
goto EAT_END;
end;
{灵兽减血}
Monster.SendDelayMsg(Self, RM_LINGFUSTRUCK, 0, g_Config.nChapLetDecHP, 0, 0, '', 300);
n14 := Monster.m_WAbil.dwHP div g_Config.nChapLetMonHPRate;
if n14 <= 2 then n14 := 2;
if (Random(20) > (Monster.m_wSlaveExpLevel + g_Config.nChapLetMonLevel {10})) and ((Random(n14) = 0)) then begin
nCode := $123F;
m_sScriptParam[0] := Monster.m_sCharName; //灵兽名称
m_sScriptParam[1] := IntToStr(Monster.m_wAppr); //灵兽Appr
m_sScriptParam[2] := IntToStr(Monster.m_wSlaveExpLevel); //灵兽等级
m_sScriptParam[3] := IntToStr(nItemIdx);
ExecuteScript(g_FunctionNPC, '@捕捉灵兽');
end else begin
nCode := $123E;
end;
//显示一个效果
TurnTo(GetNextDirection(m_nCurrX, m_nCurrY, Monster.m_nCurrX, Monster.m_nCurrY));
SendRefMsg(RM_ASSISTSKILL, nCode, Integer(Monster), m_btDirection, MakeLong(Monster.m_nCurrX, Monster.m_nCurrY), '');
if nCode = $123F then Monster.MakeGhost; //抓捕成功
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
if StdItem.Shape = 207 then begin //捆
if UserItem.Dura > 0 then Dec(UserItem.Dura);
if (UserItem.Dura <= 0) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end else begin
boEatOK := False;
//SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end;
end else begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end;
end;
end;
210: begin
tm := MakeLong(MakeWord(UserItem.btValue[4], UserItem.btValue[5]),
MakeWord(UserItem.btValue[6], UserItem.btValue[7]));
if (tm = 0) then begin //第一次使用
tm := DateTimeToWolTIme(Now);
tm := tm + (StdItem.sC * 86400);
Move(tm, UserItem.btValue[4], 4); //激活时间
UserItem.btItemExt[4] := 1; //绑定
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end else begin
if (DateTimeToWolTIme(Now) > tm) then begin
SysMsg('该物品已经到期', c_Red, t_Hint);
end else begin
ExecuteScript(g_ManageNPC, '@_释放_兽尊灵丹');
end;
end;
end
else begin
if (StdItem.Shape = 201) and (StdItem.AniCount = 20000) then begin
if m_PEnvir.m_MapFlag.boNORANDOMMOVE then begin
SysMsg('此地图禁止使用随机', c_Red, t_Hint);
goto EAT_END;
end else begin
SendRefMsg(RM_SPACEMOVE_FIRE, 0, 0, 0, 0, '');
BaseObjectMove(m_sMapName, '', '');
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
if UserItem.Dura > 0 then Dec(UserItem.Dura);
if (UserItem.Dura = 0) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end else begin
//SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end;
end;
end;
end else if (StdItem.Shape = 15) or ((StdItem.Shape = 17) and ((StdItem.Looks = 729) or (StdItem.Looks = 942))) then begin
//回城神石
if (m_wShopItemCount > 0) or m_boArrow then goto EAT_END; //禁止使用回城石的条件
if (GetTickCount - m_dwUseStoreTick) < 10000 then begin
SysMsg('每隔10秒才允许使用回城石一次。', c_Red, t_Hint);
goto EAT_END;
end;
if m_PEnvir.m_MapFlag.boNOSTOREMOVE then begin
SysMsg('当前地图禁止使用回城石。', c_Red, t_Hint);
goto EAT_END;
end;
if StdItem.AniCount = 0 then begin
nX := MakeWord(UserItem.btValue[0], UserItem.btValue[1]);
nY := MakeWord(UserItem.btValue[2], UserItem.btValue[3]);
sMAP := '';
for j := 4 to 9 do begin
if UserItem.btValue[j] = 0 then Break;
sMAP := sMAP + Chr(UserItem.btValue[j]);
end;
if (sMAP <> '') then begin
m_sScriptParam[0] := m_PEnvir.m_sMapName;
m_sScriptParam[1] := sMAP;
SendRefMsg(RM_SPACEMOVE_FIRE, 0, 0, 0, 0, '');
SpaceMove(sMAP, nX + Random(8) - 4, nY + Random(8) - 4, 0, nil);
m_dwUseStoreTick := GetTickCount;
ExecuteScript(g_FunctionNPC, '@使用回城石');
if (StdItem.Shape = 17) then begin
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
if UserItem.Dura > 0 then Dec(UserItem.Dura);
if (UserItem.Dura = 0) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end else begin
boEatOK := False;
SendUpdateItem(UserItem);
end;
end;
end;
end else
SysMsg('该' + StdItem.Name + '没有刻地名,请到各地老兵处记录回城点。', c_Red, t_Hint);
end else begin
ExecuteScript(g_FunctionNPC, '@使用回城石');
boEatOK := False;
SendUpdateItem(UserItem);
end;
end else begin //其他类物品
if EatItems(StdItem) then begin
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
if UserItem.Dura > 0 then Dec(UserItem.Dura);
if (UserItem.Dura <= 0) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end else begin
boEatOK := False;
//SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end;
end;
end;
end;
end;
end;
goto EAT_END;
end;
4, 8: begin //书
nCheckCode := 192;
if (g_FunctionNPC <> nil) and (StdItem.AniCount > 0) then begin
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
UseStdmodeFunItem(StdItem, True);
end else begin
boEatOK := ReadBook(StdItem);
if boEatOK then begin
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
end;
//刺杀剑法
if (m_MagicSkills[12] <> nil) and (not m_boUseThrusting) then begin
ThrustingOnOff(True);
SendSocket(nil, '+LNG');
end;
//半月弯刀
if (m_MagicSkills[25] <> nil) and (not m_boUseHalfMoon) then begin
HalfMoonOnOff(True);
SendSocket(nil, '+WID');
end;
end;
end;
end;
12: begin //盾牌升级
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
ExecuteScript(g_FunctionNPC, '@TigerShield');
end;
30: begin //精英勋章
nCheckCode := 193;
if (StdItem.Looks = 8020) then begin
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
ExecuteScript(g_FunctionNPC, '@EliteMedal');
end;
end;
31: begin //解包物品
nCheckCode := 194;
if StdItem.AniCount = 0 then begin //打包的物品
if (m_ItemList.Count + 6 - 1) <= m_nBagSize then begin
if m_boPneuma then SendDelItems(UserItem);
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
end;
GetUnBindItems(GetUnbindItemName(StdItem.Shape), 6);
boEatOK := True;
end;
end else if StdItem.AniCount = 255 then begin //魔法字体、魔法颜料
if StdItem.AC > 1 then begin
m_btChatColor := StdItem.AC;
SysMsg('您改变了文字颜色', c_Red, t_Hint);
end;
if StdItem.MAC > 0 then begin
m_btChatFont := StdItem.MAC;
SysMsg('您改变了文字字体', c_Red, t_Hint);
end;
if (StdItem.DC > 0) and (StdItem.DC <= 77) then begin
if (m_MagicSkills[StdItem.DC] <> nil) then begin
m_MagicSkills[StdItem.DC].nSkillColor :=
MakeLong(MakeWord(HiWord(StdItem.MC),
LoWord(StdItem.MC)), MakeWord(HiWord(StdItem.SC),
LoWord(StdItem.SC)));
SendDefMessage($B4A4, m_MagicSkills[StdItem.DC].nSkillColor, StdItem.DC, 0, 0, '');
SysMsg('您改变了魔法颜色', c_Red, t_Hint);
end;
end;
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
if UserItem.Dura > 0 then Dec(UserItem.Dura);
if (UserItem.Dura <= 0) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end else begin
//SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end;
end;
end else if StdItem.AniCount = 254 then begin //天气卷轴
if GetTickCount - m_PEnvir.m_dwChangeTick < 2 * 60 * 1000 then begin
SysMsg('天气效果2分钟内不可以连续更换!', c_Red, t_Hint);
goto EAT_END;
end;
m_PEnvir.m_dwChangeTick := GetTickCount();
m_PEnvir.m_MapFlag.nWeather := MakeWord(LoWord(StdItem.AC), HiWord(StdItem.AC));
m_PEnvir.m_MapFlag.wWindSpeed := MakeWord(LoWord(StdItem.MAC), HiWord(StdItem.MAC));
m_PEnvir.m_MapFlag.dwWindColor := MakeLong(MakeWord(LoWord(StdItem.DC), HiWord(StdItem.DC)), MakeWord(LoWord(StdItem.MC), HiWord(StdItem.MC)));
UserEngine.SendMapMsg(m_PEnvir, Self, RM_DAYCHANGING, 0, 0, 0, 0, '');
UserEngine.SendMapMsg(m_PEnvir, Self, RM_TITLEMSM, 0, $38FF, $FC, 10, m_sCharName + '改变' + m_PEnvir.m_sMapDesc + '的天气为' + StdItem.Name + ',您现在可以打开天气效果欣赏。');
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
if UserItem.Dura > 0 then Dec(UserItem.Dura);
if (UserItem.Dura <= 0) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end else begin
//SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end;
end;
end else begin //其他物品,比如卷、回城石
if (m_wShopItemCount > 0) or m_boArrow then goto EAT_END;
if UseStdmodeFunItem(StdItem) then begin
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end;
end;
end;
end;
32: begin
nCheckCode := 195; //空马牌
if (m_btHorseType = 0) or (HorseName = '') then begin
SysMsg('你现在没有马,无法使用马牌(空)', c_Red, t_Hint);
goto EAT_END;
end;
UserItem2 := nil;
if m_UseItems[U_RIGHTHAND].wIndex > 0 then begin
UserItem2 := @m_UseItems[U_RIGHTHAND];
StdItem2 := UserEngine.GetStdItem(UserItem2.wIndex);
if (StdItem2.StdMode <> 33) then UserItem2 := nil;
end;
//杂物位置
if (UserItem2 = nil) and (m_UseItems[U_CHARM].wIndex > 0) then begin
UserItem2 := @m_UseItems[U_CHARM];
StdItem2 := UserEngine.GetStdItem(UserItem2.wIndex);
if (StdItem2.StdMode <> 33) then UserItem2 := nil;
end;
if UserItem2 <> nil then begin
SysMsg('你已绑定好了马牌,不用在次绑定马牌', c_Red, t_Hint);
goto EAT_END;
end;
//给他一个马牌
New(UserItem2);
if UserEngine.CopyToUserItemFromName('马牌', UserItem2) then begin
StdItem2 := UserEngine.GetStdItem(UserItem2.wIndex);
m_ItemList.Add(UserItem2);
UserItem2.Dura := UserItem2.DuraMax;
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
WeightChanged();
SendDefMessage(SM_EAT_OK, 0, 0, 0, 0, '');
end;
SendAddItem(UserItem2);
//绑定马牌
UserItem2.btValue[0] := m_btHorseType;
for j := 1 to Length(HorseName) do
UserItem2.btValue[j] := byte(HorseName[j]);
SendUpdateItem(UserItem2);
m_btHorseType := 0;
if ClientTakeOnItems(U_RIGHTHAND, UserItem2.MakeIndex, StdItem2.Name, True) then
SysMsg(Format('你的%s马牌已经装备到身上', [HorseName]), c_Red, t_Hint);
boEatOK := True;
//Exit;
end else
Dispose(UserItem2);
end;
36, 46: begin //天气卷轴
nCheckCode := 196;
if (StdItem.StdMode = 36) and (StdItem.Shape = 1) then begin
m_PEnvir.m_MapFlag.nWeather := MakeWord(LoWord(StdItem.AC), HiWord(StdItem.AC));
m_PEnvir.m_MapFlag.wWindSpeed := MakeWord(LoWord(StdItem.MAC), HiWord(StdItem.MAC));
m_PEnvir.m_MapFlag.dwWindColor := MakeLong(MakeWord(LoWord(StdItem.DC), HiWord(StdItem.DC)), MakeWord(LoWord(StdItem.MC), HiWord(StdItem.MC)));
UserEngine.SendMapMsg(m_PEnvir, Self, RM_DAYCHANGING, 0, 0, 0, 0, '');
UserEngine.SendBroadCastMsgExt(m_sCharName + '改变' + m_PEnvir.m_sMapDesc + '的天气为' + ReplaceStr(StdItem.Name, '卷轴', '') + ',您现在可以打开天气效果欣赏。', t_center);
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
if UserItem.Dura > 0 then Dec(UserItem.Dura);
if (UserItem.Dura <= 0) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end else begin
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end;
end
end else if (StdItem.StdMode = 46) and (StdItem.Shape = 106) then begin //财神许愿符
if m_PEnvir.m_MapFlag.boCanUseSuperItem and m_PEnvir.AllowSoulItem(sItemName) then begin
if (abs(45 - m_nCurrX) > 3) or (abs(45 - m_nCurrY) > 3) then begin
SysMsg('您站的太远了,请在许愿池附近使用该物品', c_Red, t_Hint);
goto EAT_END;
end else begin
SendRefMsg(RM_ASSISTSKILL, $1536, 0, 4, MakeLong(45, 45), '');
SendWishAwardInfo();
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
if UserItem.Dura > 0 then Dec(UserItem.Dura);
if (UserItem.Dura <= 0) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end else begin
boEatOK := False;
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end;
end;
end;
end else
goto EAT_END;
end else begin //执行脚本
if (StdItem.AniCount > 0) then begin
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
UseStdmodeFunItem(StdItem, True);
end;
goto EAT_END;
end;
end;
37: begin
nCheckCode := 197;
case StdItem.Shape of
2: begin
if (m_wShopItemCount > 0) or m_boArrow then goto EAT_END; //随机神石
if m_PEnvir.m_MapFlag.boNORANDOMMOVE then begin
SysMsg('此地图禁止使用随机', c_Red, t_Hint);
goto EAT_END;
end else begin
SendRefMsg(RM_SPACEMOVE_FIRE, 0, 0, 0, 0, '');
BaseObjectMove(m_sMapName, '', '');
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
if UserItem.Dura > 0 then Dec(UserItem.Dura);
if (UserItem.Dura = 0) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end else begin
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end;
end;
end;
end;
3: begin
if m_sDearName = '' then begin
SysMsg('尚未婚配,不可以种植' + g_Config.sLoveTree, c_Red, t_Hint);
goto EAT_END;
end;
if not InPlantZone then begin
SysMsg('该地区不可以植树。', c_Red, t_Hint);
goto EAT_END;
end;
GetFrontPosition(nX, nY);
sTmp := m_sCharName;
if (m_sDearName <> '') then sTmp := sTmp + '和' + m_sDearName;
sTmp := sTmp + '的' + g_Config.sLoveTree;
Monster := UserEngine.RegenMonsterByName(m_PEnvir, nX, nY, g_Config.sLoveTree, sTmp, 3);
if Monster <> nil then begin
Monster.m_wSlaveMakeLevel := 0;
Monster.m_wSlaveExpLevel := 0;
Monster.RecalcAbilitys;
Monster.RefNameColor;
SysMsg('恭喜您,爱情之树种植成功,您的爱情之树现在的寿命是3天。', c_Red, t_Hint);
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
if UserItem.Dura > 0 then Dec(UserItem.Dura);
if (UserItem.Dura <= 0) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end else begin
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end;
end;
end;
end;
4: begin
if m_sDearName = '' then begin
SysMsg('尚未婚配,不可以种植' + g_Config.sLoveTree, c_Red, t_Hint);
goto EAT_END;
end;
if not InPlantZone then begin
SysMsg('该地区不可以植树。', c_Red, t_Hint);
goto EAT_END;
end;
sTmp := m_sCharName;
if m_sDearName <> '' then sTmp := sTmp + '和' + m_sDearName;
sTmp := sTmp + '的' + g_Config.sLoveTree;
ObjList := TList.Create;
try
m_PEnvir.GetRangeBaseObject(m_nCurrX, m_nCurrY, 2, True, ObjList);
boFind := False;
for j := 0 to ObjList.Count - 1 do begin
Monster := TBaseObject(ObjList[j]);
if (Monster.m_wAppr = 241) and (CompareText(Monster.m_sCharName, sTmp) = 0) then begin
Monster.m_nLifeSpan := Monster.m_nLifeSpan + StdItem.AC;
SysMsg(sTmp + '寿命成功延长' + IntToStr(StdItem.AC) + '天,死亡时间推迟到' + DateToChStr(Monster.m_dtBirthday + Monster.m_nLifeSpan, True), c_Red, t_Hint);
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
if UserItem.Dura > 0 then Dec(UserItem.Dura);
if (UserItem.Dura <= 0) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end else begin
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end;
end;
boFind := True;
Break;
end;
end;
finally
ObjList.free;
end;
if not boFind then
SysMsg('附近没有发现' + sTmp + ',请在5格范围内使用', c_Red, t_Hint);
end;
202: begin
if PackageItems(nPackIdx) then begin
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
if UserItem.Dura > 0 then Dec(UserItem.Dura);
if (UserItem.Dura <= 0) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end else begin
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end;
end;
end;
end;
10: begin
if (m_Pet = nil) or (m_PetInfo[0].nMakeIndex = 0) then begin
SysMsg('你的身边没有可喂食的宠物,不能喂食。', c_Red, t_Hint);
goto EAT_END;
end;
if PetStoreAddExp(m_PetInfo[0].nMakeIndex, StdItem.AC, LoWord(StdItem.AC), True) then begin
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
if UserItem.Dura > 0 then Dec(UserItem.Dura);
if (UserItem.Dura <= 0) then begin
m_nEatItemMakeIndex := 0;
SendDelItems(UserItem);
DelBagItem(UserItem34.MakeIndex, '');
goto EAT_END;
end else begin
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end;
end;
end;
end;
11: begin
m_boRideOn := False;
if StdItem.AniCount <> m_btGender then begin
SysMsg('性别不符,不能使用', c_Red, t_Hint);
m_boRideOn := True;
goto EAT_END;
end;
if m_UseItems[U_RIDEDRESS].wIndex > 0 then begin
m_UseItems[U_RIDEDRESS].wIndex := 0;
m_nDressShape := 0;
SendDefMessage(SM_TAKEOFF_OK, GetFeatureToLong(Self), GetGender, 0, 0, '');
end;
if ((m_nDressShape and $000000C8) = $000000C8) then begin
if m_UseItems[0].wIndex = 0 then
m_nDressShape := 0
else begin
StdItem2 := UserEngine.GetStdItem(m_UseItems[0].wIndex);
if StdItem2 = nil then
m_nDressShape := 0
else
m_nDressShape := MakeLong(MakeWord(StdItem2.Shape, $00), HiWord(m_nDressShape));
end;
if m_boRideOn then ClientRideOff();
end else begin
m_nDressShape := MakeLong($00C8, HiWord(m_nDressShape));
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
if UserItem.Dura > 0 then Dec(UserItem.Dura);
if (UserItem.Dura <= 0) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end else begin
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end;
end;
end;
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
m_nMagicStatus := GetMagicStatus;
Status2Changed;
FeatureChanged;
end;
14, 30: begin
//极品御兽天衣、仙魂御龙袍
m_boRideOn := False;
if StdItem.AniCount <> m_btGender then begin
SysMsg('性别不符,不能使用', c_Red, t_Hint);
m_boRideOn := True;
goto EAT_END;
end;
if m_UseItems[U_RIDEDRESS].wIndex > 0 then begin
m_UseItems[U_RIDEDRESS].wIndex := 0;
m_nDressShape := 0;
SendDefMessage(SM_TAKEOFF_OK, GetFeatureToLong(Self), GetGender, 0, 0, '');
if m_boRideOn then ClientRideOff();
end else begin
m_UseItems[U_RIDEDRESS] := UserItem^;
SendUseitems();
end;
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
m_nMagicStatus := GetMagicStatus;
Status2Changed;
FeatureChanged;
end;
200: begin
if SuperRepairUseItems then begin
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
if UserItem.Dura > 0 then Dec(UserItem.Dura);
if (UserItem.Dura <= 0) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end else begin
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end;
end;
end;
end;
207, 209: begin
if ExecuteScript(g_ManageNPC, '@加点装备') then begin
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
if UserItem.Dura > 0 then Dec(UserItem.Dura);
if (UserItem.Dura <= 0) then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end else begin
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end;
end;
end;
end;
else begin
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
if UseStdmodeFunItem(StdItem) then begin
if (m_nEatItemMakeIndex = UserItem34.MakeIndex) then begin
if (UserItem.Dura > 0) and (StdItem.Source <> 1) then Dec(UserItem.Dura);
if (UserItem.Dura = 0) and (StdItem.Source <> 1) then begin
m_nEatItemMakeIndex := 0;
SendDelItems(UserItem);
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
end else begin
SendUpdateItem(UserItem);
end;
end;
end;
end;
end;
end;
49: begin
nCheckCode := 198;
m_nEatItemMakeIndex := 0;
case StdItem.Shape of
51: begin //豹魔石
if (m_Pet = nil) and (m_PetInfo[0].nMakeIndex = 0) and (not IsDownPetItem(UserItem.MakeIndex)) then begin //放出豹子
//检查豹子状态
tm := MakeLong(MakeWord(UserItem.btValue[0], UserItem.btValue[1]), MakeWord(UserItem.btValue[2], UserItem.btValue[3]));
if (tm > 0) and (tm + (PETMAXUSEDAY * 86400) <= DateTimeToWolTIme(Now)) then begin //第5天死亡
SysMsg('你的宠物已经死亡。', c_Red, t_Hint);
goto EAT_END;
end;
//绑定灵兽
if (not g_Config.boClassicServer) and (UserItem.btItemExt[4] = 0) then begin
UserItem.btItemExt[4] := 1;
SendUpdateItem(UserItem);
end;
if tm = 0 then begin
tm := DateTimeToWolTIme(Now);
UserItem.btValue[0] := LoByte(LoWord(tm));
UserItem.btValue[1] := HiByte(LoWord(tm));
UserItem.btValue[2] := LoByte(HiWord(tm));
UserItem.btValue[3] := HiByte(HiWord(tm));
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
m_sPetName := '';
SendUpdateItem(UserItem);
end;
PetShow(UserItem.MakeIndex);
sMAP := _PETNAME[_MIN(15, StdItem.AniCount)][_MIN(3, UserItem.btValue[9])];
if m_Pet <> nil then begin
n14 := DateTimeToWolTIme(Now) - tm;
n14 := n14 div 86400;
if n14 <= 2 then
SysMsg('您的' + sMAP + '精神饱满。', c_Red, t_Hint)
else if n14 = 3 then
SysMsg('您的' + sMAP + '状态为微饿。红袖处有兽粮出售。', c_Red, t_Hint)
else if n14 = 4 then
SysMsg('您的' + sMAP + '状态为饥饿。红袖处有兽粮出售。', c_Red, t_Hint)
else
SysMsg('您的' + sMAP + '已饿死,您可以带着神水请驯兽师帮您复活。商城内有神水出售。', c_Red, t_Hint);
nCheckCode := 19891;
m_Pet.RefShowName;
ExecuteScript(g_FunctionNPC, '@ReleasePet');
if UserItem.btValue[9] < 3 then
SendUpdateDelayMsg(Self, RM_REFRESHRANK, 0, 3, UserItem.MakeIndex, 0, '', 200) //刷新灵兽排名
else
SendUpdateDelayMsg(Self, RM_REFRESHRANK, 0, 4, UserItem.MakeIndex, 0, '', 200);
end;
end else begin //收起豹子
if (m_Pet <> nil) and
(m_PetInfo[0].nMakeIndex <> UserItem.MakeIndex) and
(not IsDownPetItem(UserItem.MakeIndex)) then
begin
SysMsg('你无法同时使两个灵兽跟随', c_Red, t_Hint);
goto EAT_END;
end;
if (m_PackPet <> nil) and (m_PetInfo[1].nMakeIndex = UserItem.MakeIndex) then
SysMsg('你的宠物正在替你守摊,停止守摊后才能召唤你的宠物。', c_Red, t_Hint)
else if (m_PetInfo[4].nMakeIndex = UserItem.MakeIndex) then
SysMsg('你的宠物正在替你探宝,停止探宝后才能召唤你的宠物。', c_Red, t_Hint)
else if (m_PetInfo[5].nMakeIndex = UserItem.MakeIndex) then
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, '该灵兽处于魂佑附体状态,无法跟随')
else
PetHide(UserItem.MakeIndex);
end;
end;
52: begin //兽粮
if (m_Pet = nil) or (m_PetInfo[0].nMakeIndex = 0) then begin
SysMsg('你的身边没有可喂食的宠物,不能喂食。', c_Red, t_Hint);
goto EAT_END;
end;
if PetStoreAddExp(m_PetInfo[0].nMakeIndex, StdItem.DuraMax, LoWord(StdItem.AC), True) then begin
m_nEatItemMakeIndex := 0;
SendDelItems(UserItem);
DelBagItem(UserItem34.MakeIndex, '');
boEatOK := True;
goto EAT_END;
end;
end;
15, 16, 17, 18: begin
//摊位样式,摊位旗帜,百变披风
if (StdItem.Shape = 18) and (m_boRideOn or m_boCatapultMode) then begin
SysMsg('你现在不可以使用变身披风', c_Red, t_Hint);
goto EAT_END;
end;
boEatOK := CheckUserItemTimeOut(UserItem, StdItem);
if boEatOK then begin
DelBagItem(UserItem34.MakeIndex, '');
goto EAT_END;
end else begin
if StdItem.Shape = 15 then begin
if StdItem.AC > 1 then begin
m_btChatColor := StdItem.AC;
SysMsg('您改变了文字颜色', c_Red, t_Hint);
end;
if StdItem.MAC > 0 then begin
m_btChatFont := StdItem.MAC;
SysMsg('您改变了文字字体', c_Red, t_Hint);
end;
if (StdItem.DC > 0) and (StdItem.DC <= 77) then begin
if (m_MagicSkills[StdItem.DC] <> nil) then begin
m_MagicSkills[StdItem.DC].nSkillColor := MakeLong(MakeWord(HiWord(StdItem.MC),
LoWord(StdItem.MC)),
MakeWord(HiWord(StdItem.SC),
LoWord(StdItem.SC)));
SendDefMessage($B4A4, m_MagicSkills[StdItem.DC].nSkillColor, StdItem.DC, 0, 0, '');
SysMsg('您改变了魔法颜色', c_Red, t_Hint);
end;
end;
end else if StdItem.Shape = 16 then begin //摊位类型
m_wShopKind := StdItem.DC;
SysMsg('您改变了摊位类型', c_Red, t_Hint);
end else if StdItem.Shape = 17 then begin //摊位旗帜
m_btShopBanner := StdItem.DC;
m_nBannerColor :=
MakeLong(MakeWord(LoWord(StdItem.MC),
HiWord(StdItem.MC)), MakeWord(LoWord(StdItem.SC),
HiWord(StdItem.SC)));
SysMsg('您改变了摊位旗帜', c_Red, t_Hint);
end else if StdItem.Shape = 18 then begin //变身披风
if (StdItem.DC = m_wBianshenImg) and (StdItem.MC = m_wBianshenAppr) then begin //取消变身
m_wBianshenImg := 0;
m_wBianshenAppr := 0;
end else begin
m_wBianshenImg := StdItem.DC;
m_wBianshenAppr := StdItem.MC;
end;
if m_wExtraLevel > 0 then begin
if m_wBianshenAppr = 0 then
SendMsg(Self, RM_FENGHAO, MakeWord(8, LoByte(m_wExtraLevel)), GetPneumaAmbit, HiByte(m_wExtraLevel), 0, GetExtraLevelName)
else
SendMsg(Self, RM_FENGHAO, MakeWord(8, 0), 0, 0, 0, '');
end;
SendRefMsg(RM_FENGHAO, 64, m_wBianshenImg, m_wBianshenAppr, 0, '');
end;
goto EAT_END;
end;
end;
22: begin
//御兽天衣 ,御兽天袍 Anicount=0为男性,Anicount=1为女性
boEatOK := CheckUserItemTimeOut(UserItem, StdItem);
m_boRideOn := False;
if StdItem.AniCount <> m_btGender then begin
SysMsg('性别不符,不能使用', c_Red, t_Hint);
m_boRideOn := True;
goto EAT_END;
end;
if boEatOK then begin
DelBagItem(UserItem34.MakeIndex, '');
goto EAT_END;
end else begin
if m_UseItems[U_RIDEDRESS].wIndex > 0 then begin
m_UseItems[U_RIDEDRESS].wIndex := 0;
m_nDressShape := 0;
SendDefMessage(SM_TAKEOFF_OK, GetFeatureToLong(Self), GetGender, 0, 0, '');
end;
if ((m_nDressShape and $000000C8) = $000000C8) then begin
if m_UseItems[0].wIndex = 0 then
m_nDressShape := 0
else begin
StdItem2 := UserEngine.GetStdItem(m_UseItems[0].wIndex);
if StdItem2 = nil then
m_nDressShape := 0
else
m_nDressShape := MakeLong(MakeWord(StdItem2.Shape, $00), HiWord(m_nDressShape));
end;
if m_boRideOn then ClientRideOff();
end else begin
m_nDressShape := MakeLong($00C8, HiWord(m_nDressShape));
end;
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
m_nMagicStatus := GetMagicStatus;
Status2Changed;
FeatureChanged;
goto EAT_END;
end;
end;
55, 56: ; //封元印
107: begin
m_ExpeditionCount := 0;
FillChar(m_ExpeditionBox, SizeOf(TExpeditionBox), #0);
UseStdmodeFunItem(StdItem);
m_nEatItemMakeIndex := 0;
boEatOK := True;
goto EAT_END;
end
else begin //49类的其他物品,同37类物品,但支持使用天数
boEatOK := CheckUserItemTimeOut(UserItem, StdItem);
if boEatOK then begin
m_nEatItemMakeIndex := 0;
DelBagItem(UserItem34.MakeIndex, '');
goto EAT_END;
end else begin
UseStdmodeFunItem(StdItem);
goto EAT_END;
end;
end;
end;
end;
59: begin
nCheckCode := 199;
if StdItem.Shape in [10..18] then begin
ExecuteScript(g_FunctionNPC, '@圣灵宝石' + IntToStr(StdItem.Shape));
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
end;
end;
82, 83: begin
nCheckCode := 200;
if StdItem.Shape = 131 then begin
ExecuteScript(g_FunctionNPC, '@AppraisalItem' + IntToStr(StdItem.AniCount));
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
end;
end;
end;
end;
end;
end;
end else begin
//SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, g_sCanotUseItemMsg);
SysMsg(g_sCanotUseItemMsg, c_Pink, t_Hint);
end;
EAT_END:
nCheckCode := 201;
if boEatOK then begin
//WeightChanged(); //这里不需要了
SendDefMessage(SM_EAT_OK, 0, 0, 0, 0, '');
nCheckCode := 202;
if StdItem.boGameLog = 1 then
AddGameDataLog('11' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
sItemName + #9 +
IntToStr(UserItem34.MakeIndex) + #9 +
'1' + #9 +
'0');
end else begin
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
end;
except
on E: Exception do begin
MainOutMessage(Format(sExceptionMsg, [nCheckCode, m_sCharName, nItemIdx, sItemName, nPackIdx]));
MainOutMessage(E.Message);
end;
end;
end;
{客户端快捷交易}
procedure TPlayObject.ClientQueryUserSet(ProcessMsg: pTProcessMessage);
begin
if Assigned(m_VersionManage) then
try
m_VersionManage.OnClientQueryUserSet(Self, ProcessMsg);
except
MainOutMessage(Format('TPlayObject::ClientQueryUserSet SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
end;
//发送货物明细
procedure TPlayObject.ClientUserBuyItem(nIdent, nParam1, nInt, nZz: Integer; sMsg: string; nType: Integer = 0); //004DCA10
begin
if Assigned(m_VersionManage) then
try
m_VersionManage.OnClientUserBuyItem(Self, nIdent, nParam1, nInt, nZz, sMsg);
except
MainOutMessage(Format('TPlayObject::ClientUserBuyItem SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
end;
procedure TPlayObject.ClientUserSellItem(nParam1, nMakeIndex: Integer; sMsg: string);
var
i : Integer;
UserItem : pTUserItem;
Merchant : TMerchant;
sName : string;
begin
for i := m_ItemList.Count - 1 downto 0 do begin
UserItem := m_ItemList.Items[i];
if (UserItem <> nil) and (UserItem.MakeIndex = nMakeIndex) then begin
{取自定义物品名称}
sName := '';
ItemUnit.GetCustomItemName(UserItem, sName);
if (CompareText(sMsg, sName) = 0) then begin
Merchant := UserEngine.FindMerchant(TObject(nParam1));
if (Merchant <> nil) and
(Merchant.m_boSell) and
(IsEnvir(Merchant.m_PEnvir) and
(abs(Merchant.m_nCurrX - m_nCurrX) < 15) and
(abs(Merchant.m_nCurrY - m_nCurrY) < 15)) then begin
if Merchant.ClientSellItem(Self, UserItem) then begin
if UserItem.btValue[13] and $01 = 1 then begin
ItemUnit.DelCustomItemName(UserItem.MakeIndex, UserItem.wIndex);
UserItem.btValue[13] := UserItem.btValue[13] and $FE;
//清除自定义物品名字标记
end;
m_ItemList.Delete(i);
WeightChanged();
end;
end;
Break;
end;
end;
end; // for
end;
//CM_WALK命令的处理
function TPlayObject.ClientWalkXY(wIdent: word; nX, nY: Integer; boLateDelivery:
Boolean; var dwDelayTime: LongWord): Boolean; //004CAF08
var
n14, n18, n1C : Integer;
dwCheckTime : LongWord;
nPinjunTime : Integer;
nCheckTime : Integer;
begin
Result := False;
dwDelayTime := 0;
if (not m_boCanWalk) or (m_wShopItemCount > 0) or (m_boCatapultAttackMode) then Exit;
if not CheckCanOperate(cWalk) then Exit;
if (not g_Config.boDisableM2SpeedCtrl) then begin
//10指令时间控制
if m_nWalkCount = 0 then m_FirstWalkTick := GetTickCount;
m_nRunCount := 0;
Inc(m_nWalkCount);
if m_nWalkCount >= 11 then begin
nPinjunTime := (GetTickCount - m_FirstWalkTick) div 10;
{$IF USESDK = DEBUG}
//SysMsg('走10次平均时间:'+inttostr(nPinjunTime),c_blue,t_hint);
{$IFEND}
m_FirstWalkTick := GetTickCount;
m_nWalkCount := 0;
if nPinjunTime < g_Config.n10WalkTIme then begin
if m_boTestSpeedMode then
SysMsg(Format('10次走超速!限制:%d,当前:%d', [g_Config.n10WalkTIme, nPinjunTime]), c_Red, t_Hint);
Exit;
end;
end;
end;
nCheckTime := GetTickCount - m_dwDoMotaeboMoveTick;
if nCheckTime < g_Config.dwWalkIntervalTime div 4 then
Exit; //如果间隔时间小于 600 毫秒
m_dwDoMotaeboMoveTick := GetTickCount();
if (not g_Config.boDisableM2SpeedCtrl) and (not boLateDelivery) then begin
if not CheckActionStatus(wIdent, dwDelayTime) then begin
m_boFilterAction := False; //行动被过滤
Exit;
end;
m_boFilterAction := True;
dwCheckTime := GetTickCount - m_dwMoveTick;
if (dwCheckTime < g_Config.dwWalkIntervalTime + m_dwWalkTick) then begin
if m_dwWalkTick = 0 then
Inc(m_dwMoveCount);
dwDelayTime := _Max(0, g_Config.dwWalkIntervalTime - dwCheckTime);
if dwDelayTime > g_Config.dwWalkIntervalTime div 3 then begin
if m_dwMoveCount >= 4 then begin
m_dwMoveTick := GetTickCount();
m_dwMoveCount := 0;
dwDelayTime := g_Config.dwWalkIntervalTime div 3;
if m_boTestSpeedMode then
SysMsg('走路忙复位!!!' + IntToStr(dwDelayTime), c_Red, t_Hint);
end else
m_dwMoveCount := 0;
Exit;
end else begin
if m_boTestSpeedMode then
SysMsg('走路忙!!!' + IntToStr(dwDelayTime), c_Red, t_Hint);
Exit;
end;
end;
end;
m_dwWalkTick := 0;
m_dwMoveTick := GetTickCount();
m_boMoveSuccess := False;
n18 := m_nCurrX;
n1C := m_nCurrY;
n14 := GetNextDirection(m_nCurrX, m_nCurrY, nX, nY);
//取得走到目标的方向
if WalkTo(n14, False) then begin
if m_boMoveSuccess or ((m_nCurrX = nX) and (m_nCurrY = nY)) then begin
Result := True;
RunStepToDamage(1);
end;
Dec(m_nHealthTick, 10);
end else begin
m_dwMoveCount := 0;
m_dwMoveCountA := 0;
end;
end;
procedure TPlayObject.CmdAddGold(Cmd: pTGameCmd; sHumName: string; nCount: Integer); //004CD550
var
PlayObject : TPlayObject;
nServerNumber : Integer;
begin
if (m_btPermissionGM < 6) then Exit;
if (sHumName = '') or (nCount <= 0) then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 人物名称 金币数量', c_Red,
t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumName);
if PlayObject <> nil then begin
if (PlayObject.m_nGold + nCount) < PlayObject.m_nGoldMax then begin
Inc(PlayObject.m_nGold, nCount);
end else begin
nCount := PlayObject.m_nGoldMax - PlayObject.m_nGold;
PlayObject.m_nGold := PlayObject.m_nGoldMax;
end;
PlayObject.GoldChanged();
SysMsg(sHumName + '的金币已增加' + IntToStr(nCount) + '.', c_Green, t_Hint);
if g_boGameLogGold then
AddGameDataLog('14' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
sSTRING_GOLDNAME + #9 +
IntToStr(nCount) + #9 +
'1' + #9 +
sHumName);
end else begin
if UserEngine.FindOtherServerUser(sHumName, nServerNumber) then begin
SysMsg(sHumName + ' 现在' + IntToStr(nServerNumber) + '号服务器上', c_Green, t_Hint);
end else begin
SysMsg(sHumName + ' 现在不在线!!!', c_Green, t_Hint);
end;
end;
end;
procedure TPlayObject.CmdAddGuild(Cmd: pTGameCmd; sGuildName, sGuildChief:
string); //004CEBA0
var
human : TPlayObject;
boAddState : Boolean;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if g_Config.nServerNumber <> 0 then begin
SysMsg('这个命令只能使用在主服务器上', c_Red, t_Hint);
Exit;
end;
if (sGuildName = '') or (sGuildChief = '') then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 行会名称 掌门人名称',
c_Red, t_Hint);
Exit;
end;
boAddState := False;
human := UserEngine.GetPlayObject(sGuildChief);
if human = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sGuildChief]), c_Red,
t_Hint);
Exit;
end;
if g_GuildManager.MemberOfGuild(sGuildChief) = nil then begin
if g_GuildManager.AddGuild(sGuildName, sGuildChief) then begin
UserEngine.SendServerGroupMsg(SS_205, g_Config.nServerNumber, sGuildName + '/' + sGuildChief);
SysMsg('行会名称: ' + sGuildName + ' 掌门人: ' + sGuildChief, c_Green, t_Hint);
boAddState := True;
end;
end; //004CECB4
if boAddState then begin
human.m_MyGuild := g_GuildManager.MemberOfGuild(human.m_sCharName);
if human.m_MyGuild <> nil then begin
human.m_sGuildRankName := TGuild(human.m_MyGuild).GetRankName(Self, human.m_nGuildRankNo);
human.RefShowName();
end;
end; //004CED14
end;
procedure TPlayObject.CmdAdjuestExp(Cmd: pTGameCmd; sHumanName, sExp: string);
var
PlayObject : TPlayObject;
dwExp : LongWord;
dwOExp : LongWord;
resourcestring
sLogMsg = '[经验调整] %s(%s %d -> %d)';
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 人物名称 经验值', c_Red,
t_Hint);
Exit;
end;
dwExp := Str_ToInt(sExp, 0);
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject <> nil then begin
dwOExp := PlayObject.m_Abil.Exp;
PlayObject.m_Abil.Exp := dwExp;
PlayObject.HasLevelUp(0);
SysMsg(PlayObject.m_sCharName + ' 经验调整完成。', c_Green, t_Hint);
if g_Config.boShowMakeItemMsg then
MainOutMessage(Format(sLogMsg, [m_sCharName, PlayObject.m_sCharName,
dwOExp, PlayObject.m_Abil.Exp]));
end else begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
end;
end;
procedure TPlayObject.CmdAdjuestLevel(Cmd: pTGameCmd; sHumanName: string;
nLevel: Integer);
var
PlayObject : TPlayObject;
nOLevel : Integer;
resourcestring
sLogMsg = '[等级调整] %s(%s %d -> %d)';
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if sHumanName = '' then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 人物名称 等级', c_Red,
t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject <> nil then begin
nOLevel := PlayObject.m_Abil.level;
PlayObject.m_Abil.level := _Max(1, _MIN(MAXUPLEVEL, nLevel));
m_nMagicStatus := GetMagicStatus;
PlayObject.HasLevelUp(1);
SysMsg(sHumanName + ' 等级调整完成。', c_Green, t_Hint);
if g_Config.boShowMakeItemMsg then
MainOutMessage(Format(sLogMsg, [m_sCharName, PlayObject.m_sCharName,
nOLevel, PlayObject.m_Abil.level]));
end else begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
end;
end;
procedure TPlayObject.CmdAdjustExp(human: TPlayObject; nExp: Integer); //004CDDAC
begin
if (m_btPermissionGM < 6) then Exit;
end;
procedure TPlayObject.CmdAllowGroupReCall(sCmd, sParam: string);
begin
if (sParam <> '') and (sParam[1] = '?') then begin
SysMsg('此命令用于允许或禁止编组传送功能。', c_Red,
t_Hint);
Exit;
end;
m_boAllowGroupReCall := not m_boAllowGroupReCall;
if m_boAllowGroupReCall then
SysMsg(g_sEnableGroupRecall {'[允许天地合一]'}, c_Green, t_Hint)
else SysMsg(g_sDisableGroupRecall {'[禁止天地合一]'}, c_Green, t_Hint);
end;
procedure TPlayObject.CmdAnnouncement(Cmd: pTGameCmd; sGuildName: string);
//004CF564
var
i : Integer;
Guild : TGuild;
//PlayObject:TPlayObject;
sHumanName : string;
nPoint : Integer;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sGuildName = '') or ((sGuildName <> '') and (sGuildName[1] = '?')) then begin
SysMsg('查看行会争霸赛结果。', c_Red, t_Hint);
SysMsg(Format('命令格式: @%s 行会名称', [Cmd.sCmd]), c_Red, t_Hint);
Exit;
end;
if not m_PEnvir.m_MapFlag.boFight3 then begin
SysMsg('此命令不能在当前地图中使用!!!', c_Red, t_Hint);
Exit;
end;
Guild := g_GuildManager.FindGuild(sGuildName);
if Guild <> nil then begin
UserEngine.CryCry(RM_CRY, m_PEnvir, m_nCurrX, m_nCurrY, 1000,
g_Config.btCryMsgFColor, g_Config.btCryMsgBColor,
Format(' - %s 行会争霸赛结果: ', [Guild.sGuildName]));
for i := 0 to Guild.TeamFightDeadList.Count - 1 do begin
nPoint := Integer(Guild.TeamFightDeadList.Objects[i]);
sHumanName := Guild.TeamFightDeadList.Strings[i];
UserEngine.CryCry(RM_CRY,
m_PEnvir,
m_nCurrX,
m_nCurrY,
1000,
g_Config.btCryMsgFColor,
g_Config.btCryMsgBColor,
Format(' - %s : %d 分/死亡%d次。 ', [sHumanName, HiWord(nPoint),
LoWord(nPoint)]));
end;
end;
UserEngine.CryCry(RM_CRY,
m_PEnvir,
m_nCurrX,
m_nCurrY,
1000,
g_Config.btCryMsgFColor,
g_Config.btCryMsgBColor,
Format(' - [%s] : %d 分。', [Guild.sGuildName, Guild.nContestPoint]));
UserEngine.CryCry(RM_CRY,
m_PEnvir,
m_nCurrX,
m_nCurrY,
1000,
g_Config.btCryMsgFColor,
g_Config.btCryMsgBColor,
'------------------------------------');
end;
procedure TPlayObject.CmdBackStep(sCmd: string; nType, nCount: Integer);
begin
if (m_btPermissionGM < 6) then Exit;
nType := _MIN(nType, 8);
if nType = 0 then begin
CharPushed(GetBackDir(m_btDirection), nCount, False);
end else begin
CharPushed(Random(nType), nCount, False);
end;
end;
procedure TPlayObject.CmdBindGameGold(Cmd: pTGameCmd; sHumanName: string; sCtr: string; nGold: Integer);
var
PlayObject : TPlayObject;
Ctr : Char;
resourcestring
sLogMsg = '[调整金币] %s 给:%s %s %d 绑定元宝';
begin
Ctr := '1';
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sCtr <> '') then begin
Ctr := sCtr[1];
end;
if (sHumanName = '') or not (Ctr in ['=', '+', '-']) or (nGold < 0) or (nGold > 200000000) or ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd, g_sGameCommandGameGoldHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
case sCtr[1] of
'=': begin
if nGold > g_Config.nHumanMaxGameGold then begin
SysMsg(sHumanGameGoldLargeThenLimit, c_Red, t_Hint);
Exit;
end;
PlayObject.m_nBindGameGold := nGold;
end;
'+': begin
if nGold + PlayObject.m_nBindGameGold > g_Config.nHumanMaxGameGold then begin
SysMsg(sHumanGameGoldLargeThenLimit, c_Red, t_Hint);
Exit;
end;
Inc(PlayObject.m_nBindGameGold, nGold);
end;
'-': begin
nGold := _Max(0, PlayObject.m_nBindGameGold - nGold);
PlayObject.m_nBindGameGold := nGold;
end;
end;
if g_boGameLogGameGold then begin
AddGameDataLog(Format(g_sGameLogMsg, [LOG_GAMEGOLD,
PlayObject.m_sMapName,
PlayObject.m_nCurrX,
PlayObject.m_nCurrY,
PlayObject.m_sCharName,
'绑定元宝',
nGold,
sCtr[1],
m_sCharName]));
end;
GameGoldChanged(1);
PlayObject.SysMsg(Format(g_sGameCommandGameGoldHumanMsg, ['绑定元宝', nGold, PlayObject.m_nBindGameGold, '绑定元宝']), c_Green, t_Hint);
SysMsg(Format(g_sGameCommandGameGoldGMMsg, [sHumanName, '绑定元宝', nGold, PlayObject.m_nBindGameGold, '绑定元宝']), c_Green, t_Hint);
if g_Config.boShowMakeItemMsg and (m_btPermissionGM >= 6) then
MainOutMessage(Format(sLogMsg, [m_sCharName, PlayObject.m_sCharName, sCtr[1], nGold]));
end;
procedure TPlayObject.CmdBindGold(Cmd: pTGameCmd; sHumanName: string; sCtr: string; nGold: Integer);
var
PlayObject : TPlayObject;
Ctr : Char;
resourcestring
sLogMsg = '[调整金币] %s 给:%s %s %d 绑定金币';
begin
Ctr := '1';
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sCtr <> '') then begin
Ctr := sCtr[1];
end;
if (sHumanName = '') or not (Ctr in ['=', '+', '-']) or (nGold < 0) or (nGold > 200000000) or ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd, g_sGameCommandGoldHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
case sCtr[1] of
'=': begin
if nGold > g_Config.nHumanMaxGold then begin
SysMsg(sHumanGoldLargeThenLimit, c_Red, t_Hint);
Exit;
end;
PlayObject.m_nBindGold := nGold;
end;
'+': begin
if nGold + PlayObject.m_nBindGold > g_Config.nHumanMaxGold then begin
SysMsg(sHumanGoldLargeThenLimit, c_Red, t_Hint);
Exit;
end;
Inc(PlayObject.m_nBindGold, nGold);
end;
'-': begin
nGold := _Max(0, PlayObject.m_nBindGold - nGold);
PlayObject.m_nBindGold := nGold;
end;
end;
if g_boGameLogGold then begin
AddGameDataLog(Format(g_sGameLogMsg, [LOG_GOLD,
PlayObject.m_sMapName,
PlayObject.m_nCurrX,
PlayObject.m_nCurrY,
PlayObject.m_sCharName,
sSTRING_BINDGOLDNAME,
nGold,
sCtr[1],
m_sCharName]));
end;
GoldChanged(1);
PlayObject.SysMsg(Format(g_sGameCommandGameGoldHumanMsg, [sSTRING_BINDGOLDNAME, nGold, PlayObject.m_nBindGold, sSTRING_BINDGOLDNAME]), c_Green, t_Hint);
SysMsg(Format(g_sGameCommandGameGoldGMMsg, [sHumanName, sSTRING_BINDGOLDNAME, nGold, PlayObject.m_nBindGold, sSTRING_BINDGOLDNAME]), c_Green, t_Hint);
if g_Config.boShowMakeItemMsg and (m_btPermissionGM >= 6) then
MainOutMessage(Format(sLogMsg, [m_sCharName, PlayObject.m_sCharName, sCtr[1], nGold]));
end;
procedure TPlayObject.CmdBindUseItem(Cmd: pTGameCmd; sHumanName, sItem,
sType: string);
var
i : Integer;
PlayObject : TPlayObject;
UserItem : pTUserItem;
nItem, nBind : Integer;
ItemBind : pTItemBind;
nItemIdx, nMakeIdex : Integer;
sBindName : string;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
nBind := -1;
nItem := GetUseItemIdx(sItem);
if CompareText(sType, '帐号') = 0 then nBind := 0;
if CompareText(sType, '人物') = 0 then nBind := 1;
if CompareText(sType, 'IP') = 0 then nBind := 2;
if (nItem < 0) or (nBind < 0) or (sHumanName = '') or ((sHumanName <> '') and
(sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandBindUseItemHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
UserItem := @PlayObject.m_UseItems[nItem];
if UserItem.wIndex = 0 then begin
SysMsg(Format(g_sGameCommandBindUseItemNoItemMsg, [sHumanName, sItem]),
c_Red, t_Hint);
Exit;
end;
nItemIdx := UserItem.wIndex;
nMakeIdex := UserItem.MakeIndex;
case nBind of //
0: begin
sBindName := PlayObject.m_sUserID;
for i := 0 to g_ItemBindAccount.Count - 1 do begin
ItemBind := g_ItemBindAccount.Items[i];
if (ItemBind.nItemIdx = nItemIdx) and (ItemBind.nMakeIdex = nMakeIdex) then begin
SysMsg(Format(g_sGameCommandBindUseItemAlreadBindMsg, [sHumanName,
sItem]), c_Red, t_Hint);
Exit;
end;
end;
New(ItemBind);
ItemBind.nItemIdx := nItemIdx;
ItemBind.nMakeIdex := nMakeIdex;
ItemBind.sBindName := sBindName;
g_ItemBindAccount.Insert(0, ItemBind);
SaveItemBindAccount();
SysMsg(Format('%s[%s]IDX[%d]系列号[%d]持久[%d-%d],绑定到%s成功。',
[GetUseItemName(nItem),
UserEngine.GetStdItemName(UserItem.wIndex),
UserItem.wIndex,
UserItem.MakeIndex,
UserItem.Dura,
UserItem.DuraMax,
sBindName]),
c_Blue, t_Hint);
PlayObject.SysMsg(Format('你的%s[%s]已经绑定到%s[%s]上了。',
[GetUseItemName(nItem),
UserEngine.GetStdItemName(UserItem.wIndex),
sType,
sBindName
]), c_Blue, t_Hint);
end;
1: begin
sBindName := PlayObject.m_sCharName;
for i := 0 to g_ItemBindCharName.Count - 1 do begin
ItemBind := g_ItemBindCharName.Items[i];
if (ItemBind.nItemIdx = nItemIdx) and (ItemBind.nMakeIdex = nMakeIdex) then begin
SysMsg(Format(g_sGameCommandBindUseItemAlreadBindMsg, [sHumanName,
sItem]), c_Red, t_Hint);
Exit;
end;
end;
New(ItemBind);
ItemBind.nItemIdx := nItemIdx;
ItemBind.nMakeIdex := nMakeIdex;
ItemBind.sBindName := sBindName;
g_ItemBindCharName.Insert(0, ItemBind);
SaveItemBindCharName();
SysMsg(Format('%s[%s]IDX[%d]系列号[%d]持久[%d-%d],绑定到%s成功。',
[GetUseItemName(nItem),
UserEngine.GetStdItemName(UserItem.wIndex),
UserItem.wIndex,
UserItem.MakeIndex,
UserItem.Dura,
UserItem.DuraMax,
sBindName]),
c_Blue, t_Hint);
PlayObject.SysMsg(Format('你的%s[%s]已经绑定到%s[%s]上了。',
[GetUseItemName(nItem),
UserEngine.GetStdItemName(UserItem.wIndex),
sType,
sBindName
]), c_Blue, t_Hint);
end;
2: begin
sBindName := PlayObject.m_sIPaddr;
for i := 0 to g_ItemBindIPaddr.Count - 1 do begin
ItemBind := g_ItemBindIPaddr.Items[i];
if (ItemBind.nItemIdx = nItemIdx) and (ItemBind.nMakeIdex = nMakeIdex) then begin
SysMsg(Format(g_sGameCommandBindUseItemAlreadBindMsg, [sHumanName, sItem]), c_Red, t_Hint);
Exit;
end;
end;
New(ItemBind);
ItemBind.nItemIdx := nItemIdx;
ItemBind.nMakeIdex := nMakeIdex;
ItemBind.sBindName := sBindName;
g_ItemBindIPaddr.Insert(0, ItemBind);
SaveItemBindIPaddr();
SysMsg(Format('%s[%s]IDX[%d]系列号[%d]持久[%d-%d],绑定到%s成功。',
[GetUseItemName(nItem),
UserEngine.GetStdItemName(UserItem.wIndex),
UserItem.wIndex,
UserItem.MakeIndex,
UserItem.Dura,
UserItem.DuraMax,
sBindName]),
c_Blue, t_Hint);
PlayObject.SysMsg(Format('你的%s[%s]已经绑定到%s[%s]上了。',
[GetUseItemName(nItem),
UserEngine.GetStdItemName(UserItem.wIndex),
sType,
sBindName
]), c_Blue, t_Hint);
end;
end;
end;
procedure TPlayObject.CmdBonuPoint(Cmd: pTGameCmd; sHumName: string; nCount:
Integer);
var
PlayObject : TPlayObject;
sMsg : string;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumName = '') then begin
SysMsg('命令格式: @' + Cmd.sCmd +
' 人物名称 属性点数(不输入为查看点数)', c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumName]), c_Red, t_Hint);
Exit;
end;
if (nCount > 0) then begin
PlayObject.m_nBonusPoint := nCount;
PlayObject.SendMsg(Self, RM_ADJUST_BONUS, 0, 0, 0, 0, '');
Exit;
end;
sMsg :=
Format('未分配点数:%d 已分配点数:(DC:%d MC:%d SC:%d AC:%d MAC:%d HP:%d MP:%d HIT:%d SPEED:%d)',
[PlayObject.m_nBonusPoint,
PlayObject.m_BonusAbil.DC,
PlayObject.m_BonusAbil.MC,
PlayObject.m_BonusAbil.SC,
PlayObject.m_BonusAbil.AC,
PlayObject.m_BonusAbil.MAC,
PlayObject.m_BonusAbil.HP,
PlayObject.m_BonusAbil.MP,
PlayObject.m_BonusAbil.Hit,
PlayObject.m_BonusAbil.Speed
]);
SysMsg(Format('%s的属性点数为:%s', [sHumName, sMsg]), c_Red, t_Hint);
end;
procedure TPlayObject.CmdChangeAdminMode(sCmd: string; nPermission: Integer;
sParam1: string; boFlag: Boolean);
begin
if (m_btPermissionGM < nPermission) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if ((sParam1 <> '') and (sParam1[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [sCmd, '']), c_Red, t_Hint);
Exit;
end;
m_boAdminMode := boFlag;
if m_boAdminMode then SysMsg(sGameMasterMode, c_Green, t_Hint)
else SysMsg(sReleaseGameMasterMode, c_Green, t_Hint);
end;
procedure TPlayObject.CmdChangeAttackMode(nMode: Integer);
var
OldAttatckMode : Integer;
begin
if m_PEnvir.m_MapFlag.boNoChAttackMode then begin
SysMsg(sDisableChangeAttackMode, c_Red, t_Hint);
Exit;
end;
OldAttatckMode := m_btAttatckMode;
if (nMode >= 0) and (nMode <= 7) then
m_btAttatckMode := nMode
else begin
{$IF COUNTRYSYSTEM = 1}
if m_btAttatckMode < HAM_COUNTRY then Inc(m_btAttatckMode)
{$ELSE}
if m_btAttatckMode < HAM_DEAR then Inc(m_btAttatckMode)
{$IFEND}
else m_btAttatckMode := HAM_PKATTACK;
end;
while (True) do begin
if g_Config.boShowAttackModeMsg[m_btAttatckMode] then Break;
{$IF COUNTRYSYSTEM = 1}
if m_btAttatckMode < HAM_COUNTRY then Inc(m_btAttatckMode)
{$ELSE}
if m_btAttatckMode < HAM_DEAR then Inc(m_btAttatckMode)
{$IFEND}
else m_btAttatckMode := HAM_PKATTACK;
end;
case m_btAttatckMode of
HAM_PKATTACK: SysMsg(sAttackModeOfRedWhite, c_Green, t_Client);
//[攻击模式: 红名攻击]
HAM_ALL: SysMsg(sAttackModeOfAll, c_Green, t_Client);
//[攻击模式: 全体攻击]
HAM_PEACE: SysMsg(sAttackModeOfPeaceful, c_Green, t_Client);
//[攻击模式: 和平攻击]
HAM_DEAR: SysMsg(sAttackModeOfDear, c_Green, t_Client);
//[攻击模式: 夫妻攻击]
HAM_MASTER: SysMsg(sAttackModeOfMaster, c_Green, t_Client);
//[攻击模式: 师徒攻击]
HAM_GROUP: SysMsg(sAttackModeOfGroup, c_Green, t_Client);
//[攻击模式: 编组攻击]
HAM_GUILD: SysMsg(sAttackModeOfGuild, c_Green, t_Client);
//[攻击模式: 行会攻击]
{$IF COUNTRYSYSTEM = 1}
HAM_COUNTRY: if g_Config.boShowAttackModeMsg[m_btAttatckMode] then
SysMsg(sAttackModeOfCountry, c_Green, t_Client);
//[攻击模式:国家攻击]
{$IFEND}
end;
//元神的攻击模式和主人相同
if not m_boPneuma and (m_PneumaObject <> nil) then
m_PneumaObject.m_btAttatckMode := m_btAttatckMode;
end;
procedure TPlayObject.CmdChangeDearName(Cmd: pTGameCmd; sHumanName, sDearName:
string);
var
PlayObject : TPlayObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') or (sDearName = '') then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 人物名称 配偶名称(如果为 无 则清除)', c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject <> nil then begin
if CompareText(sDearName, '无') = 0 then begin
PlayObject.m_sDearName := '';
PlayObject.RefShowName;
if g_Config.boShowScriptActionMsg then
SysMsg(sHumanName + ' 的配偶名清除成功。', c_Green, t_Hint);
end else begin
PlayObject.m_sDearName := sDearName;
PlayObject.RefShowName;
if g_Config.boShowScriptActionMsg then
SysMsg(sHumanName + ' 的配偶名更改成功。', c_Green, t_Hint);
end;
end else begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
end;
end;
//改性别
procedure TPlayObject.CmdChangeGender(Cmd: pTGameCmd; sHumanName, sSex: string);
var
PlayObject : TPlayObject;
nSex : Integer;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
nSex := -1;
if (sSex = 'Man') or (sSex = '男') or (sSex = '0') then begin
nSex := 0;
end;
if (sSex = 'WoMan') or (sSex = '女') or (sSex = '1') then begin
nSex := 1;
end;
if (sHumanName = '') or (nSex = -1) then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 人物名称 性别(男、女)',
c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject <> nil then begin
if PlayObject.m_btGender <> nSex then begin
PlayObject.m_btGender := nSex;
PlayObject.FeatureChanged();
SysMsg(PlayObject.m_sCharName + ' 的性别已改变。', c_Green, t_Hint);
end else begin
SysMsg(PlayObject.m_sCharName + ' 的性别未改变!!!', c_Red, t_Hint);
end;
end else begin
SysMsg(sHumanName + '没有在线!!!', c_Red, t_Hint);
end;
end;
//自定义物品名字
procedure TPlayObject.CmdChangeItemName(sCmd, sMakeIndex, sItemIndex, sItemName:
string);
var
nMakeIndex, nItemIndex : Integer;
begin
if (m_btPermissionGM < 6) then Exit;
if (sMakeIndex = '') or (sItemIndex = '') or (sItemName = '') then begin
SysMsg('命令格式: @' + sCmd + ' 物品编号 物品ID号 物品名称', c_Red, t_Hint);
Exit;
end;
nMakeIndex := Str_ToInt(sMakeIndex, -1);
nItemIndex := Str_ToInt(sItemIndex, -1);
if (nMakeIndex <= 0) or (nItemIndex < 0) then begin
SysMsg('命令格式: @' + sCmd + ' 物品编号 物品ID号 物品名称', c_Red, t_Hint);
Exit;
end;
if ItemUnit.AddCustomItemName(nMakeIndex, nItemIndex, sItemName) then begin
ItemUnit.SaveCustomItemName();
SysMsg('物品名称设置成功。', c_Green, t_Hint);
Exit;
end;
SysMsg('此物品,已经设置了其它的名称!!!', c_Red, t_Hint);
end;
//改变职业
procedure TPlayObject.CmdChangeJob(Cmd: pTGameCmd; sHumanName, sJobName: string);
var
PlayObject : TPlayObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') or (sJobName = '') then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandChangeJobHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject <> nil then begin
if CompareText(sJobName, 'Warr') = 0 then PlayObject.m_btJob := 0;
if CompareText(sJobName, 'Wizard') = 0 then PlayObject.m_btJob := 1;
if CompareText(sJobName, 'Taos') = 0 then PlayObject.m_btJob := 2;
if CompareText(sJobName, 'Goblin') = 0 then PlayObject.m_btJob := 3;
PlayObject.HasLevelUp(0);
PlayObject.SysMsg(g_sGameCommandChangeJobHumanMsg, c_Green, t_Hint);
SysMsg(Format(g_sGameCommandChangeJobMsg, [sHumanName]), c_Green, t_Hint);
if not m_boPneuma then begin
PlayObject.SendUpdateDelayMsg(PlayObject, RM_REFRESHRANK, 0, 0, 0, 0, '', 1000);
PlayObject.SendUpdateDelayMsg(PlayObject, RM_REFRESHRANK, 0, 5, 0, 0, '', 1000);
end else begin
PlayObject.SendUpdateDelayMsg(PlayObject, RM_REFRESHRANK, 0, 1, 0, 0, '', 1000);
end;
end else begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
end;
end;
//修改等级
procedure TPlayObject.CmdChangeLevel(Cmd: pTGameCmd; sParam1: string);
var
nOLevel : Integer;
nLevel : Integer;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if ((sParam1 <> '') and (sParam1[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd, '']), c_Red, t_Hint);
Exit;
end;
nLevel := Str_ToInt(sParam1, 1);
nOLevel := m_Abil.level;
m_Abil.level := _MIN(MAXUPLEVEL, nLevel);
HasLevelUp(m_Abil.level - 1);
if g_Config.boShowMakeItemMsg then begin
MainOutMessage(Format(g_sGameCommandLevelConsoleMsg, [m_sCharName, nOLevel,
m_Abil.level]));
end;
end;
procedure TPlayObject.CmdChangeMasterName(Cmd: pTGameCmd; sHumanName,
sMasterName, sIsMaster: string);
var
PlayObject : TPlayObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') or (sMasterName = '') then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 人物名称 师徒名称(如果为 无 则清除)', c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject <> nil then begin
ChangeMasterName(sHumanName, sMasterName, sIsMaster = '1');
if g_Config.boShowScriptActionMsg then
SysMsg(sHumanName + ' 的师徒名更改成功。', c_Green, t_Hint);
end else begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
end;
end;
procedure TPlayObject.CmdChangeObMode(sCmd: string; nPermission: Integer;
sParam1: string; boFlag: Boolean);
begin
if (m_btPermissionGM < nPermission) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if ((sParam1 <> '') and (sParam1[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [sCmd, '']), c_Red, t_Hint);
Exit;
end;
if boFlag then begin
SendRefMsg(RM_DISAPPEAR, 0, 0, 0, 0, '');
//01/21 强行发送刷新数据到客户端,解决GM登录隐身有影子问题
end;
m_boObMode := boFlag;
if m_boObMode then
SysMsg(sObserverMode, c_Green, t_Hint)
else
SysMsg(g_sReleaseObserverMode, c_Green, t_Hint);
end;
procedure TPlayObject.CmdChangeSabukLord(Cmd: pTGameCmd; sCASTLENAME,
sGuildName: string; boFlag: Boolean); //004CFE1C
var
Guild : TGuild;
Castle : TUserCastle;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sCASTLENAME = '') or (sGuildName = '') then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 城堡名称 行会名称', c_Red, t_Hint);
Exit;
end;
Castle := g_CastleManager.Find(sCASTLENAME);
if Castle = nil then begin
SysMsg(Format(g_sGameCommandSbkGoldCastleNotFoundMsg, [sCASTLENAME]), c_Red, t_Hint);
Exit;
end;
Guild := g_GuildManager.FindGuild(sGuildName);
if Guild <> nil then begin
//4CFEC7
AddGameDataLog('27' + #9 +
Castle.m_sOwnGuild + #9 +
'0' + #9 +
'1' + #9 +
'sGuildName' + #9 +
m_sCharName + #9 +
'0' + #9 +
'1' + #9 +
'0');
Castle.GetCastle(Guild);
if boFlag then
UserEngine.SendServerGroupMsg(SS_211, g_Config.nServerNumber, sGuildName);
SysMsg(Castle.m_sName + ' 所属行会已经更改为 ' + sGuildName,
c_Green, t_Hint);
end else begin
SysMsg('行会 ' + sGuildName + '还没建立!!!', c_Red, t_Hint);
end;
end;
procedure TPlayObject.CmdChangeSalveStatus;
var
i, nCount : Integer;
begin
nCount := 0;
if m_SlaveList.Count > 0 then begin
m_boSlaveRelax := not m_boSlaveRelax;
if (m_TorDDM.Tiger.DB.Dragon > 0) then m_boTigerRelax := m_boSlaveRelax;
if m_PneumaObject <> nil then
m_PneumaObject.m_boSlaveRelax := m_boSlaveRelax;
for i := 0 to m_SlaveList.Count - 1 do begin
if TBaseObject(m_SlaveList[i]).IsTiger and (m_TorDDM.Tiger.DB.Dragon = 0) then Continue;
TBaseObject(m_SlaveList[i]).m_boSlaveRelax := m_boSlaveRelax;
if m_boSlaveRelax then
TBaseObject(m_SlaveList[i]).DelTargetCreat;
Inc(nCount);
end;
end else if (m_PneumaObject <> nil) and (m_PneumaObject.m_SlaveList.Count > 0) then begin
m_boSlaveRelax := not m_boSlaveRelax;
m_PneumaObject.m_boSlaveRelax := m_boSlaveRelax;
for i := 0 to m_PneumaObject.m_SlaveList.Count - 1 do begin
if TBaseObject(m_PneumaObject.m_SlaveList[i]).IsTiger then Continue;
TBaseObject(m_PneumaObject.m_SlaveList[i]).m_boSlaveRelax := m_boSlaveRelax;
if m_boSlaveRelax then
TBaseObject(m_PneumaObject.m_SlaveList[i]).DelTargetCreat;
Inc(nCount);
end;
end;
if nCount > 0 then begin
if m_boSlaveRelax then
SysMsg(sPetRest, c_Green, t_Hint)
else
SysMsg(sPetAttack, c_Green, t_Hint);
end;
end;
procedure TPlayObject.CmdChangeSuperManMode(sCmd: string; nPermission: Integer;
sParam1: string; boFlag: Boolean);
begin
if (m_btPermissionGM < nPermission) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if ((sParam1 <> '') and (sParam1[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [sCmd, '']), c_Red, t_Hint);
Exit;
end;
m_boSuperMan := boFlag;
if m_boSuperMan then SysMsg(sSupermanMode, c_Green, t_Hint)
else SysMsg(sReleaseSupermanMode, c_Green, t_Hint);
end;
procedure TPlayObject.CmdChangeTigerStatus;
begin
if (m_Tiger <> nil) and (not m_Tiger.m_boDeath) and (not m_Tiger.m_boGhost) and (m_TorDDM.Tiger.DB.Dragon = 0) then begin
m_boTigerRelax := not m_boTigerRelax;
if m_boTigerRelax then begin
SysMsg('虎王休息', c_Green, t_Hint);
SendDefMessage(SM_TIGERSTATUS, 0, 0, 0, 0, '');
m_Tiger.DelTargetCreat;
end else begin
SysMsg('虎王攻击', c_Green, t_Hint);
SendDefMessage(SM_TIGERSTATUS, 0, 1, 0, 0, '');
end;
m_Tiger.m_boTigerRelax := m_boTigerRelax;
end;
end;
procedure TPlayObject.CmdChangeUserFull(sCmd, sUserCount: string);
var
nCount : Integer;
begin
if (m_btPermissionGM < 6) then Exit;
nCount := Str_ToInt(sUserCount, -1);
if (sUserCount = '') or (nCount < 1) or ((sUserCount <> '') and (sUserCount[1]
= '?')) then begin
SysMsg('设置服务器最高上线人数。', c_Red, t_Hint);
SysMsg('命令格式: @' + sCmd + ' 人数', c_Red, t_Hint);
Exit;
end;
g_Config.nUserFull := nCount;
SysMsg(Format('服务器上线人数限制: %d', [nCount]), c_Green, t_Hint);
end;
procedure TPlayObject.CmdChangeZenFastStep(sCmd, sFastStep: string);
var
nFastStep : Integer;
begin
if (m_btPermissionGM < 6) then Exit;
nFastStep := Str_ToInt(sFastStep, -1);
if (sFastStep = '') or (nFastStep < 1) or ((sFastStep <> '') and (sFastStep[1]
= '?')) then begin
SysMsg('设置怪物行动速度。', c_Red, t_Hint);
SysMsg('命令格式: @' + sCmd + ' 速度', c_Red, t_Hint);
Exit;
end;
g_Config.nZenFastStep := nFastStep;
SysMsg(Format('怪物行动速度: %d', [nFastStep]), c_Green, t_Hint);
end;
procedure TPlayObject.CmdClearBagItem(Cmd: pTGameCmd; sHumanName: string);
var
i : Integer;
PlayObject : TPlayObject;
UserItem : pTUserItem;
DelList : TStringList;
begin
DelList := nil;
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') or ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd, '人物名称']), c_Red,
t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
for i := 0 to PlayObject.m_ItemList.Count - 1 do begin
UserItem := PlayObject.m_ItemList.Items[i];
//if DelList = nil then DelList := TStringList.Create;
//DelList.AddObject(UserEngine.GetStdItemName(UserItem.wIndex), TObject(UserItem.MakeIndex));
SendDelItems(UserItem);
Dispose(UserItem);
end;
PlayObject.m_ItemList.Clear;
WeightChanged;
// if DelList <> nil then begin
// PlayObject.SendMsg(PlayObject, RM_SENDDELITEMLIST, 0, Integer(DelList), 0, 0, '');
// end;
end;
procedure TPlayObject.CmdClearHumanPassword(sCmd: string; nPermission: Integer;
sHumanName: string);
var
PlayObject : TPlayObject;
begin
if (m_btPermissionGM < nPermission) then Exit;
if (sHumanName = '') or ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg('清除玩家的仓库密码!!!', c_Red, t_Hint);
SysMsg(Format('命令格式: @%s 人物名称', [sCmd]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
Exit;
end;
PlayObject.m_boPasswordLocked := False;
PlayObject.m_boUnLockStoragePwd := False;
PlayObject.m_sStoragePwd := '';
PlayObject.SysMsg('你的保护密码已被清除!!!', c_Green, t_Hint);
SysMsg(Format('%s的保护密码已被清除!!!', [sHumanName]),
c_Green, t_Hint);
end;
procedure TPlayObject.CmdClearMapMonster(Cmd: pTGameCmd; sMapName, sMonName,
sItems, sGhost: string);
var
i, ii : Integer;
MonList : TList;
Envir : TEnvirnoment;
nMonCount : Integer;
boKillAll : Boolean;
boKillAllMap : Boolean;
boNotItem : Boolean;
boMakeGhost : Boolean;
BaseObject : TBaseObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sMapName = '') or (sMonName = '') or (sItems = '') then begin
SysMsg('命令格式: @' + Cmd.sCmd +
' 地图号(* 为所有) 怪物名称(* 为所有) 掉物品(0,1) 清理尸体(0,1)',
c_Red, t_Hint);
Exit;
end;
boKillAll := False;
boKillAllMap := False;
boNotItem := True;
boMakeGhost := False;
nMonCount := 0;
Envir := nil;
if sMonName = '*' then boKillAll := True;
if sMapName = '*' then boKillAllMap := True;
if sItems = '1' then boNotItem := False;
if sGhost = '1' then boMakeGhost := True;
MonList := TList.Create;
if boKillAllMap then begin
for i := 0 to g_MapManager.Count - 1 do begin
Envir := TEnvirnoment(g_MapManager.Values[g_MapManager.Keys[i]]);
if (Envir <> nil) then begin
MonList.Clear;
UserEngine.GetMapMonster(Envir, MonList);
for ii := 0 to MonList.Count - 1 do begin
BaseObject := TBaseObject(MonList.Items[ii]);
if boKillAll or (CompareText(sMonName, BaseObject.m_sCharName) = 0) then begin
BaseObject.m_nHealthTick := 0;
BaseObject.m_boNoItem := boNotItem;
if boMakeGhost then BaseObject.MakeGhost else BaseObject.Die;
Inc(nMonCount);
end;
end;
end;
end;
end else begin
Envir := g_MapManager.FindMap(sMapName);
if (Envir <> nil) then begin
MonList.Clear;
UserEngine.GetMapMonster(Envir, MonList);
for ii := 0 to MonList.Count - 1 do begin
BaseObject := TBaseObject(MonList.Items[ii]);
if boKillAll or (CompareText(sMonName, BaseObject.m_sCharName) = 0) then begin
BaseObject.m_nHealthTick := 0;
BaseObject.m_boNoItem := boNotItem;
if boMakeGhost then BaseObject.MakeGhost else BaseObject.Die;
Inc(nMonCount);
end;
end;
end;
end;
MonList.free;
if Envir = nil then begin
SysMsg('输入的地图不存在!!!', c_Red, t_Hint);
Exit;
end;
SysMsg('已清除怪物数: ' + IntToStr(nMonCount), c_Red, t_Hint);
end;
procedure TPlayObject.CmdClearMission(Cmd: pTGameCmd; sHumanName: string);
var
PlayObject : TPlayObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 人物名称)', c_Red, t_Hint);
Exit;
end;
if sHumanName[1] = '?' then begin
SysMsg('此命令用于清除人物的任务标志。', c_Blue, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format('%s不在线,或在其它服务器上!!', [sHumanName]),
c_Red, t_Hint);
Exit;
end;
FillChar(PlayObject.m_QuestFlag, SizeOf(TQuestFlag), #0);
SysMsg(Format('%s的任务标志已经全部清零。', [sHumanName]),
c_Green, t_Hint);
end;
procedure TPlayObject.CmdContestPoint(Cmd: pTGameCmd; sGuildName: string);
//004CEF08
var
//I: Integer;
Guild : TGuild;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sGuildName = '') or ((sGuildName <> '') and (sGuildName[1] = '?')) then begin
SysMsg('查看行会战的得分数。', c_Red, t_Hint);
SysMsg(Format('命令格式: @%s 行会名称', [Cmd.sCmd]), c_Red, t_Hint);
Exit;
end;
Guild := g_GuildManager.FindGuild(sGuildName);
if Guild <> nil then begin
SysMsg(Format('%s 的得分为: %d', [sGuildName, Guild.nContestPoint]),
c_Green, t_Hint);
end else begin
SysMsg(Format('行会: %s 不存在!!!', [sGuildName]), c_Green,
t_Hint);
end;
end;
procedure TPlayObject.CmdCreditPoint(Cmd: pTGameCmd; sHumanName, sCtr: string;
nPoint: Integer);
var
PlayObject : TPlayObject;
Ctr : Char;
nCreditPoint : Integer;
begin
Ctr := '1';
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sCtr <> '') then begin
Ctr := sCtr[1];
end;
if (sHumanName = '') or not (Ctr in ['=', '+', '-']) or (nPoint < 0) or (nPoint > High(byte)) or ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandCreditPointHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
case sCtr[1] of
'=': begin
PlayObject.m_wCreditPoint := nPoint;
end;
'+': begin
if (PlayObject.m_wCreditPoint + nPoint) > High(word) then
PlayObject.m_wCreditPoint := High(word)
else
PlayObject.m_wCreditPoint := PlayObject.m_wCreditPoint + nPoint;
end;
'-': begin
if (PlayObject.m_wCreditPoint - nPoint) < 0 then
PlayObject.m_wCreditPoint := 0
else
PlayObject.m_wCreditPoint := PlayObject.m_wCreditPoint - nPoint;
end;
end;
PlayObject.SendUpdateMsg(PlayObject, RM_SUBABILITY, 0, 0, 0, 0, '');
PlayObject.SysMsg(Format(g_sGameCommandCreditPointHumanMsg, [nPoint, PlayObject.m_wCreditPoint]), c_Green, t_Hint);
SysMsg(Format(g_sGameCommandCreditPointGMMsg, [sHumanName, nPoint,
PlayObject.m_wCreditPoint]), c_Green, t_Hint);
end;
procedure TPlayObject.CmdDearRecall(sCmd, sParam: string);
begin
if (sParam <> '') and (sParam[1] = '?') then begin
SysMsg('命令格式: @' + sCmd +
' (夫妻传送,将对方传送到自己身边,对方必须允许传送。)',
c_Green, t_Hint);
Exit;
end;
if m_sDearName = '' then begin
SysMsg('你没有结婚!!!', c_Red, t_Hint);
Exit;
end;
if m_PEnvir.m_MapFlag.boNODEARRECALL then begin
SysMsg('本地图禁止夫妻传送!!!', c_Red, t_Hint);
Exit;
end;
if (m_DearHuman = nil) or m_DearHuman.m_boGhost or m_DearHuman.m_boDeath then begin
if m_btGender = 0 then begin
SysMsg('你的老婆不在线!!!', c_Red, t_Hint);
end else begin
SysMsg('你的老公不在线!!!', c_Red, t_Hint);
end;
Exit;
end;
if GetTickCount - m_dwDearRecallTick < 10000 then begin
SysMsg('稍等会儿才能再次使用此功能!!!', c_Red, t_Hint);
Exit;
end;
if m_boArrow then begin
SysMsg('您正在执行任务,目前无法使用此功能!!!',
c_Red, t_Hint);
Exit;
end;
m_dwDearRecallTick := GetTickCount();
if m_DearHuman.m_boCanDearRecall then begin
RecallHuman(m_DearHuman.m_sCharName, $20);
SendRefMsg(RM_510, 1, 0, $20, 0, '');
m_DearHuman.SendDelayMsg(Self, RM_510, 1, 0, $20, 0, '', 100);
end else begin
SysMsg(m_DearHuman.m_sCharName + ' 不允许传送!!!', c_Red,
t_Hint);
Exit;
end;
end;
procedure TPlayObject.CmdDelBonuPoint(Cmd: pTGameCmd; sHumName: string);
var
PlayObject : TPlayObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if sHumName = '' then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 人物名称', c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumName);
if PlayObject <> nil then begin
FillChar(PlayObject.m_BonusAbil, SizeOf(TNakedAbility), #0);
PlayObject.m_nBonusPoint := 0;
PlayObject.SendMsg(PlayObject, RM_ADJUST_BONUS, 0, 0, 0, 0, '');
PlayObject.HasLevelUp(0);
PlayObject.SysMsg('分配点数已清除!!!', c_Red, t_Hint);
SysMsg(sHumName + ' 的分配点数已清除.', c_Green, t_Hint);
end else begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumName]), c_Red, t_Hint);
end;
end;
procedure TPlayObject.CmdDelDenyAccountLogon(Cmd: pTGameCmd; sAccount,
sFixDeny: string);
var
i : Integer;
boDelete : Boolean;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if sAccount = '' then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 登录帐号', c_Red, t_Hint);
Exit;
end;
boDelete := False;
g_DenyAccountList.Lock;
try
for i := g_DenyAccountList.Count - 1 downto 0 do begin
if CompareText(sAccount, g_DenyAccountList.Strings[i]) = 0 then begin
if Integer(g_DenyAccountList.Objects[i]) <> 0 then
SaveDenyAccountList;
g_DenyAccountList.Delete(i);
SysMsg(sAccount + '已从禁止登录帐号列表中删除。', c_Green,
t_Hint);
boDelete := True;
Break;
end;
end;
finally
g_DenyAccountList.UnLock;
end;
if not boDelete then
SysMsg(sAccount + '没有被禁止登录。', c_Green, t_Hint);
end;
procedure TPlayObject.CmdDelDenyCharNameLogon(Cmd: pTGameCmd; sCharName,
sFixDeny: string);
var
i : Integer;
boDelete : Boolean;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if sCharName = '' then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 人物名称', c_Red, t_Hint);
Exit;
end;
boDelete := False;
g_DenyChrNameList.Lock;
try
for i := g_DenyChrNameList.Count - 1 downto 0 do begin
if CompareText(sCharName, g_DenyChrNameList.Strings[i]) = 0 then begin
if Integer(g_DenyChrNameList.Objects[i]) <> 0 then
SaveDenyChrNameList;
g_DenyChrNameList.Delete(i);
SysMsg(sCharName + '已从禁止登录人物列表中删除。',
c_Green, t_Hint);
boDelete := True;
Break;
end;
end;
finally
g_DenyChrNameList.UnLock;
end;
if not boDelete then
SysMsg(sCharName + '没有被禁止登录。', c_Green, t_Hint);
end;
procedure TPlayObject.CmdDelDenyIPaddrLogon(Cmd: pTGameCmd; sIPaddr,
sFixDeny: string);
var
i : Integer;
boDelete : Boolean;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if sIPaddr = '' then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' IP地址', c_Red, t_Hint);
Exit;
end;
boDelete := False;
g_DenyIPAddrList.Lock;
try
for i := g_DenyIPAddrList.Count - 1 downto 0 do begin
if CompareText(sIPaddr, g_DenyIPAddrList.Strings[i]) = 0 then begin
if Integer(g_DenyIPAddrList.Objects[i]) <> 0 then
SaveDenyIPAddrList;
g_DenyIPAddrList.Delete(i);
SysMsg(sIPaddr + '已从禁止登录IP列表中删除。', c_Green,
t_Hint);
boDelete := True;
Break;
end;
end;
finally
g_DenyIPAddrList.UnLock;
end;
if not boDelete then
SysMsg(sIPaddr + '没有被禁止登录。', c_Green, t_Hint);
end;
procedure TPlayObject.CmdDeleteItem(Cmd: pTGameCmd; sHumanName, sItemName:
string; nCount: Integer); //004CDFF8
var
i : Integer;
PlayObject : TPlayObject;
nItemCount : Integer;
StdItem : pTStdItem;
UserItem : pTUserItem;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') or (sItemName = '') then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 人物名称 物品名称 数量)',
c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
nItemCount := 0;
for i := PlayObject.m_ItemList.Count - 1 downto 0 do begin
UserItem := PlayObject.m_ItemList.Items[i];
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if (StdItem <> nil) and (CompareText(sItemName, StdItem.Name) = 0) then begin
PlayObject.SendDelItems(UserItem);
Dispose(UserItem);
PlayObject.m_ItemList.Delete(i);
Inc(nItemCount);
if nItemCount >= nCount then Break;
end;
end;
end;
procedure TPlayObject.CmdDelGold(Cmd: pTGameCmd; sHumName: string; nCount:
Integer); //004CD27C
var
PlayObject : TPlayObject;
nServerNumber : Integer;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumName = '') or (nCount <= 0) then Exit;
PlayObject := UserEngine.GetPlayObject(sHumName);
if PlayObject <> nil then begin
if PlayObject.m_nGold > nCount then begin
Dec(PlayObject.m_nGold, nCount);
end else begin
nCount := PlayObject.m_nGold;
PlayObject.m_nGold := 0;
end;
PlayObject.GoldChanged();
SysMsg(sHumName + '的金币已减少' + IntToStr(nCount) + '.', c_Green, t_Hint);
if g_boGameLogGold then
AddGameDataLog('5' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
sSTRING_GOLDNAME + #9 +
IntToStr(nCount) + #9 +
'1' + #9 +
sHumName);
end else begin
if UserEngine.FindOtherServerUser(sHumName, nServerNumber) then begin
SysMsg(sHumName + '现在' + IntToStr(nServerNumber) + '号服务器上', c_Green, t_Hint);
end else begin
SysMsg(sHumName + '现在不在线!!!', c_Green, t_Hint);
end;
end;
end;
procedure TPlayObject.CmdDelGuild(Cmd: pTGameCmd; sGuildName: string); //004CEDEC
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if g_Config.nServerNumber <> 0 then begin
SysMsg('只能在主服务器上才可以使用此命令删除行会!!!', c_Red, t_Hint);
Exit;
end;
if sGuildName = '' then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 行会名称', c_Red, t_Hint);
Exit;
end;
if g_GuildManager.DelGuild(sGuildName) then begin
UserEngine.SendServerGroupMsg(SS_206, g_Config.nServerNumber, sGuildName);
end else begin
SysMsg('没找到' + sGuildName + '这个行会!!!', c_Red, t_Hint);
end;
end;
procedure TPlayObject.CmdDelNpc(sCmd: string; nPermission: Integer; sParam1:
string);
var
BaseObject : TBaseObject;
i : Integer;
resourcestring
sDelOK = '删除NPC成功...';
begin
if (m_btPermissionGM < nPermission) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if ((sParam1 <> '') and (sParam1[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [sCmd, '']), c_Red, t_Hint);
Exit;
end;
BaseObject := GetPoseCreate();
if BaseObject <> nil then begin
for i := 0 to UserEngine.m_MerchantList.Count - 1 do begin
if TBaseObject(UserEngine.m_MerchantList.Items[i]) = BaseObject then begin
BaseObject.m_boGhost := True;
BaseObject.m_dwGhostTick := GetTickCount();
BaseObject.SendRefMsg(RM_DISAPPEAR, 0, 0, 0, 0, '');
SysMsg(sDelOK, c_Red, t_Hint);
Exit;
end;
end;
for i := 0 to UserEngine.QuestNPCList.Count - 1 do begin
if TBaseObject(UserEngine.QuestNPCList.Items[i]) = BaseObject then begin
BaseObject.m_boGhost := True;
BaseObject.m_dwGhostTick := GetTickCount();
BaseObject.SendRefMsg(RM_DISAPPEAR, 0, 0, 0, 0, '');
SysMsg(sDelOK, c_Red, t_Hint);
Exit;
end;
end;
end;
SysMsg(g_sGameCommandDelNpcMsg, c_Red, t_Hint);
end;
procedure TPlayObject.CmdDelSkill(Cmd: pTGameCmd; sHumanName, sSkillName:
string);
var
i : Integer;
PlayObject : TPlayObject;
boDelAll : Boolean;
UserMagic : pTUserMagic;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') or (sSkillName = '') then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 人物名称 技能名称)', c_Red,
t_Hint);
Exit;
end;
if CompareText(sSkillName, 'All') = 0 then boDelAll := True
else boDelAll := False;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
if boDelAll then begin
for i := PlayObject.m_MagicList.Count - 1 downto 0 do begin
UserMagic := PlayObject.m_MagicList.Items[i];
if UserMagic.btType = MAG_STUDY then begin
PlayObject.SendDelMagic(UserMagic);
PlayObject.m_MagicList.Delete(i);
Dispose(UserMagic);
end;
end;
end else begin
if PlayObject.DelItemSkill(sSkillName) then begin
PlayObject.SysMsg(Format('技能%s已删除。', [sSkillName]), c_Green, t_Hint);
SysMsg(Format('%s的技能%s已删除。', [sHumanName, sSkillName]), c_Green, t_Hint);
end;
end;
PlayObject.RecalcHitSpeed;
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendUpdateMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
end;
procedure TPlayObject.CmdDenyAccountLogon(Cmd: pTGameCmd; sAccount, sFixDeny:
string);
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if sAccount = '' then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 登录帐号 是否永久封(0,1)',
c_Red, t_Hint);
Exit;
end;
g_DenyAccountList.Lock;
try
if (sFixDeny <> '') and (sFixDeny[1] = '1') then begin
g_DenyAccountList.AddObject(sAccount, TObject(1));
SaveDenyAccountList();
SysMsg(sAccount + '已加入禁止登录帐号列表', c_Green, t_Hint);
end else begin
g_DenyAccountList.AddObject(sAccount, TObject(0));
SysMsg(sAccount + '已加入临时禁止登录帐号列表', c_Green,
t_Hint);
end;
finally
g_DenyAccountList.UnLock;
end;
end;
procedure TPlayObject.CmdDenyCharNameLogon(Cmd: pTGameCmd; sCharName, sFixDeny:
string);
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if sCharName = '' then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 人物名称 是否永久封(0,1)',
c_Red, t_Hint);
Exit;
end;
g_DenyChrNameList.Lock;
try
if (sFixDeny <> '') and (sFixDeny[1] = '1') then begin
g_DenyChrNameList.AddObject(sCharName, TObject(1));
SaveDenyChrNameList();
SysMsg(sCharName + '已加入禁止人物列表', c_Green, t_Hint);
end else begin
g_DenyChrNameList.AddObject(sCharName, TObject(0));
SysMsg(sCharName + '已加入临时禁止人物列表', c_Green, t_Hint);
end;
finally
g_DenyChrNameList.UnLock;
end;
end;
procedure TPlayObject.CmdDenyIPaddrLogon(Cmd: pTGameCmd; sIPaddr, sFixDeny:
string);
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if sIPaddr = '' then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' IP地址 是否永久封(0,1)',
c_Red, t_Hint);
Exit;
end;
g_DenyIPAddrList.Lock;
try
if (sFixDeny <> '') and (sFixDeny[1] = '1') then begin
g_DenyIPAddrList.AddObject(sIPaddr, TObject(1));
SaveDenyIPAddrList();
SysMsg(sIPaddr + '已加入禁止登录IP列表', c_Green, t_Hint);
end else begin
g_DenyIPAddrList.AddObject(sIPaddr, TObject(0));
SysMsg(sIPaddr + '已加入临时禁止登录IP列表', c_Green, t_Hint);
end;
finally
g_DenyIPAddrList.UnLock;
end;
end;
procedure TPlayObject.CmdDisableFilter(sCmd, sParam1: string);
begin
if (m_btPermissionGM < 6) then Exit;
if (sParam1 <> '') and (sParam1[1] = '?') then begin
SysMsg('启用/禁止文字过滤功能。', c_Red, t_Hint);
Exit;
end;
boFilterWord := not boFilterWord;
if boFilterWord then begin
SysMsg('已启用文字过滤。', c_Green, t_Hint);
end else begin
SysMsg('已禁止文字过滤。', c_Green, t_Hint);
end;
end;
procedure TPlayObject.CmdDisableSendMsg(Cmd: pTGameCmd; sHumanName: string);
var
PlayObject : TPlayObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if sHumanName = '' then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 人物名称', c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject <> nil then begin
PlayObject.m_boFilterSendMsg := True;
end;
g_DisableSendMsgList.Add(sHumanName);
SaveDisableSendMsgList();
SysMsg(sHumanName + ' 已加入禁言列表。', c_Green, t_Hint);
end;
procedure TPlayObject.CmdDisableSendMsgList(Cmd: pTGameCmd);
var
i : Integer;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if g_DisableSendMsgList.Count <= 0 then begin
SysMsg('禁言列表为空!!!', c_Red, t_Hint);
Exit;
end;
SysMsg('禁言列表:', c_Blue, t_Hint);
for i := 0 to g_DisableSendMsgList.Count - 1 do begin
SysMsg(g_DisableSendMsgList.Strings[i], c_Green, t_Hint);
end;
end;
procedure TPlayObject.CmdEnableSendMsg(Cmd: pTGameCmd; sHumanName: string);
var
i : Integer;
PlayObject : TPlayObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if sHumanName = '' then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 人物名称', c_Red, t_Hint);
Exit;
end;
for i := g_DisableSendMsgList.Count - 1 downto 0 do begin
if CompareText(sHumanName, g_DisableSendMsgList.Strings[i]) = 0 then begin
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject <> nil then begin
PlayObject.m_boFilterSendMsg := False;
end;
g_DisableSendMsgList.Delete(i);
SaveDisableSendMsgList();
SysMsg(sHumanName + ' 已从禁言列表中删除。', c_Green, t_Hint);
Exit;
end;
end;
SysMsg(sHumanName + ' 没有被禁言!!!', c_Red, t_Hint);
end;
procedure TPlayObject.CmdEndContest(Cmd: pTGameCmd; sParam1: string); //004CF364
var
i, ii : Integer;
List10, List14 : TList;
PlayObject, PlayObjectA : TPlayObject;
bo19 : Boolean;
//s20:String;
Guild : TGuild;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if ((sParam1 <> '') and (sParam1[1] = '?')) then begin
SysMsg('结束行会争霸赛。', c_Red, t_Hint);
SysMsg(Format('命令格式: @%s', [Cmd.sCmd]), c_Red, t_Hint);
Exit;
end;
if not m_PEnvir.m_MapFlag.boFight3 then begin
SysMsg('此命令不能在当前地图中使用!!!', c_Red, t_Hint);
Exit;
end;
List10 := TList.Create;
List14 := TList.Create;
UserEngine.GetMapRageHuman(m_PEnvir, m_nCurrX, m_nCurrY, 1000, List10);
for i := 0 to List10.Count - 1 do begin
PlayObject := TPlayObject(List10.Items[i]);
if not PlayObject.m_boObMode or not PlayObject.m_boAdminMode then begin
if PlayObject.m_MyGuild = nil then Continue;
bo19 := False;
for ii := 0 to List14.Count - 1 do begin
PlayObjectA := TPlayObject(List14.Items[ii]);
if PlayObject.m_MyGuild = PlayObjectA.m_MyGuild then
bo19 := True;
end;
if not bo19 then begin
List14.Add(PlayObject.m_MyGuild);
end;
end;
end;
for i := 0 to List14.Count - 1 do begin
Guild := TGuild(List14.Items[i]);
Guild.EndTeamFight();
UserEngine.CryCry(RM_CRY, m_PEnvir, m_nCurrX, m_nCurrY, 1000,
g_Config.btCryMsgFColor, g_Config.btCryMsgBColor,
Format(' - %s 行会争霸赛已结束。', [Guild.sGuildName]));
end;
List10.free;
List14.free;
end;
procedure TPlayObject.CmdEndGuild; //4D1A44
begin
if (m_MyGuild <> nil) then begin
if (m_nGuildRankNo > 1) then begin
if TGuild(m_MyGuild).IsMember(m_sCharName) and
TGuild(m_MyGuild).DelMember(m_sCharName) then begin
SysMsg('你已经退出行会。', c_Green, t_Hint);
end;
end else begin
SysMsg('行会掌门人不能这样退出行会!!!', c_Red, t_Hint);
end;
end else begin
if g_Config.boOldClientShowHiLevel then
SysMsg('你都没加入行会!!!', c_Red, t_Hint);
end;
end;
procedure TPlayObject.CmdFireBurn(nInt, nTime, nn: Integer);
var
FireBurnEvent : TFireBurnEvent;
begin
if (m_btPermissionGM < 6) then Exit;
if (nInt = 0) or (nTime = 0) or (nn = 0) then begin
SysMsg('命令格式: @' + g_GameCommand.FIREBURN.sCmd + ' nInt nTime nN',
c_Red, t_Hint);
Exit;
end;
FireBurnEvent := TFireBurnEvent.Create(Self, m_nCurrX, m_nCurrY, nInt, nTime,
nn);
g_EventManager.AddEvent(FireBurnEvent);
end;
procedure TPlayObject.CmdForcedWallconquestWar(Cmd: pTGameCmd; sCASTLENAME:
string);
var
Castle : TUserCastle;
s20 : string;
AttackerInfo : pTAttackerInfo;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if sCASTLENAME = '' then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 城堡名称', c_Red, t_Hint);
Exit;
end;
Castle := g_CastleManager.Find(sCASTLENAME);
if Castle <> nil then begin
if Castle.m_boUnderWar or (Castle.m_btForceStartWar <> 0) then
Castle.m_btForceStartWar := 2
else
Castle.m_btForceStartWar := 1;
l_dwRunTimeTick := 0;
end else begin
SysMsg(Format(g_sGameCommandSbkGoldCastleNotFoundMsg, [sCASTLENAME]), c_Red, t_Hint);
end;
end;
procedure TPlayObject.CmdFreePenalty(Cmd: pTGameCmd; sHumanName: string);
var
PlayObject : TPlayObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandFreePKHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
PlayObject.m_nPkPoint := 0;
PlayObject.RefNameColor();
PlayObject.SysMsg(g_sGameCommandFreePKHumanMsg, c_Green, t_Hint);
SysMsg(Format(g_sGameCommandFreePKMsg, [sHumanName]), c_Green, t_Hint);
end;
procedure TPlayObject.CmdFriendRecall(sCmd, sParam: string);
var
i : Integer;
human : TPlayObject;
begin
if (sParam = '') or (sParam[1] = '?') then begin
SysMsg('命令格式: @' + sCmd +
' 好友名字(好友传送,可以把你的好友传送到自己身边,好友必须允许传送。)',
c_Green, t_Hint);
Exit;
end;
if m_FriendsList.Count = 0 then begin
SysMsg('你还没有好友!!!', c_Red, t_Hint);
Exit;
end;
if m_PEnvir.m_MapFlag.boNOFRIENDRECALL then begin
SysMsg('本地图禁止好友传送!!!', c_Red, t_Hint);
Exit;
end;
if GetTickCount - m_dwGroupRcallTick < 10000 then begin
SysMsg('稍等伙才能再次使用此功能!!!', c_Red, t_Hint);
Exit;
end;
if m_boArrow then begin
SysMsg('您正在执行任务,目前无法使用此功能!!!',
c_Red, t_Hint);
Exit;
end;
for i := 0 to m_FriendsList.Count - 1 do begin
if m_FriendsList[i] = sParam then begin
human := UserEngine.GetPlayObject(sParam);
if human = nil then begin
SysMsg('你的好友 ' + sParam + ' 不在线!!!', c_Red, t_Hint);
Exit;
end;
if human = Self then begin
SysMsg('你不能召唤自己!!!', c_Red, t_Hint);
Exit;
end;
if human.m_boAllowGroupReCall then begin
RecallHuman(human.m_sCharName, $1D);
SendRefMsg(RM_510, 1, 0, $1D, 0, '');
human.SendDelayMsg(Self, RM_510, 1, 0, $1D, 0, '', 100);
end else begin
SysMsg(human.m_sCharName + ' 不允许传送!!!', c_Red, t_Hint);
end;
Break;
end;
end;
end;
//调整元宝数量
procedure TPlayObject.CmdGameGold(Cmd: pTGameCmd; sHumanName: string; sCtr: string; nGold: Integer);
var
PlayObject : TPlayObject;
Ctr : Char;
resourcestring
sLogMsg = '[调整元宝] %s 给:%s %s %d 元宝';
begin
Ctr := '1';
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sCtr <> '') then begin
Ctr := sCtr[1];
end;
if (sHumanName = '') or not (Ctr in ['=', '+', '-']) or (nGold < 0) or
((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandGameGoldHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
case sCtr[1] of
'=': begin
if nGold > g_Config.nHumanMaxGameGold then begin
SysMsg(sHumanGameGoldLargeThenLimit, c_Red, t_Hint);
Exit;
end;
PlayObject.m_nGameGold := nGold;
end;
'+': begin
if nGold + PlayObject.m_nGameGold > g_Config.nHumanMaxGameGold then begin
SysMsg(sHumanGameGoldLargeThenLimit, c_Red, t_Hint);
Exit;
end;
Inc(PlayObject.m_nGameGold, nGold);
end;
'-': begin
nGold := _Max(0, PlayObject.m_nGameGold - nGold);
PlayObject.m_nGameGold := nGold;
end;
end;
if g_boGameLogGameGold then begin
AddGameDataLog(Format(g_sGameLogMsg, [LOG_GAMEGOLD,
PlayObject.m_sMapName,
PlayObject.m_nCurrX,
PlayObject.m_nCurrY,
PlayObject.m_sCharName,
g_Config.sGameGoldName,
nGold,
sCtr[1],
m_sCharName]));
end;
GameGoldChanged();
PlayObject.SysMsg(Format(g_sGameCommandGameGoldHumanMsg,
[g_Config.sGameGoldName, nGold, PlayObject.m_nGameGold,
g_Config.sGameGoldName]), c_Green, t_Hint);
SysMsg(Format(g_sGameCommandGameGoldGMMsg, [sHumanName,
g_Config.sGameGoldName, nGold, PlayObject.m_nGameGold,
g_Config.sGameGoldName]), c_Green, t_Hint);
if g_Config.boShowMakeItemMsg and (m_btPermissionGM >= 6) then
MainOutMessage(Format(sLogMsg, [m_sCharName, PlayObject.m_sCharName,
sCtr[1], nGold]));
end;
procedure TPlayObject.CmdGamePoint(Cmd: pTGameCmd; sHumanName, sCtr: string;
nPoint: Integer);
var
PlayObject : TPlayObject;
Ctr : Char;
begin
Ctr := '1';
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sCtr <> '') then begin
Ctr := sCtr[1];
end;
if (sHumanName = '') or not (Ctr in ['=', '+', '-']) or (nPoint < 0) or (nPoint
> 100000000) or ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandGamePointHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
case sCtr[1] of
'=': begin
PlayObject.m_nGamePoint := nPoint;
end;
'+': Inc(PlayObject.m_nGamePoint, nPoint);
'-': Dec(PlayObject.m_nGamePoint, nPoint);
end;
if g_boGameLogGamePoint then begin
AddGameDataLog(Format(g_sGameLogMsg, [LOG_GAMEPOINT,
PlayObject.m_sMapName,
PlayObject.m_nCurrX,
PlayObject.m_nCurrY,
PlayObject.m_sCharName,
g_Config.sGamePointName,
nPoint,
sCtr[1],
m_sCharName]));
end;
GameGoldChanged();
PlayObject.SysMsg(Format(g_sGameCommandGamePointHumanMsg, [nPoint,
PlayObject.m_nGamePoint]), c_Green, t_Hint);
SysMsg(Format(g_sGameCommandGamePointGMMsg, [sHumanName, nPoint,
PlayObject.m_nGamePoint]), c_Green, t_Hint);
end;
procedure TPlayObject.CmdGroupRecall(sCmd: string; AllRecall: Boolean = False);
var
i : Integer;
dwValue : LongWord;
PlayObject : TPlayObject;
begin
if m_boRecallSuite or (m_btPermissionGM >= 6) then begin
if not m_PEnvir.m_MapFlag.boNORECALL then begin
dwValue := (GetTickCount - m_dwGroupRcallTick) div 1000;
m_dwGroupRcallTick := m_dwGroupRcallTick + dwValue * 1000;
if m_btPermissionGM >= 6 then m_wGroupRcallTime := 0;
if m_wGroupRcallTime > dwValue then begin
Dec(m_wGroupRcallTime, dwValue);
end else m_wGroupRcallTime := 0;
if m_wGroupRcallTime = 0 then begin
if m_boArrow then begin
SysMsg('您正在执行任务,目前无法使用此功能!!!',
c_Red, t_Hint);
Exit;
end;
if m_wShopItemCount > 0 then begin
SysMsg('您正在摆摊,目前无法使用此功能!!!',
c_Red, t_Hint);
Exit;
end;
if m_GroupOwner = Self then begin
for i := 1 to m_GroupMembers.Count - 1 do begin
PlayObject := TPlayObject(m_GroupMembers.Objects[i]);
if (PlayObject.m_boAllowGroupReCall = True) or (AllRecall = True) then begin
if PlayObject.m_PEnvir.m_MapFlag.boNORECALL then begin
SysMsg(Format('%s 所在的地图不允许传送。',
[PlayObject.m_sCharName]), c_Red, t_Hint);
end else begin
RecallHuman(PlayObject.m_sCharName, 0);
//PlayObject.SendDelayMsg(self,RM_510,1,0,$20,0,'',100);
end;
end else begin
SysMsg(Format('%s 不允许天地合一!!!',
[PlayObject.m_sCharName]), c_Red, t_Hint);
end;
end;
m_dwGroupRcallTick := GetTickCount();
m_wGroupRcallTime := g_Config.nGroupRecallTime;
end;
end else begin
SysMsg(Format('%d 秒之后才可以再使用此功能!!!',
[m_wGroupRcallTime]), c_Red, t_Hint);
end;
end else begin
SysMsg('此地图禁止使用此命令!!!', c_Red, t_Hint);
end;
end else begin
SysMsg('您现在还无法使用此功能!!!', c_Red, t_Hint);
end;
end;
procedure TPlayObject.CmdGuildRecall(sCmd, sParam: string);
var
i, ii : Integer;
dwValue : LongWord;
PlayObject : TPlayObject;
GuildRank : pTGuildRank;
nRecallCount, nNoRecallCount : Integer;
Castle : TUserCastle;
begin
if (sParam <> '') and (sParam[1] = '?') then begin
SysMsg('命令功能: 行会传送,行会掌门人可以将整个行会成员全部集中。', c_Red, t_Hint);
Exit;
end;
if not m_boGuildMove and (m_btPermissionGM < 6) then begin
SysMsg('您现在还无法使用此功能!!!', c_Red, t_Hint);
Exit;
end;
if not IsGuildMaster then begin
SysMsg('行会掌门人才可以使用此功能!!!', c_Red, t_Hint);
Exit;
end;
if m_PEnvir.m_MapFlag.boNOGUILDRECALL then begin
SysMsg('本地图不允许使用此功能!!!', c_Red, t_Hint);
Exit;
end;
Castle := g_CastleManager.InCastleWarArea(Self);
//if UserCastle.m_boUnderWar and UserCastle.InCastleWarArea(m_PEnvir,m_nCurrX,m_nCurrY) then begin
if (Castle <> nil) and Castle.m_boUnderWar then begin
SysMsg('攻城区域不允许使用此功能!!!', c_Red, t_Hint);
Exit;
end;
nRecallCount := 0;
nNoRecallCount := 0;
dwValue := (GetTickCount - m_dwGroupRcallTick) div 1000;
m_dwGroupRcallTick := m_dwGroupRcallTick + dwValue * 1000;
if m_btPermissionGM >= 6 then m_wGroupRcallTime := 0;
if m_wGroupRcallTime > dwValue then begin
Dec(m_wGroupRcallTime, dwValue);
end else m_wGroupRcallTime := 0;
if m_wGroupRcallTime > 0 then begin
SysMsg(Format('%d 秒之后才可以再使用此功能!!!',
[m_wGroupRcallTime]), c_Red, t_Hint);
Exit;
end;
if m_boArrow then begin
SysMsg('您正在执行任务,目前无法使用此功能!!!',
c_Red, t_Hint);
Exit;
end;
for i := 0 to TGuild(m_MyGuild).m_RankList.Count - 1 do begin
GuildRank := TGuild(m_MyGuild).m_RankList.Items[i];
for ii := 0 to GuildRank.MemberList.Count - 1 do begin
PlayObject := TPlayObject(GuildRank.MemberList.GetValues(GuildRank.MemberList.Keys[ii]));
if PlayObject <> nil then begin
if PlayObject = Self then begin
// Inc(nNoRecallCount);
Continue;
end;
if PlayObject.m_boAllowGuildReCall then begin
if PlayObject.m_PEnvir.m_MapFlag.boNORECALL then begin
SysMsg(Format('%s 所在的地图不允许传送。',
[PlayObject.m_sCharName]), c_Red, t_Hint);
end else begin
RecallHuman(PlayObject.m_sCharName, $1C);
PlayObject.SendDelayMsg(Self, RM_510, 1, 0, $1C, 0, '', 100);
Inc(nRecallCount);
end;
end else begin
Inc(nNoRecallCount);
SysMsg(Format('%s 不允许行会合一!!!',
[PlayObject.m_sCharName]), c_Red, t_Hint);
end;
end;
end;
end;
// SysMsg('已传送' + IntToStr(nRecallCount) + '个成员,' + IntToStr(nNoRecallCount) + '个成员未被传送。',c_Green,t_Hint);
SysMsg(Format('已传送%d个成员,%d个成员未被传送。',
[nRecallCount, nNoRecallCount]), c_Green, t_Hint);
m_dwGroupRcallTick := GetTickCount();
m_wGroupRcallTime := g_Config.nGuildRecallTime;
end;
procedure TPlayObject.CmdGuildWar(sCmd, sGuildName: string); //004CE9F0
begin
if (m_btPermissionGM < 6) then Exit;
end;
procedure TPlayObject.CmdHair(Cmd: pTGameCmd; sHumanName: string; nHair:
Integer);
var
PlayObject : TPlayObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') or (nHair < 0) then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 人物名称 类型值', c_Red,
t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject <> nil then begin
PlayObject.m_btHair := nHair;
PlayObject.FeatureChanged();
SysMsg(sHumanName + ' 的头发已改变。', c_Green, t_Hint);
end else begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
end;
end;
procedure TPlayObject.CmdHumanCount(Cmd: pTGameCmd; sMapName: string);
var
Envir : TEnvirnoment;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sMapName = '') or ((sMapName <> '') and (sMapName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandHumanCountHelpMsg]), c_Red, t_Hint);
Exit;
end;
if sMapName = 'SELF' then
Envir := m_PEnvir
else
Envir := g_MapManager.FindMap(sMapName);
if Envir = nil then begin
SysMsg(g_sGameCommandMobCountMapNotFound, c_Red, t_Hint);
Exit;
end;
SysMsg(Format(g_sGameCommandMobCountMonsterCount, [UserEngine.GetMapHuman(Envir)]), c_Green, t_Hint);
end;
procedure TPlayObject.CmdHumanInfo(Cmd: pTGameCmd; sHumanName: string);
//004CFC98
var
PlayObject : TPlayObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') or ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandInfoHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
SysMsg(PlayObject.GeTBaseObjectInfo(), c_Green, t_Hint);
end;
procedure TPlayObject.CmdHumanLocal(Cmd: pTGameCmd; sHumanName: string);
var
PlayObject : TPlayObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') or ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandHumanLocalHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
SysMsg(Format(g_sGameCommandHumanLocalMsg, [sHumanName, m_sIPLocal
{GetIPLocal(PlayObject.m_sIPaddr)}]), c_Green, t_Hint);
end;
procedure TPlayObject.CmdHunger(sCmd, sHumanName: string; nHungerPoint:
Integer);
var
PlayObject : TPlayObject;
begin
if (m_btPermissionGM < 6) then Exit;
if (sHumanName = '') or (nHungerPoint < 0) then begin
SysMsg('命令格式: @' + sCmd + ' 人物名称 能量值', c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject <> nil then begin
PlayObject.m_nHungerStatus := nHungerPoint;
PlayObject.SendMsg(PlayObject, RM_MYSTATUS, 0, 0, 0, 0, '');
PlayObject.RefMyStatus();
SysMsg(sHumanName + ' 的能量值已改变。', c_Green, t_Hint);
end else begin
SysMsg(sHumanName + '没有在线!!!', c_Red, t_Hint);
end;
end;
procedure TPlayObject.CmdIncPkPoint(Cmd: pTGameCmd; sHumanName: string; nPoint:
Integer); //004BF4D4
var
PlayObject : TPlayObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandIncPkPointHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
PlayObject.IncPkPoint(nPoint);
PlayObject.RefNameColor();
if nPoint > 0 then
SysMsg(Format(g_sGameCommandIncPkPointAddPointMsg, [sHumanName, nPoint]),
c_Green, t_Hint)
else
SysMsg(Format(g_sGameCommandIncPkPointDecPointMsg, [sHumanName, -nPoint]),
c_Green, t_Hint);
end;
procedure TPlayObject.CmdKickHuman(Cmd: pTGameCmd; sHumName: string);
var
PlayObject : TPlayObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumName = '') or ((sHumName <> '') and (sHumName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandKickHumanHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumName);
if PlayObject <> nil then begin
PlayObject.m_boOfflineGetGamePoint := False;
PlayObject.m_boKickFlag := True;
PlayObject.m_boEmergencyClose := True;
end else begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumName]), c_Red, t_Hint);
end;
end;
procedure TPlayObject.CmdKill(Cmd: pTGameCmd; sHumanName: string);
var
BaseObject : TBaseObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if sHumanName <> '' then begin
BaseObject := UserEngine.GetPlayObject(sHumanName);
if BaseObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red,
t_Hint);
Exit;
end;
end else begin
BaseObject := GetPoseCreate();
if BaseObject = nil then begin
SysMsg('命令使用方法不正确,必须与角色面对面站好!!!', c_Red, t_Hint);
Exit;
end;
end;
BaseObject.m_WAbil.dwHP := 0;
BaseObject.Die;
end;
procedure TPlayObject.CmdLockLogin(Cmd: pTGameCmd);
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if not g_Config.boLockHumanLogin then begin
SysMsg('本服务器还没有启用登录锁功能!!!', c_Red,
t_Hint);
Exit;
end;
if m_boLockLogon and not m_boLockLogoned then begin
SysMsg('您还没有打开登录锁或还没有设置锁密码!!!',
c_Red, t_Hint);
Exit;
end;
m_boLockLogon := not m_boLockLogon;
if m_boLockLogon then begin
SysMsg('已开启登录锁', c_Green, t_Hint);
end else begin
SysMsg('已关闭登录锁', c_Green, t_Hint);
end;
end;
procedure TPlayObject.CmdLotteryTicket(sCmd: string; nPermission: Integer;
sParam1: string);
begin
if (m_btPermissionGM < nPermission) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sParam1 = '') or ((sParam1 <> '') and (sParam1[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [sCmd, '']), c_Red, t_Hint);
Exit;
end;
SysMsg(Format(g_sGameCommandLotteryTicketMsg, [g_Config.nWinLotteryCount,
g_Config.nNoWinLotteryCount,
g_Config.nWinLotteryLevel1,
g_Config.nWinLotteryLevel2,
g_Config.nWinLotteryLevel3,
g_Config.nWinLotteryLevel4,
g_Config.nWinLotteryLevel5,
g_Config.nWinLotteryLevel6]), c_Green, t_Hint);
end;
procedure TPlayObject.CmdLuckPoint(sCmd: string; nPermission: Integer;
sHumanName, sCtr, sPoint: string);
var
PlayObject : TPlayObject;
begin
if (m_btPermissionGM < nPermission) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') or ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [sCmd,
g_sGameCommandLuckPointHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
if sCtr = '' then begin
SysMsg(Format(g_sGameCommandLuckPointMsg, [sHumanName,
PlayObject.m_nBodyLuckLevel, PlayObject.m_dBodyLuck, PlayObject.m_nLuck]), c_Green, t_Hint);
Exit;
end;
end;
//制造物品命令
procedure TPlayObject.CmdMakeItem(Cmd: pTGameCmd; sItemName: string; nCount:
Integer); //004CCE34
var
i, nMaxCount, nCurCount : Integer;
UserItem : pTUserItem;
StdItem : pTStdItem;
logStr : string;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sItemName = '') then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGamecommandMakeHelpMsg]), c_Red, t_Hint);
Exit;
end;
if (nCount <= 0) then nCount := 1;
StdItem := UserEngine.GetStdItem(sItemName);
if (m_btPermissionGM < Cmd.nPerMissionMax) then begin
if (StdItem <> nil) and CheckSPCode(StdItem.SPCode, SP_DISABLEMAKE) then begin
SysMsg(g_sGamecommandMakeItemNameOrPerMissionNot, c_Red, t_Hint);
Exit //物品控制-禁止制造
end;
if g_CastleManager.InCastleWarArea(Self) <> nil then begin
SysMsg(g_sGamecommandMakeInCastleWarRange, c_Red, t_Hint);
Exit;
end;
if not InSafeZone then begin
SysMsg(g_sGamecommandMakeInSafeZoneRange, c_Red, t_Hint);
Exit;
end;
nCount := 1;
end;
if StdItem = nil then Exit;
if CheckSPCode(StdItem.Reserved, RE_ALLOWPILE) then begin
nMaxCount := _MAX(1, StdItem.Stock);
if m_ItemList.Count >= m_nBagSize then Exit;
while nCount > 0 do begin
nCurCount := _MIN(nCount, nMaxCount);
Dec(nCount, nCurCount);
New(UserItem);
if UserEngine.CopyToUserItemFromName(sItemName, UserItem) then begin
UserItem^.Dura := nCurCount;
UserItem^.DuraMax := nMaxCount;
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if (StdItem.Price >= 15000) and not g_Config.boTestServer and
(m_btPermissionGM < 5) then begin
Dispose(UserItem);
Exit;
end else begin
if (g_Config.boTimeBackServer) or (g_Config.boMagicCityServer) then begin
if g_Config.EnableGoodItemTimeBack = True then
begin
if (Random(g_Config.nMakeRandomAddValueTimeBack0) = 0) and (g_Config.nMakeRandomAddValueTimeBack0 > 0) then begin
UserEngine.RandomTimeBackUpgradeItem(UserItem, 20);
end;
if (Random(g_Config.nMakeRandomAddValueTimeBack1) = 0) and (g_Config.nMakeRandomAddValueTimeBack0 > 1) then begin
UserEngine.RandomTimeBackUpgradeItem(UserItem, 30);
end;
if (Random(g_Config.nMakeRandomAddValueTimeBack2) = 0) and (g_Config.nMakeRandomAddValueTimeBack0 > 2) then begin
UserEngine.RandomTimeBackUpgradeItem(UserItem, 31);
end;
end;
end else begin
if Random(g_Config.nMakeRandomAddValue {10}) = 0 then
UserEngine.RandomUpgradeItem(UserItem);
end;
end;
if StdItem.StdMode in [15, 19, 20, 21, 22, 23, 24, 26] then begin
if StdItem.Shape in [130, 131, 132] then begin
UserEngine.GetUnknowItemValue(UserItem);
end;
end;
if m_btPermissionGM >= Cmd.nPerMissionMax then begin
UserItem.MakeIndex := GetItemNumberEx();
//制造的物品另行取得物品ID
end;
if IsEnoughBag then begin
if AddItemToBag(UserItem) then begin
SendAddItem(UserItem);
if g_Config.boShowMakeItemMsg and (m_btPermissionGM >= 6) then begin
logStr := '[制造物品] ' + m_sCharName + ' ' + sItemName + '(' + IntToStr(UserItem.MakeIndex) + ')';
MainOutMessage(logStr);
SysMsg(logStr, c_Red, t_Hint);
end;
if StdItem.boGameLog = 1 then
AddGameDataLog('9' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
sItemName + #9 +
IntToStr(UserItem.MakeIndex) + #9 +
IntToStr(nCurCount) + #9 +
m_sCharName);
end;
end else begin
Dispose(UserItem);
Exit;
end;
end else begin
Dispose(UserItem);
SysMsg(Format(g_sGamecommandMakeItemNameNotFound, [sItemName]), c_Red, t_Hint);
Exit;
end;
end;
end else begin
if (nCount > 10) then nCount := 10;
for i := 0 to nCount - 1 do begin
if m_ItemList.Count >= m_nBagSize then Exit;
New(UserItem);
if UserEngine.CopyToUserItemFromName(sItemName, UserItem) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if (StdItem.Price >= 15000) and not g_Config.boTestServer and
(m_btPermissionGM < 5) then begin
Dispose(UserItem);
Exit;
end else begin
if (g_Config.boTimeBackServer) or (g_Config.boMagicCityServer) then begin
if g_Config.EnableGoodItemTimeBack = True then
begin
if (Random(g_Config.nMakeRandomAddValueTimeBack0) = 0) and (g_Config.nMakeRandomAddValueTimeBack0 > 0) then begin
UserEngine.RandomTimeBackUpgradeItem(UserItem, 20);
end;
if (Random(g_Config.nMakeRandomAddValueTimeBack1) = 0) and (g_Config.nMakeRandomAddValueTimeBack0 > 1) then begin
UserEngine.RandomTimeBackUpgradeItem(UserItem, 30);
end;
if (Random(g_Config.nMakeRandomAddValueTimeBack2) = 0) and (g_Config.nMakeRandomAddValueTimeBack0 > 2) then begin
UserEngine.RandomTimeBackUpgradeItem(UserItem, 31);
end;
end;
end else begin
if Random(g_Config.nMakeRandomAddValue {10}) = 0 then
UserEngine.RandomUpgradeItem(UserItem);
end;
end;
if StdItem.StdMode in [15, 19, 20, 21, 22, 23, 24, 26] then begin
if StdItem.Shape in [130, 131, 132] then begin
UserEngine.GetUnknowItemValue(UserItem);
end;
end;
if m_btPermissionGM >= Cmd.nPerMissionMax then begin
UserItem.MakeIndex := GetItemNumberEx();
//制造的物品另行取得物品ID
end;
if AddItemToBag(UserItem) then begin
SendAddItem(UserItem);
if g_Config.boShowMakeItemMsg and (m_btPermissionGM >= 6) then begin
logStr := '[制造物品] ' + m_sCharName + ' ' + sItemName + '(' + IntToStr(UserItem.MakeIndex) + ')';
MainOutMessage(logStr);
SysMsg(logStr, c_Red, t_Hint);
end;
if StdItem.boGameLog = 1 then
AddGameDataLog('5' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
StdItem.Name + #9 +
IntToStr(UserItem.MakeIndex) + #9 +
'1' + #9 +
'0');
end else begin
Dispose(UserItem);
Break;
end;
end else begin
Dispose(UserItem);
SysMsg(Format(g_sGamecommandMakeItemNameNotFound, [sItemName]), c_Red, t_Hint);
Break;
end;
end;
end;
end;
procedure TPlayObject.CmdMapMove(Cmd: pTGameCmd; sMapName: string);
var
Envir : TEnvirnoment;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sMapName = '') or ((sMapName <> '') and (sMapName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd, g_sGameCommandMoveHelpMsg]), c_Red, t_Hint);
Exit;
end;
Envir := g_MapManager.FindMap(sMapName);
if (Envir = nil) then begin
SysMsg(Format(g_sTheMapNotFound, [sMapName]), c_Red, t_Hint);
Exit;
end;
if (m_btPermissionGM >= Cmd.nPerMissionMax) or CanMoveMap(sMapName) then begin
SendRefMsg(RM_SPACEMOVE_FIRE, 0, 0, 0, 0, '');
MapRandomMove(sMapName, 0, nil);
end else begin
SysMsg(Format(g_sTheMapDisableMove, [sMapName, Envir.m_sMapDesc]), c_Red, t_Hint);
end;
end;
procedure TPlayObject.CmdMapMoveHuman(Cmd: pTGameCmd; sSrcMap, sDenMap: string);
var
SrcEnvir, DenEnvir : TEnvirnoment;
HumanList : TList;
i, nMapIndex : Integer;
MoveHuman : TPlayObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sDenMap = '') or (sSrcMap = '') or ((sSrcMap <> '') and (sSrcMap[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandMapMoveHelpMsg]), c_Red, t_Hint);
Exit;
end;
SrcEnvir := g_MapManager.FindMap(sSrcMap);
DenEnvir := g_MapManager.FindMap(sDenMap);
if (SrcEnvir = nil) then begin
SysMsg(Format(g_sGameCommandMapMoveMapNotFound, [sSrcMap]), c_Red, t_Hint);
Exit;
end;
if (DenEnvir = nil) then begin
SysMsg(Format(g_sGameCommandMapMoveMapNotFound, [sDenMap]), c_Red, t_Hint);
Exit;
end;
HumanList := TList.Create;
UserEngine.GetMapRageHuman(SrcEnvir, SrcEnvir.m_nWidth div 2,
SrcEnvir.m_nHeight div 2, 1000, HumanList);
nMapIndex := -1;
for i := 0 to HumanList.Count - 1 do begin
MoveHuman := TPlayObject(HumanList.Items[i]);
if MoveHuman <> Self then
MoveHuman.MapRandomMove(sDenMap, 0, @nMapIndex);
end;
HumanList.free;
end;
procedure TPlayObject.CmdMasterRecall(sCmd, sParam: string);
var
i : Integer;
MasterHuman : TPlayObject;
begin
if (sParam <> '') and (sParam[1] = '?') then begin
SysMsg('命令格式: @' + sCmd +
' (师徒传送,师父可以将徒弟传送到自己身边,徒弟必须允许传送。)',
c_Green, t_Hint);
Exit;
end;
if not m_boMaster then begin
SysMsg('只能师父才能使用此功能!!!', c_Red, t_Hint);
Exit;
end;
if m_MasterList.Count = 0 then begin
SysMsg('你的徒弟一个都不在线!!!', c_Red, t_Hint);
Exit;
end;
if m_PEnvir.m_MapFlag.boNOMASTERRECALL then begin
SysMsg('本地图禁止师徒传送!!!', c_Red, t_Hint);
Exit;
end;
if GetTickCount - m_dwMasterRecallTick < 10000 then begin
SysMsg('稍等伙才能再次使用此功能!!!', c_Red, t_Hint);
Exit;
end;
if m_boArrow then begin
SysMsg('您正在执行任务,目前无法使用此功能!!!',
c_Red, t_Hint);
Exit;
end;
for i := 0 to m_MasterList.Count - 1 do begin
MasterHuman := TPlayObject(m_MasterList.Items[i]);
if MasterHuman.m_boCanMasterRecall and not MasterHuman.m_boGhost and not
MasterHuman.m_boDeath then begin
RecallHuman(MasterHuman.m_sCharName, $1F);
MasterHuman.SendDelayMsg(Self, RM_510, 1, 0, $1F, 0, '', 100);
end else begin
SysMsg(MasterHuman.m_sCharName + ' 不允许传送!!!', c_Red,
t_Hint);
end;
end;
SendRefMsg(RM_510, 1, 0, $1F, 0, '');
end;
procedure TPlayObject.CmdMemberFunction(sCmd, sParam: string);
begin
if (sParam <> '') and (sParam[1] = '?') then begin
SysMsg('打开会员功能窗口.', c_Red, t_Hint);
Exit;
end;
ExecuteScript(g_ManageNPC, '@Member');
end;
procedure TPlayObject.CmdMemberFunctionEx(sCmd, sParam: string);
begin
if (sParam <> '') and (sParam[1] = '?') then begin
SysMsg('打开会员功能窗口.', c_Red, t_Hint);
Exit;
end;
ExecuteScript(g_FunctionNPC, '@Member');
end;
procedure TPlayObject.CmdMission(Cmd: pTGameCmd; sX, sY: string); //004CCA08
var
nX, nY : Integer;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sX = '') or (sY = '') then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' X Y', c_Red, t_Hint);
Exit;
end;
nX := Str_ToInt(sX, 0);
nY := Str_ToInt(sY, 0);
g_boMission := True;
g_sMissionMap := m_sMapName;
g_nMissionX := nX;
g_nMissionY := nY;
SysMsg('怪物集中目标已设定为: ' + m_sMapName + '(' +
IntToStr(g_nMissionX) + ':' + IntToStr(g_nMissionY) + ')', c_Green, t_Hint);
end;
procedure TPlayObject.CmdMob(Cmd: pTGameCmd; sMonName: string; nCount, nLevel:
Integer; sShowName: string); //004CC7F4
var
i : Integer;
nX, nY : Integer;
Monster : TBaseObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sMonName = '') or ((sMonName <> '') and (sMonName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandMobHelpMsg]), c_Red, t_Hint);
Exit;
end;
if nCount <= 0 then nCount := 1;
if not (nLevel in [0..10]) then nLevel := 0;
nCount := _MIN(64, nCount);
GetFrontPosition(nX, nY);
for i := 0 to nCount - 1 do begin
Monster := UserEngine.RegenMonsterByName(m_PEnvir, nX, nY,
sMonName, sShowName);
if Monster <> nil then begin
Monster.m_wSlaveMakeLevel := nLevel;
Monster.m_wSlaveExpLevel := nLevel;
Monster.RecalcAbilitys;
Monster.RefNameColor;
end else begin
SysMsg(g_sGameCommandMobMsg, c_Red, t_Hint);
Break;
end;
end;
end;
procedure TPlayObject.CmdMobCount(Cmd: pTGameCmd; sMapName: string);
var
Envir : TEnvirnoment;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sMapName = '') or ((sMapName <> '') and (sMapName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandMobCountHelpMsg]), c_Red, t_Hint);
Exit;
end;
Envir := g_MapManager.FindMap(sMapName);
if Envir = nil then begin
SysMsg(g_sGameCommandMobCountMapNotFound, c_Red, t_Hint);
Exit;
end;
SysMsg(Format(g_sGameCommandMobCountMonsterCount,
[UserEngine.GetMapMonster(Envir, nil)]), c_Green, t_Hint);
end;
procedure TPlayObject.CmdMobFireBurn(Cmd: pTGameCmd; sMAP, sX, sY, sType,
sTime, sPoint: string);
var
nX, nY, nType, nTime, nPoint : Integer;
FireBurnEvent : TFireBurnEvent;
Envir : TEnvirnoment;
OldEnvir : TEnvirnoment;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sMAP = '') or ((sMAP <> '') and (sMAP[1] = '?')) then begin
SysMsg(Format(g_sGameCommandMobFireBurnHelpMsg, [Cmd.sCmd, sMAP, sX, sY,
sType, sTime, sPoint]), c_Red, t_Hint);
Exit;
end;
if (CompareText(sMAP, 'SELF') = 0) or (CompareText(sMAP, 'HERE') = 0) then begin
sMAP := m_PEnvir.m_sMapName;
nX := m_nCurrX + Str_ToInt(sX, -1);
nY := m_nCurrY + Str_ToInt(sY, -1);
end else begin
nX := Str_ToInt(sX, -1);
nY := Str_ToInt(sY, -1);
end;
nType := Str_ToInt(sType, -1);
nTime := Str_ToInt(sTime, -1);
nPoint := Str_ToInt(sPoint, -1);
if nPoint < 0 then nPoint := 1;
if (sMAP = '') or (nX < 0) or (nY < 0) or (nType < 0) or (nTime < 0) or (nPoint < 0) then begin
SysMsg(Format(g_sGameCommandMobFireBurnHelpMsg, [Cmd.sCmd, sMAP, sX, sY,
sType, sTime, sPoint]), c_Red, t_Hint);
Exit;
end;
Envir := g_MapManager.FindMap(sMAP);
if Envir <> nil then begin
OldEnvir := m_PEnvir;
m_PEnvir := Envir;
FireBurnEvent := TFireBurnEvent.Create(Self, nX, nY, nType, nTime * 1000, nPoint);
g_EventManager.AddEvent(FireBurnEvent);
m_PEnvir := OldEnvir;
Exit;
end;
SysMsg(Format(g_sGameCommandMobFireBurnMapNotFountMsg, [Cmd.sCmd, sMAP]), c_Red, t_Hint);
end;
procedure TPlayObject.CmdMobLevel(Cmd: pTGameCmd; Param: string); //004CFD5C
var
i : Integer;
BaseObjectList : TList;
BaseObject : TBaseObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if ((Param <> '') and (Param[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd, '']), c_Red, t_Hint);
Exit;
end;
BaseObjectList := TList.Create;
m_PEnvir.GetRangeBaseObject(m_nCurrX, m_nCurrY, 2, True, BaseObjectList);
for i := 0 to BaseObjectList.Count - 1 do begin
BaseObject := TBaseObject(BaseObjectList.Items[i]);
SysMsg(BaseObject.GeTBaseObjectInfo(), c_Green, t_Hint);
end;
BaseObjectList.free;
end;
procedure TPlayObject.CmdMobNpc(sCmd: string; nPermission: Integer; sParam1,
sParam2, sParam3, sParam4: string);
var
nAppr : Integer;
boIsCastle : Boolean;
Merchant : TMerchant;
nX, nY : Integer;
begin
if (m_btPermissionGM < nPermission) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sParam1 = '') or (sParam2 = '') or ((sParam1 <> '') and (sParam1[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [sCmd,
g_sGameCommandMobNpcHelpMsg]), c_Red, t_Hint);
Exit;
end;
nAppr := Str_ToInt(sParam3, 0);
boIsCastle := (Str_ToInt(sParam4, 0) = 1);
if sParam1 = '' then begin
SysMsg('命令格式: @' + sCmd +
' NPC名称 脚本文件名 外形(数字) 属沙城(0,1)', c_Red, t_Hint);
Exit;
end;
Merchant := TMerchant.Create;
Merchant.m_sCharName := sParam1;
Merchant.m_sMapName := m_sMapName;
Merchant.m_PEnvir := m_PEnvir;
Merchant.m_wAppr := nAppr;
Merchant.m_nFlag := 0;
Merchant.m_boCastle := boIsCastle;
Merchant.m_sScript := sParam2;
GetFrontPosition(nX, nY);
Merchant.m_nCurrX := nX;
Merchant.m_nCurrY := nY;
Merchant.Initialize();
UserEngine.AddMerchant(Merchant);
end;
procedure TPlayObject.CmdMobPlace(Cmd: pTGameCmd; sX, sY, sMonName, sCount:
string); //004CCBB4
var
i : Integer;
nCount, nX, nY : Integer;
MEnvir : TEnvirnoment;
mon : TBaseObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
nCount := _MIN(500, Str_ToInt(sCount, 0));
nX := Str_ToInt(sX, 0);
nY := Str_ToInt(sY, 0);
MEnvir := g_MapManager.FindMap(g_sMissionMap);
if (nX <= 0) or (nY <= 0) or (sMonName = '') or (nCount <= 0) then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' X Y 怪物名称 怪物数量',
c_Red, t_Hint);
Exit;
end;
if not g_boMission or (MEnvir = nil) then begin
SysMsg('还没有设定怪物集中点!!!', c_Red, t_Hint);
SysMsg('请先用命令' + g_GameCommand.Mission.sCmd +
'设置怪物的集中点。', c_Red, t_Hint);
Exit;
end;
if (MEnvir.m_MapFlag.boCanMirror) then begin
SysMsg('目标不能为镜像地图!!!', c_Red, t_Hint);
Exit;
end;
for i := 0 to nCount - 1 do begin
mon := UserEngine.RegenMonsterByName(MEnvir, nX, nY, sMonName);
if mon <> nil then begin
mon.m_boMission := True;
mon.m_nMissionX := g_nMissionX;
mon.m_nMissionY := g_nMissionY;
end else Break;
end;
SysMsg(IntToStr(nCount) + ' 只 ' + sMonName + ' 已正在往地图 ' +
g_sMissionMap + ' ' + IntToStr(g_nMissionX) + ':' + IntToStr(g_nMissionY) +
' 集中。', c_Green, t_Hint);
end;
procedure TPlayObject.CmdNpcScript(sCmd: string; nPermission: Integer; sParam1,
sParam2, sParam3: string);
var
BaseObject : TBaseObject;
nNPCType : Integer;
i : Integer;
sScriptFileName : string;
Merchant : TMerchant;
NormNpc : TNormNpc;
LoadList : TStringList;
sScriptLine : string;
begin
if (m_btPermissionGM < nPermission) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sParam1 <> '') or ((sParam1 <> '') and (sParam1[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [sCmd,
g_sGameCommandNpcScriptHelpMsg]), c_Red, t_Hint);
Exit;
end;
nNPCType := -1;
BaseObject := GetPoseCreate();
if BaseObject <> nil then begin
for i := 0 to UserEngine.m_MerchantList.Count - 1 do begin
if TBaseObject(UserEngine.m_MerchantList.Items[i]) = BaseObject then begin
nNPCType := 0;
Break;
end;
end;
for i := 0 to UserEngine.QuestNPCList.Count - 1 do begin
if TBaseObject(UserEngine.QuestNPCList.Items[i]) = BaseObject then begin
nNPCType := 1;
Break;
end;
end;
end;
if nNPCType < 0 then begin
SysMsg('命令使用方法不正确,必须与NPC面对面,才能使用此命令!!!', c_Red, t_Hint);
Exit;
end;
if sParam1 = '' then begin
if nNPCType = 0 then begin
Merchant := TMerchant(BaseObject);
sScriptFileName := g_Config.sEnvirDir + sMarket_Def + Merchant.m_sScript +
'-' + Merchant.m_sMapName + '.txt';
end;
if nNPCType = 1 then begin
NormNpc := TNormNpc(BaseObject);
sScriptFileName := g_Config.sEnvirDir + sNpc_def + NormNpc.m_sCharName +
'-' + NormNpc.m_sMapName + '.txt';
end;
if FileExists(sScriptFileName) then begin
LoadList := TStringList.Create;
try
LoadList.LoadFromFile(sScriptFileName);
except
SysMsg('读取脚本文件错误: ' + sScriptFileName, c_Red, t_Hint);
end;
for i := 0 to LoadList.Count - 1 do begin
sScriptLine := Trim(LoadList.Strings[i]);
sScriptLine := ReplaceChar(sScriptLine, ' ', ',');
SysMsg(IntToStr(i) + ',' + sScriptLine, c_Blue, t_Hint);
end;
LoadList.free;
end;
end;
end;
procedure TPlayObject.CmdOPDeleteSkill(sHumanName, sSkillName: string);
//004CE938
begin
if (m_btPermissionGM < 6) then Exit;
end;
procedure TPlayObject.CmdOPTraining(sHumanName, sSkillName: string;
nLevel: Integer); //004CC468
begin
if (m_btPermissionGM < 6) then Exit;
end;
procedure TPlayObject.CmdPKpoint(Cmd: pTGameCmd; sHumanName: string); //004CC61C
var
PlayObject : TPlayObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandPKPointHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
SysMsg(Format(g_sGameCommandPKPointMsg, [sHumanName, PlayObject.m_nPkPoint]),
c_Green, t_Hint);
end;
//004CDA38
procedure TPlayObject.CmdPositionMove(Cmd: pTGameCmd; sMapName, sX, sY: string);
var
Envir : TEnvirnoment;
nX, nY : Integer;
begin
try
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sMapName = '') or (sX = '') or (sY = '') or ((sMapName <> '') and
(sMapName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandPositionMoveHelpMsg]), c_Red, t_Hint);
Exit;
end;
if (m_btPermissionGM >= Cmd.nPerMissionMax) or CanMoveMap(sMapName) then begin
Envir := g_MapManager.FindMap(sMapName);
if Envir <> nil then begin
nX := Str_ToInt(sX, 0);
nY := Str_ToInt(sY, 0);
if Envir.CanWalk(nX, nY, True) then begin
SpaceMove(sMapName, nX, nY, 0, nil);
end else begin
SysMsg(Format(g_sGameCommandPositionMoveCanotMoveToMap, [sMapName, sX,
sY]), c_Green, t_Hint);
end;
end;
end else begin
SysMsg(Format(g_sTheMapDisableMove, [sMapName, Envir.m_sMapDesc]), c_Red,
t_Hint);
end;
except
on E: Exception do begin
MainOutMessage('[Exceptioin] TPlayObject.CmdPositionMove');
MainOutMessage(E.Message);
end;
end;
end;
procedure TPlayObject.CmdPrvMsg(sCmd: string; nPermission: Integer;
sHumanName: string);
var
i : Integer;
begin
if (m_btPermissionGM < nPermission) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') or ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [sCmd,
g_sGameCommandPrvMsgHelpMsg]), c_Red, t_Hint);
Exit;
end;
for i := m_BlockWhisperList.Count - 1 downto 0 do begin
if CompareText(m_BlockWhisperList.Strings[i], sHumanName) = 0 then begin
m_BlockWhisperList.Delete(i);
SysMsg(Format(g_sGameCommandPrvMsgUnLimitMsg, [sHumanName]), c_Green,
t_Hint);
Exit;
end;
end;
m_BlockWhisperList.Add(sHumanName);
SysMsg(Format(g_sGameCommandPrvMsgLimitMsg, [sHumanName]), c_Green, t_Hint);
end;
procedure TPlayObject.CmdReAlive(Cmd: pTGameCmd; sHumanName: string);
var
PlayObject : TPlayObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') or ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandReAliveHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
PlayObject.ReAlive;
PlayObject.m_WAbil.dwHP := PlayObject.m_WAbil.dwMaxHP;
PlayObject.RecalcAbilitys();
PlayObject.SendMsg(PlayObject, RM_ABILITY, 0, 0, 0, 0, '');
SysMsg(Format(g_sGameCommandReAliveMsg, [sHumanName]), c_Green, t_Hint);
end;
procedure TPlayObject.CmdRecallHuman(Cmd: pTGameCmd; sHumanName: string);
//004CE250
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') or ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandRecallHelpMsg]), c_Red, t_Hint);
Exit;
end;
RecallHuman(sHumanName, 0);
end;
procedure TPlayObject.CmdRecallMob(Cmd: pTGameCmd; sMonName: string; nCount,
nLevel, nAutoChangeColor, nFixColor: Integer); //004CC8C4
var
i : Integer;
N10, n14 : Integer;
mon : TBaseObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sMonName = '') or ((sMonName <> '') and (sMonName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandRecallMobHelpMsg]), c_Red, t_Hint);
Exit;
end;
if nLevel >= 10 then nLevel := 0;
if nCount <= 0 then nCount := 1;
for i := 0 to nCount - 1 do begin
if m_SlaveList.Count >= 20 then Break;
GetFrontPosition(N10, n14);
mon := UserEngine.RegenMonsterByName(m_PEnvir, N10, n14, sMonName);
if mon <> nil then begin
mon.m_wSlaveMakeLevel := 3;
mon.m_wSlaveExpLevel := nLevel;
mon.m_Master := Self;
mon.m_dwMasterRoyaltyTick := GetTickCount + 24 * 60 * 60 * 1000;
if nAutoChangeColor = 1 then begin
mon.m_boAutoChangeColor := True;
end else
if nFixColor > 0 then begin
mon.m_boFixColor := True;
mon.m_nFixColorIdx := nFixColor - 1;
end;
mon.RecalcAbilitys();
mon.RefNameColor();
m_SlaveList.Add(mon);
end;
end;
end;
procedure TPlayObject.CmdReconnection(sCmd, sIPaddr, sPort: string);
begin
if (m_btPermissionGM < 6) then Exit;
if (sIPaddr <> '') and (sIPaddr[1] = '?') then begin
SysMsg('此命令用于改变客户端连接网关的IP及端口。',
c_Blue, t_Hint);
Exit;
end;
if (sIPaddr = '') or (sPort = '') then begin
SysMsg('命令格式: @' + sCmd + ' IP地址 端口', c_Red, t_Hint);
Exit;
end;
if (sIPaddr <> '') and (sPort <> '') then begin
SendMsg(Self, RM_RECONNECTION, 0, 0, 0, 0, sIPaddr + '/' + sPort);
end;
end;
procedure TPlayObject.CmdRefineWeapon(Cmd: pTGameCmd; nDc, nMc, nSc, nHit:
Integer); //004CD1C4
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (nDc + nMc + nSc) > 10 then Exit;
if m_UseItems[U_WEAPON].wIndex <= 0 then Exit;
m_UseItems[U_WEAPON].btValue[0] := nDc;
m_UseItems[U_WEAPON].btValue[1] := nMc;
m_UseItems[U_WEAPON].btValue[2] := nSc;
m_UseItems[U_WEAPON].btValue[5] := nHit;
SendUpdateItem(@m_UseItems[U_WEAPON]);
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
MainOutMessage('[武器调整]' + m_sCharName + ' DC:' + IntToStr(nDc) + ' MC'
+ IntToStr(nMc) + ' SC' + IntToStr(nSc) + ' HIT:' + IntToStr(nHit));
end;
procedure TPlayObject.CmdReGotoHuman(Cmd: pTGameCmd; sHumanName: string);
var
PlayObject : TPlayObject;
nMapIndex : Integer;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') or ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandReGotoHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
nMapIndex := PlayObject.m_PEnvir.Index;
SpaceMove(PlayObject.m_PEnvir.m_sMapName, PlayObject.m_nCurrX,
PlayObject.m_nCurrY, 0, @nMapIndex);
end;
procedure TPlayObject.CmdReloadAbuse(sCmd: string; nPermission: Integer;
sParam1: string);
begin
if (m_btPermissionGM < nPermission) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if ((sParam1 <> '') and (sParam1[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [sCmd, '']), c_Red, t_Hint);
Exit;
end;
end;
procedure TPlayObject.CmdReLoadAdmin(sCmd: string);
begin
if (m_btPermissionGM < 6) then Exit;
FrmDB.LoadAdminList();
UserEngine.SendServerGroupMsg(213, g_Config.nServerNumber, '');
SysMsg('管理员列表重新加载成功...', c_Green, t_Hint);
end;
procedure TPlayObject.CmdReloadGuild(sCmd: string; nPermission: Integer;
sParam1: string);
var
Guild : TGuild;
begin
if (m_btPermissionGM < nPermission) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sParam1 = '') or ((sParam1 <> '') and (sParam1[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [sCmd,
g_sGameCommandReloadGuildHelpMsg]), c_Red, t_Hint);
Exit;
end;
if g_Config.nServerNumber <> 0 then begin
SysMsg(g_sGameCommandReloadGuildOnMasterserver, c_Red, t_Hint);
Exit;
end;
Guild := g_GuildManager.FindGuild(sParam1);
if Guild = nil then begin
SysMsg(Format(g_sGameCommandReloadGuildNotFoundGuildMsg, [sParam1]), c_Red,
t_Hint);
Exit;
end;
// Guild.LoadGuild();
// SysMsg(Format(g_sGameCommandReloadGuildSuccessMsg, [sParam1]), c_Red, t_Hint);
// UserEngine.SendServerGroupMsg(SS_207, g_Config.nServerNumber, sParam1);
end;
procedure TPlayObject.CmdReloadGuildAll; //004CE530
begin
if (m_btPermissionGM < 6) then Exit;
end;
procedure TPlayObject.CmdReloadLineNotice(sCmd: string;
nPermission: Integer; sParam1: string);
begin
if (m_btPermissionGM < nPermission) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if ((sParam1 <> '') and (sParam1[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [sCmd, '']), c_Red, t_Hint);
Exit;
end;
if LoadLineNotice(g_Config.sNoticeDir + 'LineNotice.txt') then begin
SysMsg(g_sGameCommandReloadLineNoticeSuccessMsg, c_Green, t_Hint);
end else begin
SysMsg(g_sGameCommandReloadLineNoticeFailMsg, c_Red, t_Hint);
end;
end;
procedure TPlayObject.CmdReloadManage(Cmd: pTGameCmd; sParam: string);
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if ((sParam <> '') and (sParam[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd, '']), c_Red, t_Hint);
Exit;
end;
if sParam = '' then begin
if g_ManageNPC <> nil then begin
g_ManageNPC.ClearScript();
g_ManageNPC.LoadNPCScript();
SysMsg('重新加载登录脚本完成...', c_Green, t_Hint);
end else begin
SysMsg('重新加载登录脚本失败...', c_Green, t_Hint);
end;
end else begin
if g_FunctionNPC <> nil then begin
g_FunctionNPC.ClearScript();
g_FunctionNPC.LoadNPCScript();
SysMsg('重新加载功能脚本完成...', c_Green, t_Hint);
end else begin
SysMsg('重新加载功能脚本失败...', c_Green, t_Hint);
end;
if g_WolShopNPC <> nil then begin
g_WolShopNPC.ClearScript();
g_WolShopNPC.LoadNPCScript();
SysMsg('重新加载商城脚本完成...', c_Green, t_Hint);
end else begin
SysMsg('重新加载商城脚本失败...', c_Green, t_Hint);
end;
end;
end;
procedure TPlayObject.CmdReloadMonItems; //
//var
// i : Integer;
// Monster : pTMonInfo;
begin
if (m_btPermissionGM < 6) then Exit;
SysMsg('该命令已经取消,请使用重新加载怪物数据库命令...', c_Green, t_Hint);
// EnterCriticalSection(ProcessHumanCriticalSection);
// try
// for i := 0 to UserEngine.MonsterList.Count - 1 do begin
// Monster := pTMonInfo(UserEngine.MonsterList.Values[UserEngine.MonsterList.Keys[i]]);
//FrmDB.LoadMonitems(UserEngine.MonsterList.Keys[i], Monster.ItemList);
// end;
// SysMsg('怪物爆物品列表重加载完成...', c_Green, t_Hint);
// finally
// LeaveCriticalSection(ProcessHumanCriticalSection);
// end;
end;
procedure TPlayObject.CmdReloadNpc(sParam: string); //004CFFF8
var
i : Integer;
tmpList : TList;
Merchant : TMerchant;
NPC : TNormNpc;
begin
if (m_btPermissionGM < 6) then Exit;
if CompareText('all', sParam) = 0 then begin
FrmDB.ReLoadMerchants();
UserEngine.ReloadMerchantList();
SysMsg('交易NPC重新加载完成!!!', c_Red, t_Hint);
UserEngine.ReloadNpcList();
SysMsg('管理NPC重新加载完成!!!', c_Red, t_Hint);
Exit;
end; //004D0136
tmpList := TList.Create;
if UserEngine.GetMerchantList(m_PEnvir, m_nCurrX, m_nCurrY, 9, tmpList) > 0 then begin
for i := 0 to tmpList.Count - 1 do begin
Merchant := TMerchant(tmpList.Items[i]);
Merchant.ClearScript;
Merchant.LoadNPCScript;
SysMsg(Merchant.m_sCharName + '重新加载成功...', c_Green, t_Hint);
end; // for
end else begin
SysMsg('附近未发现任何交易NPC!!!', c_Red, t_Hint);
end;
tmpList.Clear;
if UserEngine.GetNpcList(m_PEnvir, m_nCurrX, m_nCurrY, 9, tmpList) > 0 then begin
for i := 0 to tmpList.Count - 1 do begin
NPC := TNormNpc(tmpList.Items[i]);
NPC.ClearScript;
NPC.LoadNPCScript;
SysMsg(NPC.m_sCharName + '重新加载成功...', c_Green, t_Hint);
end; // for
end else begin
SysMsg('附近未发现任何管理NPC!!!', c_Red, t_Hint);
end;
tmpList.free;
end;
procedure TPlayObject.CmdReloadRobot;
begin
RobotManage.RELOADROBOT();
SysMsg('重新加载机器人配置完成...', c_Green, t_Hint);
end;
procedure TPlayObject.CmdReloadRobotManage;
begin
if (m_btPermissionGM < 6) then Exit;
if g_RobotNPC <> nil then begin
g_RobotNPC.ClearScript();
g_RobotNPC.LoadNPCScript();
SysMsg('重新加载机器人专用脚本完成...', c_Green, t_Hint);
end else begin
SysMsg('重新加载机器人专用脚本失败...', c_Green, t_Hint);
end;
end;
procedure TPlayObject.CmdReNewLevel(Cmd: pTGameCmd; sHumanName, sLevel: string);
var
PlayObject : TPlayObject;
nLevel : Integer;
begin
if (m_btPermissionGM < 6) then Exit;
if (sHumanName = '') or ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg('命令格式: @' + Cmd.sCmd +
' 人物名称 点数(为空则查看)', c_Red, t_Hint);
Exit;
end;
nLevel := Str_ToInt(sLevel, -1);
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject <> nil then begin
if (nLevel >= 0) and (nLevel <= 255) then begin
PlayObject.m_btReLevel := nLevel;
PlayObject.RefShowName();
end;
SysMsg(sHumanName + ' 的转生等级为 ' +
IntToStr(PlayObject.m_btReLevel), c_Green, t_Hint);
end else begin
SysMsg(sHumanName + ' 没在线上!!!', c_Red, t_Hint);
end;
end;
procedure TPlayObject.CmdRestBonuPoint(Cmd: pTGameCmd; sHumName: string);
var
PlayObject : TPlayObject;
nTotleUsePoint : Integer;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if sHumName = '' then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 人物名称', c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumName);
if PlayObject <> nil then begin
nTotleUsePoint := PlayObject.m_BonusAbil.DC +
PlayObject.m_BonusAbil.MC +
PlayObject.m_BonusAbil.SC +
PlayObject.m_BonusAbil.AC +
PlayObject.m_BonusAbil.MAC +
PlayObject.m_BonusAbil.HP +
PlayObject.m_BonusAbil.MP +
PlayObject.m_BonusAbil.Hit +
PlayObject.m_BonusAbil.Speed +
PlayObject.m_BonusAbil.X2;
FillChar(PlayObject.m_BonusAbil, SizeOf(TNakedAbility), #0);
Inc(PlayObject.m_nBonusPoint, nTotleUsePoint);
PlayObject.SendMsg(PlayObject, RM_ADJUST_BONUS, 0, 0, 0, 0, '');
PlayObject.HasLevelUp(0);
PlayObject.SysMsg('分配点数已复位!!!', c_Red, t_Hint);
SysMsg(sHumName + ' 的分配点数已复位.', c_Green, t_Hint);
end else begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumName]), c_Red, t_Hint);
end;
end;
procedure TPlayObject.CmdSbkDoorControl(sCmd, sParam: string);
begin
end;
procedure TPlayObject.CmdSearchDear(sCmd, sParam: string);
begin
if (sParam <> '') and (sParam[1] = '?') then begin
SysMsg('此命令用于查询配偶当前所在位置。', c_Red, t_Hint);
Exit;
end;
if m_sDearName = '' then begin
SysMsg(g_sYouAreNotMarryedMsg {'你都没结婚查什么?'}, c_Red,
t_Hint);
Exit;
end;
if m_DearHuman = nil then begin
if m_btGender = 0 then begin
SysMsg(g_sYourWifeNotOnlineMsg {'你的老婆还没有上线!!!'},
c_Red, t_Hint);
end else begin
SysMsg(g_sYourHusbandNotOnlineMsg
{'你的老公还没有上线!!!'}, c_Red, t_Hint);
end;
Exit;
end;
if m_btGender = 0 then begin
SysMsg(g_sYourWifeNowLocateMsg {'你的老婆现在位于:'}, c_Green,
t_Hint);
SysMsg(m_DearHuman.m_sCharName + ' ' + m_DearHuman.m_PEnvir.m_sMapDesc + '(' +
IntToStr(m_DearHuman.m_nCurrX) + ':' + IntToStr(m_DearHuman.m_nCurrY) + ')',
c_Green, t_Hint);
m_DearHuman.SysMsg(g_sYourHusbandSearchLocateMsg
{'你的老公正在找你,他现在位于:'}, c_Green, t_Hint);
m_DearHuman.SysMsg(m_sCharName + ' ' + m_PEnvir.m_sMapDesc + '(' +
IntToStr(m_nCurrX) + ':' + IntToStr(m_nCurrY) + ')', c_Green, t_Hint);
end else begin
SysMsg(g_sYourHusbandNowLocateMsg {'你的老公现在位于:'}, c_Red,
t_Hint);
SysMsg(m_DearHuman.m_sCharName + ' ' + m_DearHuman.m_PEnvir.m_sMapDesc + '(' +
IntToStr(m_DearHuman.m_nCurrX) + ':' + IntToStr(m_DearHuman.m_nCurrY) + ')',
c_Green, t_Hint);
m_DearHuman.SysMsg(g_sYourWifeSearchLocateMsg
{'你的老婆正在找你,她现在位于:'}, c_Green, t_Hint);
m_DearHuman.SysMsg(m_sCharName + ' ' + m_PEnvir.m_sMapDesc + '(' +
IntToStr(m_nCurrX) + ':' + IntToStr(m_nCurrY) + ')', c_Green, t_Hint);
end;
end;
procedure TPlayObject.CmdSearchHuman(sCmd, sHumanName: string);
var
PlayObject : TPlayObject;
begin
if m_boProbeNecklace or (m_btPermissionGM >= 6) then begin
if (sHumanName = '') then begin
SysMsg('命令格式: @' + sCmd + ' 人物名称', c_Red, t_Hint);
Exit;
end;
if ((GetTickCount - m_dwProbeTick) > 10000) or (m_btPermissionGM >= 3) then begin
m_dwProbeTick := GetTickCount();
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject <> nil then begin
SysMsg(sHumanName + ' 现在位于 ' + PlayObject.m_PEnvir.m_sMapDesc + ' '
+ IntToStr(PlayObject.m_nCurrX) + ':' + IntToStr(PlayObject.m_nCurrY),
c_Blue, t_Hint);
end else begin
SysMsg(sHumanName +
' 现在不在线,或位于其它服务器上!!!', c_Red,
t_Hint);
end;
end else begin
SysMsg(IntToStr((GetTickCount - m_dwProbeTick) div 1000 - 10) +
' 秒之后才可以再使用此功能!!!', c_Red, t_Hint);
end;
end else begin
SysMsg('您现在还无法使用此功能!!!', c_Red, t_Hint);
end;
end;
procedure TPlayObject.CmdSearchMaster(sCmd, sParam: string);
var
i : Integer;
human : TPlayObject;
begin
if (sParam <> '') and (sParam[1] = '?') then begin
SysMsg('此命令用于查询师徒当前所在位置。', c_Red, t_Hint);
Exit;
end;
if m_sMasterName[1] = '' then begin
SysMsg(g_sYouAreNotMasterMsg, c_Red, t_Hint);
Exit;
end;
if m_boMaster then begin
if m_MasterList.Count <= 0 then begin
SysMsg(g_sYourMasterListNotOnlineMsg, c_Red, t_Hint);
Exit;
end;
SysMsg(g_sYourMasterListNowLocateMsg, c_Green, t_Hint);
for i := 0 to m_MasterList.Count - 1 do begin
human := TPlayObject(m_MasterList.Items[i]);
SysMsg(human.m_sCharName + ' ' + human.m_PEnvir.m_sMapDesc + '(' +
IntToStr(human.m_nCurrX) + ':' + IntToStr(human.m_nCurrY) + ')', c_Green,
t_Hint);
human.SysMsg(g_sYourMasterSearchLocateMsg, c_Green, t_Hint);
human.SysMsg(m_sCharName + ' ' + m_PEnvir.m_sMapDesc + '(' +
IntToStr(m_nCurrX) + ':' + IntToStr(m_nCurrY) + ')', c_Green, t_Hint);
end;
end else begin
if m_MasterHuman = nil then begin
SysMsg(g_sYourMasterNotOnlineMsg, c_Red, t_Hint);
Exit;
end;
SysMsg(g_sYourMasterNowLocateMsg, c_Red, t_Hint);
SysMsg(m_MasterHuman.m_sCharName + ' ' + m_MasterHuman.m_PEnvir.m_sMapDesc +
'(' + IntToStr(m_MasterHuman.m_nCurrX) + ':' +
IntToStr(m_MasterHuman.m_nCurrY) + ')', c_Green, t_Hint);
m_MasterHuman.SysMsg(g_sYourMasterListSearchLocateMsg, c_Green, t_Hint);
m_MasterHuman.SysMsg(m_sCharName + ' ' + m_PEnvir.m_sMapDesc + '(' +
IntToStr(m_nCurrX) + ':' + IntToStr(m_nCurrY) + ')', c_Green, t_Hint);
end;
end;
procedure TPlayObject.CmdSetMapMode(sCmd, sMapName, sMapMode, sParam1,
sParam2: string);
var
Envir : TEnvirnoment;
sMsg : string;
begin
if (m_btPermissionGM < 6) then Exit;
if (sMapName = '') or (sMapMode = '') then begin
SysMsg('命令格式: @' + sCmd + ' 地图号 模式', c_Red, t_Hint);
Exit;
end;
Envir := g_MapManager.FindMap(sMapName);
if (Envir = nil) then begin
SysMsg(sMapName + ' 不存在!!!', c_Red, t_Hint);
Exit;
end;
if CompareText(sMapMode, 'SAFE') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boSAFE := True;
end else begin
Envir.m_MapFlag.boSAFE := False;
end;
end else
if CompareText(sMapMode, 'DARK') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boDARK := True;
end else begin
Envir.m_MapFlag.boDARK := False;
end;
end else
if CompareText(sMapMode, 'DARK') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boDARK := True;
end else begin
Envir.m_MapFlag.boDARK := False;
end;
end else
if CompareText(sMapMode, 'FIGHT') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boFight := True;
end else begin
Envir.m_MapFlag.boFight := False;
end;
end else
if CompareText(sMapMode, 'FIGHT3') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boFight3 := True;
end else begin
Envir.m_MapFlag.boFight3 := False;
end;
end else
if CompareText(sMapMode, 'DAY') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boDAY := True;
end else begin
Envir.m_MapFlag.boDAY := False;
end;
end else
if CompareText(sMapMode, 'QUIZ') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boQUIZ := True;
end else begin
Envir.m_MapFlag.boQUIZ := False;
end;
end else
if CompareText(sMapMode, 'NORECONNECT') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boNORECONNECT := True;
Envir.m_MapFlag.sReConnectMap := sParam1;
end else begin
Envir.m_MapFlag.boNORECONNECT := False;
end;
end else
if CompareText(sMapMode, 'MUSIC') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boMUSIC := True;
Envir.m_MapFlag.nMUSICID := Str_ToInt(sParam1, -1);
end else begin
Envir.m_MapFlag.boMUSIC := False;
end;
end else
if CompareText(sMapMode, 'EXPRATE') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boEXPRATE := True;
Envir.m_MapFlag.nEXPRATE := Str_ToInt(sParam1, -1);
end else begin
Envir.m_MapFlag.boEXPRATE := False;
end;
end else
if CompareText(sMapMode, 'PKWINLEVEL') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boPKWINLEVEL := True;
Envir.m_MapFlag.nPKWINLEVEL := Str_ToInt(sParam1, -1);
end else begin
Envir.m_MapFlag.boPKWINLEVEL := False;
end;
end else
if CompareText(sMapMode, 'PKWINEXP') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boPKWINEXP := True;
Envir.m_MapFlag.nPKWINEXP := Str_ToInt(sParam1, -1);
end else begin
Envir.m_MapFlag.boPKWINEXP := False;
end;
end else
if CompareText(sMapMode, 'PKLOSTLEVEL') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boPKLOSTLEVEL := True;
Envir.m_MapFlag.nPKLOSTLEVEL := Str_ToInt(sParam1, -1);
end else begin
Envir.m_MapFlag.boPKLOSTLEVEL := False;
end;
end else
if CompareText(sMapMode, 'PKLOSTEXP') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boPKLOSTEXP := True;
Envir.m_MapFlag.nPKLOSTEXP := Str_ToInt(sParam1, -1);
end else begin
Envir.m_MapFlag.boPKLOSTEXP := False;
end;
end else
if CompareText(sMapMode, 'DECHP') = 0 then begin
if (sParam1 <> '') and (sParam2 <> '') then begin
Envir.m_MapFlag.boDECHP := True;
Envir.m_MapFlag.nDECHPTIME := Str_ToInt(sParam1, -1);
Envir.m_MapFlag.nDECHPPOINT := Str_ToInt(sParam2, -1);
end else begin
Envir.m_MapFlag.boDECHP := False;
end;
end else
if CompareText(sMapMode, 'DECGAMEGOLD') = 0 then begin
if (sParam1 <> '') and (sParam2 <> '') then begin
Envir.m_MapFlag.boDecGameGold := True;
Envir.m_MapFlag.nDECGAMEGOLDTIME :=
Str_ToInt(sParam1, -1);
Envir.m_MapFlag.nDecGameGold := Str_ToInt(sParam2,
-1);
end else begin
Envir.m_MapFlag.boDecGameGold := False;
end;
end else
if CompareText(sMapMode, 'INCGAMEGOLD') = 0 then begin
if (sParam1 <> '') and (sParam2 <> '') then begin
Envir.m_MapFlag.boIncGameGold := True;
Envir.m_MapFlag.nINCGAMEGOLDTIME :=
Str_ToInt(sParam1, -1);
Envir.m_MapFlag.nIncGameGold := Str_ToInt(sParam2,
-1);
end else begin
Envir.m_MapFlag.boIncGameGold := False;
end;
end else
if CompareText(sMapMode, 'INCGAMEPOINT') = 0 then begin
if (sParam1 <> '') and (sParam2 <> '') then begin
Envir.m_MapFlag.boINCGAMEPOINT := True;
Envir.m_MapFlag.nINCGAMEPOINTTIME :=
Str_ToInt(sParam1, -1);
Envir.m_MapFlag.nINCGAMEPOINT :=
Str_ToInt(sParam2, -1);
end else begin
Envir.m_MapFlag.boIncGameGold := False;
end;
end else
if CompareText(sMapMode, 'RUNHUMAN') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boRUNHUMAN := True;
end else begin
Envir.m_MapFlag.boRUNHUMAN := False;
end;
end else
if CompareText(sMapMode, 'RUNMON') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boRUNMON := True;
end else begin
Envir.m_MapFlag.boRUNMON := False;
end;
end else
if CompareText(sMapMode, 'NEEDHOLE') =
0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boNEEDHOLE := True;
end else begin
Envir.m_MapFlag.boNEEDHOLE := False;
end;
end else
if CompareText(sMapMode, 'NORECALL')
= 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boNORECALL := True;
end else begin
Envir.m_MapFlag.boNORECALL := False;
end;
end else
if CompareText(sMapMode,
'NOGUILDRECALL') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boNOGUILDRECALL :=
True;
end else begin
Envir.m_MapFlag.boNOGUILDRECALL :=
False;
end;
end else
if CompareText(sMapMode,
'NODEARRECALL') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boNODEARRECALL :=
True;
end else begin
Envir.m_MapFlag.boNODEARRECALL :=
False;
end;
end else
if CompareText(sMapMode,
'NOMASTERRECALL') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boNOMASTERRECALL
:= True;
end else begin
Envir.m_MapFlag.boNOMASTERRECALL
:= False;
end;
end else
if CompareText(sMapMode,
'NORANDOMMOVE') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boNORANDOMMOVE
:= True;
end else begin
Envir.m_MapFlag.boNORANDOMMOVE
:= False;
end;
end else
if CompareText(sMapMode,
'NODRUG') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boNODRUG :=
True;
end else begin
Envir.m_MapFlag.boNODRUG :=
False;
end;
end else
if CompareText(sMapMode,
'MINE') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boMINE :=
True;
end else begin
Envir.m_MapFlag.boMINE :=
False;
end;
end else
if
CompareText(sMapMode,
'NOPOSITIONMOVE') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boNOPOSITIONMOVE
:= True;
end else begin
Envir.m_MapFlag.boNOPOSITIONMOVE
:= False;
end;
end else //
if
CompareText(sMapMode,
'NOSTOREMOVE') = 0 then begin
if (sParam1 <> '') then begin
Envir.m_MapFlag.boNOSTOREMOVE
:= True;
end else begin
Envir.m_MapFlag.boNOSTOREMOVE
:= False;
end;
end;
sMsg := '地图模式: ' + Envir.GetEnvirInfo;
SysMsg(sMsg, c_Blue, t_Hint);
end;
procedure TPlayObject.CmdSetPermission(Cmd: pTGameCmd; sHumanName, sPermission:
string);
var
nPerission : Integer;
PlayObject : TPlayObject;
resourcestring
sOutFormatMsg = '[权限调整] %s (%s %d -> %d)';
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
nPerission := Str_ToInt(sPermission, 0);
if (sHumanName = '') or not (nPerission in [0..10]) then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 人物名称 权限等级(0 - 10)',
c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
if g_Config.boShowMakeItemMsg then
MainOutMessage(Format(sOutFormatMsg, [m_sCharName, PlayObject.m_sCharName,
PlayObject.m_btPermissionGM, nPerission]));
PlayObject.m_btPermissionGM := nPerission;
SysMsg(sHumanName + ' 当前权限为: ' +
IntToStr(PlayObject.m_btPermissionGM), c_Red, t_Hint);
end;
procedure TPlayObject.CmdShowDenyAccountLogon(Cmd: pTGameCmd; sAccount,
sFixDeny: string);
var
i : Integer;
begin
if (m_btPermissionGM < 6) then Exit;
g_DenyAccountList.Lock;
try
if g_DenyAccountList.Count <= 0 then begin
SysMsg('禁止登录帐号列表为空。', c_Green, t_Hint);
Exit;
end;
for i := 0 to g_DenyAccountList.Count - 1 do begin
SysMsg(g_DenyAccountList.Strings[i], c_Green, t_Hint);
end;
finally
g_DenyAccountList.UnLock;
end;
end;
procedure TPlayObject.CmdShowDenyCharNameLogon(Cmd: pTGameCmd; sCharName,
sFixDeny: string);
var
i : Integer;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
g_DenyChrNameList.Lock;
try
if g_DenyChrNameList.Count <= 0 then begin
SysMsg('禁止登录角色列表为空。', c_Green, t_Hint);
Exit;
end;
for i := 0 to g_DenyChrNameList.Count - 1 do begin
SysMsg(g_DenyChrNameList.Strings[i], c_Green, t_Hint);
end;
finally
g_DenyChrNameList.UnLock;
end;
end;
procedure TPlayObject.CmdShowDenyIPaddrLogon(Cmd: pTGameCmd; sIPaddr,
sFixDeny: string);
var
i : Integer;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
g_DenyIPAddrList.Lock;
try
if g_DenyIPAddrList.Count <= 0 then begin
SysMsg('禁止登录角色列表为空。', c_Green, t_Hint);
Exit;
end;
for i := 0 to g_DenyIPAddrList.Count - 1 do begin
SysMsg(g_DenyIPAddrList.Strings[i], c_Green, t_Hint);
end;
finally
g_DenyIPAddrList.UnLock;
end;
end;
procedure TPlayObject.CmdShowHumanFlag(sCmd: string; nPermission: Integer;
sHumanName, sFlag: string);
var
PlayObject : TPlayObject;
nFlag : Integer;
begin
if (m_btPermissionGM < nPermission) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') or ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [sCmd,
g_sGameCommandShowHumanFlagHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
nFlag := Str_ToInt(sFlag, 0);
if PlayObject.GetQuestFalgStatus(nFlag) = 1 then begin
SysMsg(Format(g_sGameCommandShowHumanFlagONMsg, [PlayObject.m_sCharName,
nFlag]), c_Green, t_Hint);
end else begin
SysMsg(Format(g_sGameCommandShowHumanFlagOFFMsg, [PlayObject.m_sCharName,
nFlag]), c_Green, t_Hint);
end;
end;
procedure TPlayObject.CmdShowHumanUnit(sCmd: string; nPermission: Integer;
sHumanName, sUnit: string);
var
PlayObject : TPlayObject;
nUnit : Integer;
begin
if (m_btPermissionGM < nPermission) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') or ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [sCmd,
g_sGameCommandShowHumanUnitHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
nUnit := Str_ToInt(sUnit, 0);
if PlayObject.GetQuestUnitStatus(nUnit) = 1 then begin
SysMsg(Format(g_sGameCommandShowHumanUnitONMsg, [PlayObject.m_sCharName,
nUnit]), c_Green, t_Hint);
end else begin
SysMsg(Format(g_sGameCommandShowHumanUnitOFFMsg, [PlayObject.m_sCharName,
nUnit]), c_Green, t_Hint);
end;
end;
procedure TPlayObject.CmdShowHumanUnitOpen(sCmd: string; nPermission: Integer;
sHumanName, sUnit: string);
var
PlayObject : TPlayObject;
nUnit : Integer;
begin
if (m_btPermissionGM < nPermission) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') or ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [sCmd,
g_sGameCommandShowHumanUnitHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
nUnit := Str_ToInt(sUnit, 0);
if PlayObject.GetQuestUnitOpenStatus(nUnit) = 1 then begin
SysMsg(Format(g_sGameCommandShowHumanUnitONMsg, [PlayObject.m_sCharName,
nUnit]), c_Green, t_Hint);
end else begin
SysMsg(Format(g_sGameCommandShowHumanUnitOFFMsg, [PlayObject.m_sCharName,
nUnit]), c_Green, t_Hint);
end;
end;
procedure TPlayObject.CmdShowMapInfo(Cmd: pTGameCmd; sParam1: string);
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if ((sParam1 <> '') and (sParam1[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd, '']), c_Red, t_Hint);
Exit;
end;
SysMsg(Format(g_sGameCommandMapInfoMsg, [m_PEnvir.m_sMapName,
m_PEnvir.m_sMapDesc]), c_Green, t_Hint);
SysMsg(Format(g_sGameCommandMapInfoSizeMsg, [m_PEnvir.m_nWidth,
m_PEnvir.m_nHeight]), c_Green, t_Hint);
end;
procedure TPlayObject.CmdShowMapMode(sCmd, sMapName: string);
var
Envir : TEnvirnoment;
sMsg : string;
begin
if (m_btPermissionGM < 6) then Exit;
if (sMapName = '') then begin
SysMsg('命令格式: @' + sCmd + ' 地图号', c_Red, t_Hint);
Exit;
end;
Envir := g_MapManager.FindMap(sMapName);
if (Envir = nil) then begin
SysMsg(sMapName + ' 不存在!!!', c_Red, t_Hint);
Exit;
end;
sMsg := '地图模式: ' + Envir.GetEnvirInfo;
SysMsg(sMsg, c_Blue, t_Hint);
end;
procedure TPlayObject.CmdShowSbkGold(Cmd: pTGameCmd; sCASTLENAME, sCtr, sGold:
string);
var
i : Integer;
Ctr : Char;
nGold : Integer;
Castle : TUserCastle;
List : TStringList;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if ((sCASTLENAME <> '') and (sCASTLENAME[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd, '']), c_Red, t_Hint);
Exit;
end;
if sCASTLENAME = '' then begin
List := TStringList.Create;
g_CastleManager.GetCastleGoldInfo(List);
for i := 0 to List.Count - 1 do begin
SysMsg(List.Strings[i], c_Green, t_Hint);
end;
List.free;
Exit;
end;
Castle := g_CastleManager.Find(sCASTLENAME);
if Castle = nil then begin
SysMsg(Format(g_sGameCommandSbkGoldCastleNotFoundMsg, [sCASTLENAME]), c_Red,
t_Hint);
Exit;
end;
Ctr := sCtr[1];
nGold := Str_ToInt(sGold, -1);
if not (Ctr in ['=', '-', '+']) or (nGold < 0) or (nGold > 100000000) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandSbkGoldHelpMsg]), c_Red, t_Hint);
Exit;
end;
case Ctr of
'=': Castle.m_nTotalGold := nGold;
'-': Dec(Castle.m_nTotalGold);
'+': Inc(Castle.m_nTotalGold, nGold);
end;
if Castle.m_nTotalGold < 0 then Castle.m_nTotalGold := 0;
end;
procedure TPlayObject.CmdShowUseItemInfo(Cmd: pTGameCmd;
sHumanName: string);
var
i : Integer;
PlayObject : TPlayObject;
UserItem : pTUserItem;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') or ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandShowUseItemInfoHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
for i := Low(PlayObject.m_UseItems) to High(PlayObject.m_UseItems) do begin
UserItem := @PlayObject.m_UseItems[i];
if UserItem.wIndex = 0 then Continue;
SysMsg(Format('%s[%s]IDX[%d]系列号[%d]持久[%d-%d]',
[GetUseItemName(i),
UserEngine.GetStdItemName(UserItem.wIndex),
UserItem.wIndex,
UserItem.MakeIndex,
UserItem.Dura,
UserItem.DuraMax]),
c_Blue, t_Hint);
end;
end;
procedure TPlayObject.CmdShutup(Cmd: pTGameCmd; sHumanName, sTime: string);
var
dwTime : LongWord;
nIndex : Integer;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sTime = '') or (sHumanName = '') or ((sHumanName <> '') and (sHumanName[1]
= '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandShutupHelpMsg]), c_Red, t_Hint);
Exit;
end;
dwTime := Str_ToInt(sTime, 5);
g_DenySayMsgList.Lock;
try
nIndex := g_DenySayMsgList.GetIndex(sHumanName);
if nIndex >= 0 then begin
g_DenySayMsgList.Objects[nIndex] := TObject(GetTickCount + dwTime * 60 *
1000);
end else begin
g_DenySayMsgList.AddRecord(sHumanName, GetTickCount + dwTime * 60 * 1000);
end;
finally
g_DenySayMsgList.UnLock;
end;
SysMsg(Format(g_sGameCommandShutupHumanMsg, [sHumanName, dwTime]), c_Red,
t_Hint);
end;
procedure TPlayObject.CmdShutupList(Cmd: pTGameCmd; sParam1: string);
var
i : Integer;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if ((sParam1 <> '') and (sParam1[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd, '']), c_Red, t_Hint);
Exit;
end;
if (m_btPermissionGM < 6) then Exit;
g_DenySayMsgList.Lock;
try
if g_DenySayMsgList.Count <= 0 then begin
SysMsg(g_sGameCommandShutupListIsNullMsg, c_Green, t_Hint);
Exit;
end;
for i := 0 to g_DenySayMsgList.Count - 1 do begin
SysMsg(g_DenySayMsgList.Strings[i] + ' ' +
IntToStr((LongWord(g_DenySayMsgList.Objects[i]) - GetTickCount) div
60000), c_Green, t_Hint);
end;
finally
g_DenySayMsgList.UnLock;
end;
end;
procedure TPlayObject.CmdShutupRelease(Cmd: pTGameCmd; sHumanName: string;
boAll: Boolean);
var
i : Integer;
PlayObject : TPlayObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') or ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandShutupReleaseHelpMsg]), c_Red, t_Hint);
Exit;
end;
g_DenySayMsgList.Lock;
try
i := g_DenySayMsgList.GetIndex(sHumanName);
if i >= 0 then begin
g_DenySayMsgList.Delete(i);
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject <> nil then begin
PlayObject.SysMsg(g_sGameCommandShutupReleaseCanSendMsg, c_Red, t_Hint);
end;
if boAll then begin
UserEngine.SendServerGroupMsg(SS_210, g_Config.nServerNumber, sHumanName);
end;
SysMsg(Format(g_sGameCommandShutupReleaseHumanCanSendMsg, [sHumanName]),
c_Green, t_Hint);
end;
finally
g_DenySayMsgList.UnLock;
end;
end;
procedure TPlayObject.CmdSmakeItem(Cmd: pTGameCmd; nWhere, nValueType: Integer;
sOpCode: string; nValue: Integer);
var
sShowMsg : string;
nValType, nPoint, nAddPoint : Integer;
UserItem : pTUserItem;
StdItem : pTStdItem;
nOldOverLap : DWORD;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
nValType := nValueType;
nAddPoint := nValue;
if (nWhere >= 0) and (nWhere <= High(THumItems)) then
UserItem := @m_UseItems[nWhere]
else
GetUserItemByMakeIndex(nWhere, UserItem);
if (UserItem = nil) or (UserItem.wIndex = 0) then
StdItem := nil
else
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if (StdItem = nil) or (sOpCode = '') or ((sOpCode <> '') and (not (sOpCode[1] in ['+', '-', '=']))) then begin
SysMsg(g_sGamecommandSuperMakeHelpMsg, c_Red, t_Hint);
SysMsg('命令格式: @' + Cmd.sCmd + ' 物品(位置: 0..14)编号 属性类型(0..72) 操作符号(+、-、=) 调整数值', c_Red, t_Hint);
Exit;
end;
case nValType of
0..12, 15..19: begin //极品属性,扩展属性
nAddPoint := _MIN(High(byte), nAddPoint);
case sOpCode[1] of
'+': begin
if UserItem.btValue[nValType] + nAddPoint > High(byte) then begin
nAddPoint := High(byte) - UserItem.btValue[nValType]
end;
UserItem.btValue[nValType] := UserItem.btValue[nValType] +
nAddPoint;
end;
'-': begin
if UserItem.btValue[nValType] - nAddPoint < 0 then
UserItem.btValue[nValType] := 0
else
UserItem.btValue[nValType] := UserItem.btValue[nValType] -
nAddPoint;
end;
'=': begin
UserItem.btValue[nValType] := nAddPoint;
end;
end;
end;
13: ; //自定义装备名称
20: begin
case sOpCode[1] of
'+': begin
if UserItem.Dura + nAddPoint > High(word) then begin
nAddPoint := High(word) - UserItem.Dura;
end;
UserItem.Dura := UserItem.Dura + nAddPoint;
end;
'-': begin
if UserItem.Dura - nAddPoint < 0 then begin
nAddPoint := UserItem.Dura;
end;
UserItem.Dura := UserItem.Dura - nAddPoint;
end;
'=': begin
UserItem.Dura := nAddPoint;
end;
end;
end;
21: begin
case sOpCode[1] of
'+': begin
if UserItem.DuraMax + nAddPoint > High(word) then begin
nAddPoint := High(word) - UserItem.DuraMax;
end;
UserItem.DuraMax := UserItem.DuraMax + nAddPoint;
end;
'-': begin
if UserItem.DuraMax - nAddPoint < 0 then begin
nAddPoint := UserItem.DuraMax;
end;
UserItem.DuraMax := UserItem.DuraMax - nAddPoint;
end;
'=': begin
UserItem.DuraMax := nAddPoint;
end;
end;
end;
22: begin //黑暗魔力
case sOpCode[1] of
'+': begin
if MakeWord(UserItem.btItemExt[0], UserItem.btItemExt[1]) +
nAddPoint > High(word) then
nAddPoint := High(word)
else
nAddPoint := MakeWord(UserItem.btItemExt[0],
UserItem.btItemExt[1]) + nAddPoint;
UserItem.btItemExt[0] := LoByte(nAddPoint);
UserItem.btItemExt[1] := HiByte(nAddPoint);
end;
'-': begin
if MakeWord(UserItem.btItemExt[0], UserItem.btItemExt[1]) -
nAddPoint < 0 then
nAddPoint := 0
else
nAddPoint := MakeWord(UserItem.btItemExt[0],
UserItem.btItemExt[1]) - nAddPoint;
UserItem.btItemExt[0] := LoByte(nAddPoint);
UserItem.btItemExt[1] := HiByte(nAddPoint);
end;
'=': begin
UserItem.btItemExt[0] := LoByte(nAddPoint);
UserItem.btItemExt[1] := HiByte(nAddPoint);
end;
end;
end;
23..38: begin //黑暗属性下限
nValType := nValType - 23;
case sOpCode[1] of
'+': begin
if _Hi(UserItem.btItemExt[nValType]) + nAddPoint > $0F then
nAddPoint := $0F
else
nAddPoint := _Hi(UserItem.btItemExt[nValType]) + nAddPoint;
UserItem.btItemExt[nValType] :=
_SetHi(UserItem.btItemExt[nValType], nAddPoint);
end;
'-': begin
if _Hi(UserItem.btItemExt[nValType]) < nAddPoint then
nAddPoint := $00
else
nAddPoint := _Hi(UserItem.btItemExt[nValType]) - nAddPoint;
UserItem.btItemExt[nValType] :=
_SetHi(UserItem.btItemExt[nValType], nAddPoint);
end;
'=': begin
UserItem.btItemExt[nValType] :=
_SetHi(UserItem.btItemExt[nValType], nAddPoint);
end;
end;
end;
39..54: begin //黑暗属性上限
nValType := nValType - 39;
case sOpCode[1] of
'+': begin
if _Lo(UserItem.btItemExt[nValType]) + nAddPoint > $0F then
nAddPoint := $0F
else
nAddPoint := _Lo(UserItem.btItemExt[nValType]) + nAddPoint;
UserItem.btItemExt[nValType] :=
_SetLo(UserItem.btItemExt[nValType], nAddPoint);
end;
'-': begin
if _Lo(UserItem.btItemExt[nValType]) < nAddPoint then
nAddPoint := $00
else
nAddPoint := _Lo(UserItem.btItemExt[nValType]) - nAddPoint;
UserItem.btItemExt[nValType] :=
_SetLo(UserItem.btItemExt[nValType], nAddPoint);
end;
'=': begin
UserItem.btItemExt[nValType] :=
_SetLo(UserItem.btItemExt[nValType], nAddPoint);
end;
end;
end;
66: begin
nValType := nValType - 55;
case sOpCode[1] of
'+': begin
if UserItem.btItemExt[nValType] + nAddPoint > $FF then
nAddPoint := $FF
else
nAddPoint := UserItem.btItemExt[nValType] + nAddPoint;
UserItem.btItemExt[nValType] := nAddPoint + StdItem.NeedLevel;
end;
'-': begin
if UserItem.btItemExt[nValType] < nAddPoint then
nAddPoint := $00
else
nAddPoint := UserItem.btItemExt[nValType] - nAddPoint;
UserItem.btItemExt[nValType] := nAddPoint;
end;
'=': begin
UserItem.btItemExt[nValType] := nAddPoint;
end;
end;
end;
55..65, 67..70: begin
nValType := nValType - 55;
case sOpCode[1] of
'+': begin
if UserItem.btItemExt[nValType] + nAddPoint > $FF then
nAddPoint := $FF
else
nAddPoint := UserItem.btItemExt[nValType] + nAddPoint;
UserItem.btItemExt[nValType] := nAddPoint;
end;
'-': begin
if UserItem.btItemExt[nValType] < nAddPoint then
nAddPoint := $00
else
nAddPoint := UserItem.btItemExt[nValType] - nAddPoint;
UserItem.btItemExt[nValType] := nAddPoint;
end;
'=': begin
UserItem.btItemExt[nValType] := nAddPoint;
end;
end;
end;
71: begin //重叠物品、神秘符石
nOldOverLap := MakeLong(MakeWord(UserItem.btValue[0], UserItem.btValue[1]), MakeWord(UserItem.btValue[2], UserItem.btValue[3]));
case sOpCode[1] of
'+': begin
if nOldOverLap + nAddPoint > High(DWORD) then
nAddPoint := High(DWORD)
else
nAddPoint := nOldOverLap + nAddPoint;
UserItem.btValue[0] := LoByte(LoWord(nAddPoint));
UserItem.btValue[1] := HiByte(LoWord(nAddPoint));
UserItem.btValue[2] := LoByte(HiWord(nAddPoint));
UserItem.btValue[3] := HiByte(HiWord(nAddPoint));
end;
'-': begin
if nOldOverLap - nAddPoint < 0 then
nAddPoint := 0
else
nAddPoint := nOldOverLap - nAddPoint;
UserItem.btValue[0] := LoByte(LoWord(nAddPoint));
UserItem.btValue[1] := HiByte(LoWord(nAddPoint));
UserItem.btValue[2] := LoByte(HiWord(nAddPoint));
UserItem.btValue[3] := HiByte(HiWord(nAddPoint));
end;
'=': begin
UserItem.btValue[0] := LoByte(LoWord(nAddPoint));
UserItem.btValue[1] := HiByte(LoWord(nAddPoint));
UserItem.btValue[2] := LoByte(HiWord(nAddPoint));
UserItem.btValue[3] := HiByte(HiWord(nAddPoint));
end;
end;
end;
72: begin //魂珠积累经验
nOldOverLap := MakeLong(MakeWord(UserItem.btItemExt[0], UserItem.btItemExt[1]), MakeWord(UserItem.btItemExt[2], UserItem.btItemExt[3]));
case sOpCode[1] of
'+': begin
nAddPoint := nOldOverLap + nAddPoint;
UserItem.btItemExt[0] := LoByte(LoWord(nAddPoint));
UserItem.btItemExt[1] := HiByte(LoWord(nAddPoint));
UserItem.btItemExt[2] := LoByte(HiWord(nAddPoint));
UserItem.btItemExt[3] := HiByte(HiWord(nAddPoint));
end;
'-': begin
if nOldOverLap - nAddPoint < 0 then
nAddPoint := 0
else
nAddPoint := nOldOverLap - nAddPoint;
UserItem.btItemExt[0] := LoByte(LoWord(nAddPoint));
UserItem.btItemExt[1] := HiByte(LoWord(nAddPoint));
UserItem.btItemExt[2] := LoByte(HiWord(nAddPoint));
UserItem.btItemExt[3] := HiByte(HiWord(nAddPoint));
end;
'=': begin
UserItem.btItemExt[0] := LoByte(LoWord(nAddPoint));
UserItem.btItemExt[1] := HiByte(LoWord(nAddPoint));
UserItem.btItemExt[2] := LoByte(HiWord(nAddPoint));
UserItem.btItemExt[3] := HiByte(HiWord(nAddPoint));
end;
end;
end;
end;
RecalcAbilitys();
SendUpdateItem(UserItem);
sShowMsg := IntToStr(UserItem.wIndex) + '-' + IntToStr(UserItem.MakeIndex) +
' ' +
IntToStr(UserItem.Dura) + '/' + IntToStr(UserItem.DuraMax) + ' ' +
IntToStr(UserItem.btValue[0]) + '/' +
IntToStr(UserItem.btValue[1]) + '/' +
IntToStr(UserItem.btValue[2]) + '/' +
IntToStr(UserItem.btValue[3]) + '/' +
IntToStr(UserItem.btValue[4]) + '/' +
IntToStr(UserItem.btValue[5]) + '/' +
IntToStr(UserItem.btValue[6]) + '/' +
IntToStr(UserItem.btValue[7]) + '/' +
IntToStr(UserItem.btValue[8]) + '/' +
IntToStr(UserItem.btValue[9]) + '/' +
IntToStr(UserItem.btValue[10]) + '/' +
IntToStr(UserItem.btValue[11]) + '/' +
IntToStr(UserItem.btValue[12]) + '/' +
IntToStr(UserItem.btValue[13]) + '/' +
IntToStr(UserItem.btValue[14]) + '/' +
IntToStr(UserItem.btValue[15]) + '/' +
IntToStr(UserItem.btValue[16]) + '/' +
IntToStr(UserItem.btValue[17]) + '/' +
IntToStr(UserItem.btValue[18]) + '/' +
IntToStr(UserItem.btValue[19]);
SysMsg(sShowMsg, c_Blue, t_Hint);
if g_Config.boShowMakeItemMsg then
MainOutMessage('[物品调整] ' + m_sCharName + '(' + StdItem.Name + ' -> '
+ sShowMsg + ')');
end;
procedure TPlayObject.CmdSpirtStart(sCmd, sParam1: string);
var
nTime : Integer;
dwTime : LongWord;
begin
if (m_btPermissionGM < 6) then Exit;
if (sParam1 <> '') and (sParam1[1] = '?') then begin
SysMsg('此命令用于开始祈祷生效宝宝叛变。', c_Red, t_Hint);
Exit;
end;
nTime := Str_ToInt(sParam1, -1);
if nTime > 0 then begin
dwTime := LongWord(nTime) * 1000;
end else begin
dwTime := g_Config.dwSpiritMutinyTime;
end;
g_dwSpiritMutinyTick := GetTickCount + dwTime;
SysMsg('祈祷叛变已开始。持续时长 ' + IntToStr(dwTime div 1000) + ' 秒。', c_Green, t_Hint);
end;
procedure TPlayObject.CmdSpirtStop(sCmd, sParam1: string);
begin
if (m_btPermissionGM < 6) then Exit;
if (sParam1 <> '') and (sParam1[1] = '?') then begin
SysMsg('此命令用于停止祈祷生效导致宝宝叛变。', c_Red,
t_Hint);
Exit;
end;
g_dwSpiritMutinyTick := 0;
SysMsg('祈祷叛变已停止。', c_Green, t_Hint);
end;
procedure TPlayObject.CmdStartContest(Cmd: pTGameCmd; sParam1: string);
//004CF008
var
i, ii : Integer;
List10, List14 : TList;
PlayObject, PlayObjectA : TPlayObject;
bo19 : Boolean;
s20 : string;
Guild : TGuild;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if ((sParam1 <> '') and (sParam1[1] = '?')) then begin
SysMsg('开始行会争霸赛。', c_Red, t_Hint);
SysMsg(Format('命令格式: @%s', [Cmd.sCmd]), c_Red, t_Hint);
Exit;
end;
if not m_PEnvir.m_MapFlag.boFight3 then begin
SysMsg('此命令不能在当前地图中使用!!!', c_Red, t_Hint);
Exit;
end;
List10 := TList.Create;
List14 := TList.Create;
UserEngine.GetMapRageHuman(m_PEnvir, m_nCurrX, m_nCurrY, 1000, List10);
for i := 0 to List10.Count - 1 do begin
PlayObject := TPlayObject(List10.Items[i]);
if not PlayObject.m_boObMode or not PlayObject.m_boAdminMode then begin
PlayObject.m_nFightZoneDieCount := 0;
if PlayObject.m_MyGuild = nil then Continue;
bo19 := False;
for ii := 0 to List14.Count - 1 do begin
PlayObjectA := TPlayObject(List14.Items[ii]);
if PlayObject.m_MyGuild = PlayObjectA.m_MyGuild then
bo19 := True;
end;
if not bo19 then begin
List14.Add(PlayObject.m_MyGuild);
end;
end;
end;
SysMsg('行会争霸赛已经开始。', c_Green, t_Hint);
UserEngine.CryCry(RM_CRY, m_PEnvir, m_nCurrX, m_nCurrY, 1000, g_Config.btCryMsgFColor, g_Config.btCryMsgBColor, '- 行会战争已爆发。');
s20 := '';
for i := 0 to List14.Count - 1 do begin
Guild := TGuild(List14.Items[i]);
Guild.StartTeamFight();
for ii := 0 to List10.Count - 1 do begin
PlayObject := TPlayObject(List10.Items[i]);
if PlayObject.m_MyGuild = Guild then begin
Guild.AddTeamFightMember(PlayObject.m_sCharName);
end;
end;
s20 := s20 + Guild.sGuildName + ' ';
end;
UserEngine.CryCry(RM_CRY, m_PEnvir, m_nCurrX, m_nCurrY, 1000,
g_Config.btCryMsgFColor, g_Config.btCryMsgBColor, ' -参加的门派:' + s20);
List10.free;
List14.free;
end;
procedure TPlayObject.CmdStartQuest(Cmd: pTGameCmd; sQuestName, sMapName: string);
var
Map : TEnvirnoment;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sQuestName = '') then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 问答名称 地图名称', c_Red, t_Hint);
Exit;
end;
if (sMapName <> '') then
Map := g_MapManager.FindMap(sMapName)
else
Map := nil;
UserEngine.SendQuestMsg(sQuestName, Map);
end;
procedure TPlayObject.CmdSuperTing(Cmd: pTGameCmd; sHumanName, sRange: string);
var
i : Integer;
PlayObject : TPlayObject;
MoveHuman : TPlayObject;
nRange : Integer;
HumanList : TList;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sRange = '') or (sHumanName = '') or ((sHumanName <> '') and (sHumanName[1]
= '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandSuperTingHelpMsg]), c_Red, t_Hint);
Exit;
end;
nRange := _Max(10, Str_ToInt(sRange, 2));
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject <> nil then begin
HumanList := TList.Create;
UserEngine.GetMapRageHuman(PlayObject.m_PEnvir, PlayObject.m_nCurrX,
PlayObject.m_nCurrY, nRange, HumanList);
for i := 0 to HumanList.Count - 1 do begin
MoveHuman := TPlayObject(HumanList.Items[i]);
if MoveHuman <> Self then
MoveHuman.MapRandomMove(MoveHuman.m_sHomeMap, 0, nil);
end;
HumanList.free;
end else begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
end;
end;
procedure TPlayObject.CmdTakeOffHorse(sCmd, sParam: string);
begin
if (sParam <> '') and (sParam[1] = '?') then begin
SysMsg('下马命令,在骑马状态输入此命令下马。', c_Red,
t_Hint);
SysMsg(Format('命令格式: @%s', [sCmd]), c_Red, t_Hint);
Exit;
end;
if m_boRideOn then ClientRideOff;
FeatureChanged();
end;
procedure TPlayObject.CmdTakeOnHorse(sCmd, sParam: string);
begin
if (sParam <> '') and (sParam[1] = '?') then begin
SysMsg('上马命令,在戴好马牌后输入此命令就可以骑上马。', c_Red, t_Hint);
SysMsg(Format('命令格式: @%s', [sCmd]), c_Red, t_Hint);
Exit;
end;
if (m_btHorseType = 0) then begin
SysMsg('骑马必须先戴上马牌!!!', c_Red, t_Hint);
Exit;
end;
FeatureChanged();
end;
procedure TPlayObject.CmdTestFire(sCmd: string; nRange, nType, nTime, nPoint:
Integer);
var
nX, nY : Integer;
FireBurnEvent : TFireBurnEvent;
nMinX, nMaxX, nMinY, nMaxY : Integer;
begin
nMinX := m_nCurrX - nRange;
nMaxX := m_nCurrX + nRange;
nMinY := m_nCurrY - nRange;
nMaxY := m_nCurrY + nRange;
for nX := nMinX to nMaxX do begin
for nY := nMinY to nMaxY do begin
if ((nX < nMaxX) and (nY = nMinY)) or
((nY < nMaxY) and (nX = nMinX)) or
(nX = nMaxX) or (nY = nMaxY) then begin
FireBurnEvent := TFireBurnEvent.Create(Self, nX, nY, nType, nTime *
1000, nPoint);
g_EventManager.AddEvent(FireBurnEvent);
end;
end;
end;
end;
procedure TPlayObject.CmdTestGetBagItems(Cmd: pTGameCmd; sParam: string);
var
btDc, btSc, btMc, btDura : byte;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sParam <> '') and (sParam[1] = '?') then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandTestGetBagItemsHelpMsg]), c_Red, t_Hint);
Exit;
end;
btDc := 0;
btSc := 0;
btMc := 0;
btDura := 0;
GetBagUseItems(btDc, btSc, btMc, btDura);
SysMsg(Format('DC:%d SC:%d MC:%d DURA:%d', [btDc, btSc, btMc, btDura]),
c_Blue, t_Hint);
end;
procedure TPlayObject.CmdTestSpeedMode(Cmd: pTGameCmd; nWhere, nType: Integer);
var
CharStatus : TCharStatus;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
m_boTestSpeedMode := not m_boTestSpeedMode;
if m_boTestSpeedMode then begin
SysMsg('开启速度测试模式', c_Red, t_Hint);
end else begin
SysMsg('关闭速度测试模式', c_Red, t_Hint);
end;
end;
procedure TPlayObject.CmdTestStatus(sCmd: string; nType, nTime: Integer);
begin
if (m_btPermissionGM < 6) then Exit;
if (not (nType in [Low(TStatusTime)..High(TStatusTime)])) or (nTime < 0) then begin
SysMsg('命令格式: @' + sCmd + ' 类型(0..11) 时长', c_Red, t_Hint);
Exit;
end;
m_wStatusTimeArr[nType] := _MIN(60, nTime) * 1000;
m_dwStatusArrTick[nType] := GetTickCount();
m_nCharStatus := GetCharStatus();
StatusChanged();
if g_Config.boShowScriptActionMsg then
SysMsg(Format('状态编号:%d 时间长度: %d 秒', [nType, nTime]), c_Green, t_Hint);
end;
procedure TPlayObject.CmdTing(Cmd: pTGameCmd; sHumanName: string);
var
PlayObject : TPlayObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') or ((sHumanName <> '') and (sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandTingHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject <> nil then begin
PlayObject.MapRandomMove(m_sHomeMap, 0, nil);
end else begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
end;
end;
procedure TPlayObject.CmdTraining(sSkillName: string; nLevel: Integer);
//004CC414
begin
if (m_btPermissionGM < 6) then Exit;
end;
//GM命令TrainingSkill 人物 技能名称 修炼等级
procedure TPlayObject.CmdTrainingMagic(Cmd: pTGameCmd; sHumanName, sSkillName:
string;
nLevel: Integer);
var
Magic : pTMagic;
PlayObject : TPlayObject;
btLevel : byte;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if ((sHumanName <> '') and (sHumanName[1] = '?')) or (sHumanName = '') or
(sSkillName = '') or (nLevel < 0) or not (nLevel in [0..SKILLMAXLEVEL]) then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 人物名称 技能名称 修炼等级(0-' + IntToStr(SKILLMAXLEVEL), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
Magic := UserEngine.FindMagic(sSkillName);
if Magic = nil then begin
SysMsg(Format('%s 技能名称不正确!!!', [sSkillName]), c_Red, t_Hint);
Exit;
end;
if PlayObject.IsTrainingSkill(Magic.wMagicID) then begin
SysMsg(Format('%s的%s 技能已修炼过了!!!', [PlayObject.m_sCharName, sSkillName]), c_Red, t_Hint);
Exit;
end;
if (Magic.wMagicID in [87..90]) and (nLevel = 0) then
btLevel := _Max(1, nLevel)
else
btLevel := nLevel;
PlayObject.AddItemSkill(Magic, nLevel, 0, 0);
PlayObject.RecalcAbilitys;
SysMsg(Format('%s 的 %s 技能修炼成功!!!', [PlayObject.m_sCharName, sSkillName]), c_Green, t_Hint);
end;
//调整人物技能等级
procedure TPlayObject.CmdTrainingSkill(Cmd: pTGameCmd; sHumanName, sSkillName:
string;
nLevel: Integer);
var
i : Integer;
UserMagic : pTUserMagic;
PlayObject : TPlayObject;
Found : Boolean;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sHumanName = '') or (sSkillName = '') or (nLevel < 0) or (nLevel > SKILLMAXLEVEL) then begin
SysMsg('命令格式: @' + Cmd.sCmd + ' 人物名称 技能名称 修炼等级(0-' + IntToStr(SKILLMAXLEVEL) + ')', c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format('%s不在线,或在其它服务器上!!', [sHumanName]), c_Red, t_Hint);
Exit;
end;
Found := False;
for i := 0 to PlayObject.m_MagicList.Count - 1 do begin
UserMagic := PlayObject.m_MagicList.Items[i];
if (CompareText(UserMagic.MagicInfo.sMagicName, sSkillName) = 0) and (UserMagic.btType < MAG_AMALGAMATION) then begin
if UserMagic.GetMagIdx in [87..90] then nLevel := _Max(1, nLevel);
UserMagic.btLevel := nLevel;
PlayObject.SendMagic_LvExp_Msg(UserMagic, 100);
PlayObject.SysMsg(Format('%s的修炼等级为%d', [sSkillName, nLevel]), c_Green, t_Hint);
SysMsg(Format('%s的技能%s修炼等级为%d', [sHumanName, sSkillName, nLevel]), c_Green, t_Hint);
Found := True;
Break;
end;
end;
if not Found then
SysMsg(Format('%s的技能%s尚未修炼', [sHumanName, sSkillName]), c_Green, t_Hint);
end;
procedure TPlayObject.CmdUnBindUseItem(Cmd: pTGameCmd; sHumanName, sItem,
sType: string);
var
i : Integer;
PlayObject : TPlayObject;
UserItem : pTUserItem;
nItem, nBind : Integer;
ItemBind : pTItemBind;
nItemIdx, nMakeIdex : Integer;
sBindName : string;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
nBind := -1;
nItem := GetUseItemIdx(sItem);
if CompareText(sType, '帐号') = 0 then nBind := 0;
if CompareText(sType, '人物') = 0 then nBind := 1;
if CompareText(sType, 'IP') = 0 then nBind := 2;
if (nItem < 0) or (nBind < 0) or (sHumanName = '') or ((sHumanName <> '') and
(sHumanName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandBindUseItemHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sHumanName);
if PlayObject = nil then begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumanName]), c_Red, t_Hint);
Exit;
end;
UserItem := @PlayObject.m_UseItems[nItem];
if UserItem.wIndex = 0 then begin
SysMsg(Format(g_sGameCommandBindUseItemNoItemMsg, [sHumanName, sItem]),
c_Red, t_Hint);
Exit;
end;
nItemIdx := UserItem.wIndex;
nMakeIdex := UserItem.MakeIndex;
case nBind of //
0: begin
sBindName := PlayObject.m_sUserID;
for i := 0 to g_ItemBindAccount.Count - 1 do begin
ItemBind := g_ItemBindAccount.Items[i];
if (ItemBind.nItemIdx = nItemIdx) and (ItemBind.nMakeIdex = nMakeIdex) then begin
SysMsg(Format(g_sGameCommandBindUseItemAlreadBindMsg, [sHumanName,
sItem]), c_Red, t_Hint);
Exit;
end;
end;
New(ItemBind);
ItemBind.nItemIdx := nItemIdx;
ItemBind.nMakeIdex := nMakeIdex;
ItemBind.sBindName := sBindName;
g_ItemBindAccount.Insert(0, ItemBind);
SaveItemBindAccount();
SysMsg(Format('%s[%s]IDX[%d]系列号[%d]持久[%d-%d],绑定到%s成功。',
[GetUseItemName(nItem),
UserEngine.GetStdItemName(UserItem.wIndex),
UserItem.wIndex,
UserItem.MakeIndex,
UserItem.Dura,
UserItem.DuraMax,
sBindName]),
c_Blue, t_Hint);
PlayObject.SysMsg(Format('你的%s[%s]已经绑定到%s[%s]上了。',
[GetUseItemName(nItem),
UserEngine.GetStdItemName(UserItem.wIndex),
sType,
sBindName
]), c_Blue, t_Hint);
end;
1: begin
sBindName := PlayObject.m_sCharName;
for i := 0 to g_ItemBindCharName.Count - 1 do begin
ItemBind := g_ItemBindCharName.Items[i];
if (ItemBind.nItemIdx = nItemIdx) and (ItemBind.nMakeIdex = nMakeIdex) then begin
SysMsg(Format(g_sGameCommandBindUseItemAlreadBindMsg, [sHumanName,
sItem]), c_Red, t_Hint);
Exit;
end;
end;
New(ItemBind);
ItemBind.nItemIdx := nItemIdx;
ItemBind.nMakeIdex := nMakeIdex;
ItemBind.sBindName := sBindName;
g_ItemBindCharName.Insert(0, ItemBind);
SaveItemBindCharName();
SysMsg(Format('%s[%s]IDX[%d]系列号[%d]持久[%d-%d],绑定到%s成功。',
[GetUseItemName(nItem),
UserEngine.GetStdItemName(UserItem.wIndex),
UserItem.wIndex,
UserItem.MakeIndex,
UserItem.Dura,
UserItem.DuraMax,
sBindName]),
c_Blue, t_Hint);
PlayObject.SysMsg(Format('你的%s[%s]已经绑定到%s[%s]上了。',
[GetUseItemName(nItem),
UserEngine.GetStdItemName(UserItem.wIndex),
sType,
sBindName
]), c_Blue, t_Hint);
end;
2: begin
sBindName := PlayObject.m_sIPaddr;
for i := 0 to g_ItemBindIPaddr.Count - 1 do begin
ItemBind := g_ItemBindIPaddr.Items[i];
if (ItemBind.nItemIdx = nItemIdx) and (ItemBind.nMakeIdex = nMakeIdex) then begin
SysMsg(Format(g_sGameCommandBindUseItemAlreadBindMsg, [sHumanName,
sItem]), c_Red, t_Hint);
Exit;
end;
end;
New(ItemBind);
ItemBind.nItemIdx := nItemIdx;
ItemBind.nMakeIdex := nMakeIdex;
ItemBind.sBindName := sBindName;
g_ItemBindIPaddr.Insert(0, ItemBind);
SaveItemBindIPaddr();
SysMsg(Format('%s[%s]IDX[%d]系列号[%d]持久[%d-%d],绑定到%s成功。',
[GetUseItemName(nItem),
UserEngine.GetStdItemName(UserItem.wIndex),
UserItem.wIndex,
UserItem.MakeIndex,
UserItem.Dura,
UserItem.DuraMax,
sBindName]),
c_Blue, t_Hint);
PlayObject.SysMsg(Format('你的%s[%s]已经绑定到%s[%s]上了。',
[GetUseItemName(nItem),
UserEngine.GetStdItemName(UserItem.wIndex),
sType,
sBindName
]), c_Blue, t_Hint);
end;
end;
end;
procedure TPlayObject.CmdUserMoveXY(sCmd, sX, sY: string);
var
nX, nY : Integer;
begin
if m_boTeleport then begin
nX := Str_ToInt(sX, -1);
nY := Str_ToInt(sY, -1);
if not m_PEnvir.m_MapFlag.boNOPOSITIONMOVE then begin
if m_PEnvir.CanWalkOfItem(nX, nY, g_Config.boUserMoveCanDupObj,
g_Config.boUserMoveCanOnItem) then begin
if (GetTickCount - m_dwTeleportTick) > g_Config.dwUserMoveTime * 1000
{10000}then begin
m_dwTeleportTick := GetTickCount();
SendRefMsg(RM_SPACEMOVE_FIRE, 0, 0, 0, 0, '');
//BaseObjectMove('',sX,sY);
SpaceMove(m_sMapName, nX, nY, 0, nil);
end else begin
SysMsg(IntToStr(g_Config.dwUserMoveTime - (GetTickCount -
m_dwTeleportTick) div 1000) +
'秒之后才可以再使用此功能!!!', c_Red, t_Hint);
end;
end else begin
SysMsg(Format(g_sGameCommandPositionMoveCanotMoveToMap, [m_sMapName, sX,
sY]), c_Green, t_Hint);
end;
end else begin
SysMsg('此地图禁止使用此命令!!!', c_Red, t_Hint);
end;
end else begin
SysMsg('您现在还无法使用此功能!!!', c_Red, t_Hint);
end;
end;
procedure TPlayObject.CmdViewDiary(sCmd: string; nFlag: Integer);
begin
end;
procedure TPlayObject.CmdViewWhisper(Cmd: pTGameCmd; sCharName, sParam2:
string);
var
PlayObject : TPlayObject;
begin
if (m_btPermissionGM < Cmd.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
if (sCharName = '') or ((sCharName <> '') and (sCharName[1] = '?')) then begin
SysMsg(Format(g_sGameCommandParamUnKnow, [Cmd.sCmd,
g_sGameCommandViewWhisperHelpMsg]), c_Red, t_Hint);
Exit;
end;
PlayObject := UserEngine.GetPlayObject(sCharName);
if PlayObject <> nil then begin
if PlayObject.m_GetWhisperHuman = Self then begin
PlayObject.m_GetWhisperHuman := nil;
SysMsg(Format(g_sGameCommandViewWhisperMsg1, [sCharName]), c_Green,
t_Hint);
end else begin
PlayObject.m_GetWhisperHuman := Self;
SysMsg(Format(g_sGameCommandViewWhisperMsg2, [sCharName]), c_Green,
t_Hint);
end;
end else begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sCharName]), c_Red, t_Hint);
end;
end;
{元神创建结束}
procedure TPlayObject.CreatePneumaEnd(btFlag: Integer; sNewName: string; nSex, btHumKind: byte);
begin
if btFlag = 1 then begin
if btHumKind = 1 then begin
m_sPneumaName := sNewName;
if m_PneumaObject = nil then
m_btPneumaSex := nSex + 1;
end;
Inc(m_btCurPneumaCount);
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
if not ExecuteScript(g_FunctionNPC, '@元神创建成功') then
SysMsg('元神创建成功!', c_Red, t_Hint);
end else begin
if not ExecuteScript(g_FunctionNPC, '@元神创建失败') then
SysMsg('元神创建失败,名字可能被占用,请换一个名字!', c_Red, t_Hint);
end;
m_boCreatePneuma := False;
end;
function TPlayObject.DayBright: byte;
begin
Result := 0;
if m_PEnvir.m_boDarkness then
Result := 1
else if m_PEnvir.m_boDayLight then Result := 0;
end;
procedure TPlayObject.DealCancel;
begin
if not m_boDealing then Exit;
m_boDealing := False;
SendDefMessage(SM_DEALCANCEL, 0, 0, 0, 0, '');
if m_DealCreat <> nil then begin
TPlayObject(m_DealCreat).DealCancel;
end;
m_DealCreat := nil;
GetBackDealItems();
SysMsg(g_sDealActionCancelMsg {'交易取消'}, c_Green, t_Hint);
m_DealLastTick := GetTickCount();
end;
procedure TPlayObject.DealCancelA;
begin
m_Abil.dwHP := m_WAbil.dwHP;
DealCancel();
end;
procedure TPlayObject.DelFromFriendList(FriendName: string);
var
i : Integer;
begin
i := m_FriendsList.IndexOf(FriendName);
if i < 0 then Exit;
//在我的好友名单中删除
m_FriendsList.Delete(i);
SendDefMessage(SM_DelFriend, 2, 0, 0, 0, FriendName);
end;
procedure TPlayObject.DelPneuma(nIdx: Integer);
var
pDelPneuma : PTSwitchPneuma;
begin
if m_boPneuma then Exit; //你就是元神!怎么能删除?
if (nIdx > m_btCurPneumaCount) then begin
SysMsg('你选择的元神以经被删除了!!!', c_Red, t_Hint);
Exit; //以经没有元神了! 不能删除
end;
if m_PneumaObject <> nil then begin
SysMsg('请先收起元神,再执行删除', c_Red, t_Hint);
Exit;
end;
if nIdx in [1, 2] then begin
g_LargePacketManage.Init();
pDelPneuma := g_LargePacketManage.GetMemRecord(SizeOf(TSwitchPneuma));
pDelPneuma^.dwPlayObject := Integer(Self);
pDelPneuma^.sChrName := m_sPneumaName;
pDelPneuma^.dwDBIndex := nIdx;
FrontEngine.SendGameWorkMsg(WK_DelPneuma, 0, g_LargePacketManage.GetMsg, False, True);
end;
// if (nIdx = 1) then begin
// if m_PneumaObject <> nil then begin
// SysMsg('请先收起元神,再执行删除', c_Red, t_Hint);
// Exit;
// end;
// if m_sPneumaName = '' then Exit;
// SendDelPneuma(m_sUserID, m_sPneumaName);
// m_btPneumaSex := 0;
//// m_btPneumaJob := 0;
//// m_wPneumaLevel := 0;
// m_sPneumaName := '';
// SendDefMessage(SM_MENU_OK, 0, 0, 0, 0, '你的元神已经删除成功');
// end else begin
//// if m_btIntrovertSex = 0 then Exit;
//// m_btIntrovertSex := 0;
//// m_btIntrovertJob := 0;
//// m_wIntrovertLevel := 0;
//// FillChar(m_IntrovertAbil, SizeOf(TAbility), #0);
//// FillChar(m_IntrovertMagic, SizeOf(THumMagic), #0);
// if m_PneumaObject <> nil then begin
// m_PneumaObject.m_btPneumaKind := 1;
// end;
// end;
end;
procedure TPlayObject.DelPneumaEnd(nIdx, btSex, btCount: byte);
var
sMsg : string;
begin
if m_boPneuma then Exit;
if (nIdx > 0) then begin
m_btCurPneumaCount := btCount;
m_btPneumaSex := btSex + 1;
if m_btCurPneumaCount = 0 then begin
m_sPneumaName := '';
m_btPneumaSex := 0;
sMsg := '你的元神已经删除成功!!'
end else if nIdx = 1 then
sMsg := '你的外现元神已经删除成功,内敛元神以切换成了外现元神.'
else sMsg := '你的内敛元神已经删除成功.';
SendDefMessage(SM_MENU_OK, 0, 0, 0, 0, sMsg);
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
end else
SendDefMessage(SM_MENU_OK, 0, 0, 0, 0, '你选择的元神删除失败');
end;
//从地图上消失
procedure TPlayObject.Disappear;
resourcestring
sExceptionMsg = '[Exception] TPlayObject::Disappear';
var
i : Integer;
nCheck : Integer;
begin
nCheck := 0;
try
if m_boReadyRun then DisappearA;
nCheck := 1;
if m_boTransparent and m_boHideMode then
m_wStatusTimeArr[STATE_TRANSPARENT {0x70}] := 0;
nCheck := 2;
if m_GroupOwner <> nil then begin
m_GroupOwner.DelMember(Self);
end;
nCheck := 3;
if m_MyGuild <> nil then begin
TGuild(m_MyGuild).DelHumanObj(Self);
end;
nCheck := 4;
if m_MyClan <> nil then begin
TClan(m_MyClan).DelHumanObj(Self);
end;
nCheck := 5;
//删除马
HorseHide;
nCheck := 6;
//删除踏云豹
if (m_Pet <> nil) then PetHide(m_PetInfo[0].nMakeIndex);
nCheck := 7;
LogonTimcCost();
nCheck := 8;
except
on E: Exception do begin
MainOutMessage(Format(sExceptionMsg, [nCheck]));
MainOutMessage(E.Message);
end;
end;
inherited;
end;
//人物死亡后掉落物品
procedure TPlayObject.DropUseItems(BaseObject: TBaseObject; AttackBaseObject: TBaseObject = nil);
var
i : Integer;
nRate : Integer;
StdItem : pTStdItem;
DelList : TStringList;
boCon, boDrop : Boolean;
resourcestring
sExceptionMsg = '[Exception] TPlayObject::DropUseItems';
begin
boDrop := False;
DelList := nil;
try
if m_boAngryRing or m_boNoDropUseItem then Exit;
for i := Low(THumItems) to High(THumItems) do begin
StdItem := UserEngine.GetStdItem(m_UseItems[i].wIndex);
if StdItem <> nil then begin
if CheckSPCode(StdItem.Reserved, RE_DIRCLEAR) then begin //物品控制-死亡消失
if DelList = nil then DelList := TStringList.Create;
DelList.AddObject('', TObject(m_UseItems[i].MakeIndex));
m_UseItems[i].wIndex := 0;
boDrop := True;
if StdItem.boGameLog = 1 then
AddGameDataLog('16' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
StdItem.Name + #9 +
IntToStr(m_UseItems[i].MakeIndex) + #9 +
BoolToIntStr(m_btRaceServer = RC_PLAYOBJECT) + #9 +
'0');
end;
end;
end;
for i := Low(THumItems) to High(THumItems) do begin
if PKLevel > 2 then
nRate := g_Config.nDieRedDropUseItemRate
else
nRate := g_Config.nDieDropUseItemRate;
if AttackBaseObject <> nil then begin
if (g_Config.boAttachedSoulAbil) then
nRate := _MAX(0, nRate - AttackBaseObject.m_HumDropUserItemAddRate); //附魂
end;
StdItem := UserEngine.GetStdItem(m_UseItems[i].wIndex);
if StdItem <> nil then begin
boCon := CheckSPCode(StdItem.SPCode, SP_DISABLEDIEDROP) and (CheckSPCode(StdItem.Reserved, RE_DIEDROP));
if (not boCon) and (CheckSPCode(StdItem.Reserved, RE_DIEDROP)) then
nRate := 0; //物品控制-死亡身上爆出
if (Random(nRate) <> 0) and (boCon) then Continue;
if (not boCon) and ((Random(nRate) <> 0) or (CheckSPCode(StdItem.SPCode, SP_DISABLEDIEDROP))) then Continue; //物品控制-禁止身上爆出
if ((m_UseItems[i].btItemExt[4] and EX_BIND) = EX_BIND) then Continue; //绑定物品
if DropItemDown(@m_UseItems[i], 5, True, BaseObject, Self) then begin
//if StdItem.Reserved and 10 = 0 then begin
if m_btRaceServer = RC_PLAYOBJECT then begin
if DelList = nil then DelList := TStringList.Create;
DelList.AddObject(UserEngine.GetStdItemName(m_UseItems[i].wIndex),
TObject(m_UseItems[i].MakeIndex));
end;
m_UseItems[i].wIndex := 0;
//end;
boDrop := True;
end;
end;
end;
RecalcAbilitys(boDrop);
if DelList <> nil then
SendMsg(Self, RM_SENDDELITEMLIST, 0, Integer(DelList), 0, 0, '');
except
MainOutMessage(sExceptionMsg);
end;
end;
function TPlayObject.EatItems(StdItem: pTStdItem): Boolean;
var
bo06 : Boolean;
nOldStatus : Integer;
nHP, nMP, nTime : Integer;
Magic : pTMagic;
begin
Result := False;
if m_PEnvir.m_MapFlag.boNODRUG then begin
SysMsg(sCanotUseDrugOnThisMap, c_Red, t_Hint);
Exit;
end;
if GetTickCount - m_dwEatItemTick >= g_Config.nEatItemTime then begin
m_dwEatItemTick := GetTickCount;
end else
Exit;
case StdItem.StdMode of
0: begin
nHP := _MIN(High(word), LoWord(StdItem.AC)) * _Max(1, HiWord(StdItem.AC));
nMP := _MIN(High(word), LoWord(StdItem.MAC)) * _Max(1, HiWord(StdItem.MAC));
case StdItem.Shape of
0, 202: begin //普通药品
if (StdItem.AC > 0) then begin
Inc(m_nIncHealth, nHP);
Inc(m_nIncHealth, m_nAllIncReply);
end;
if (StdItem.MAC > 0) then begin
Inc(m_nIncSpell, nMP);
Inc(m_nIncSpell, m_nAllIncReply);
end;
Result := True;
end;
1: begin //瞬间加血物品,太阳神水
Inc(nHP, m_nAllIncReply);
Inc(nMP, m_nAllIncReply);
IncHealthSpell(nHP, nMP);
Result := True;
end;
201: begin //治疗神水
if CheckEatItems(StdItem) then begin
Inc(nHP, m_nAllIncReply);
Inc(nMP, m_nAllIncReply);
IncHealthSpell(nHP, nMP);
SendRefMsg(RM_510, 1, 0, 3, 0, '');
Result := True;
end;
end;
2: begin
m_boUserUnLockDurg := True;
Result := True;
end;
3: begin
if m_boPneuma and m_boPneumaEffMode then begin
IncHealthSpell(nHP, nMP);
Result := True;
end;
end;
4: begin
if m_PEnvir.m_MapFlag.boDECHP then begin
if m_dwEatTalismanTick > 0 then
m_dwEatTalismanTick := m_dwEatTalismanTick + LoWord(StdItem.DC) * 60000
else
m_dwEatTalismanTick := GetTickCount + LoWord(StdItem.DC) * 60000;
SendDefMessage(SM_510, Integer(Self), (m_dwEatTalismanTick - GetTickCount) mod 1000, 0, 79, '');
SysMsg(StdItem.FilterName + '可以让你在天魔宝藏中不受魔气侵袭而损失生命值,效果持续20分钟', c_Red, t_Hint);
ExecuteScript(g_FunctionNPC, '@使用辟邪丹');
Result := True;
end else begin
SysMsg(StdItem.FilterName + '在此地图使用没有什么效果。', c_Red, t_Hint);
end;
end;
5: begin //强化技能灵丹
Magic := UserEngine.FindMagic(Str_ToInt(m_sScriptParam[1], -1));
if Magic <> nil then begin
m_sScriptParam[1] := Magic^.sMagicName;
m_sScriptParam[3] := IntToStr(Magic^.wMagicID);
end else
m_sScriptParam[1] := '';
UseStdmodeFunItem(StdItem);
Result := True;
end;
200: begin
if CheckEatItems(StdItem) then begin
Inc(nHP, m_nAllIncReply * 10);
Inc(nMP, m_nAllIncReply * 10);
nTime := LoWord(StdItem.DC);
if nTime = 0 then nTime := 10;
if (StdItem.AC > 0) then begin
m_nSuperIncHealth := nHP;
m_dwSuperIncHealthTick := GetTickCount + nTime * 60 * 1000;
SendDefMessage(SM_510, Integer(Self), 1, 0, 1, '');
end;
if (StdItem.MAC > 0) then begin
m_nSuperIncSpell := nMP;
m_dwSuperIncSpellTick := GetTickCount + nTime * 60 * 1000;
SendDefMessage(SM_510, Integer(Self), 1, 0, 2, '');
end;
Result := True;
end;
end;
206: begin
if (m_Tiger <> nil) and (not m_Tiger.m_boGhost) and (not m_Tiger.m_boDeath) then begin
Inc(m_Tiger.m_WAbil.dwHP, nHP);
m_Tiger.HealthSpellChanged();
Result := True;
end;
end;
207: begin
if m_btJob <> 3 then begin //妖士是没有虎王盾的
if (m_TorDDM.Tiger.DB.Dragon = 0) and (m_TorDDM.Tiger.DB.level > 0) and (m_TorDDM.Tiger.Abil.MaxHP > 0) then begin
m_TorDDM.Tiger.DB.ReCallTick := 0;
SendTigerInfo;
SysMsg('你的虎灵值已经恢复了。', c_Red, t_Hint);
Result := True;
end;
end;
end;
219: begin
if m_btJob <> 3 then begin
if (m_TorDDM.Tiger.DB.Dragon > 0) and (m_TorDDM.Tiger.DB.level > 0) and (m_TorDDM.Tiger.Abil.MaxHP > 0) then begin
m_TorDDM.Tiger.DB.ReCallTick := 0;
SendTigerInfo;
SysMsg('你的龙灵值已经恢复了。', c_Red, t_Hint);
Result := True;
end;
end;
end;
208: begin
if m_btMentalLevel > 0 then begin
if m_nMentalPoint < m_nMentalPointMax then begin
nHP := StdItem.NeedLevel * 100;
Inc(m_nMentalPoint, nHP);
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
Result := True;
end;
bo06 := False;
if (m_nMentalPoint >= m_nMentalPointMax) then begin
while True do begin
if (UserEngine.GetMentalAbil(m_btJob, m_btMentalLevel + 1) <> nil) then begin
if (m_nMentalPoint >= m_nMentalPointMax) and (m_nMentalPointMax > 0) then begin
Dec(m_nMentalPoint, m_nMentalPointMax);
Inc(m_btMentalLevel);
RecalcAbilitys();
bo06 := True;
end else
Break;
end else
Break;
end;
if bo06 then begin
ClientQueryMentalAbilitys(Self);
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
FeatureChanged();
end;
end;
end else begin
SysMsg('你还未领悟天元心法,不能使用该道具。请到魔法阵祭祀那领悟天元心法。', c_Red, t_Hint);
end;
end;
211: begin //海神生命神水
if m_WAbil.dwHP < m_WAbil.dwMaxHP then begin
if GetTickCount - m_dwEatDurgHPTick >= StdItem.NeedLevel * 1000 then begin
m_dwEatDurgHPTick := GetTickCount;
Result := True;
end else begin
SysMsg(Format('此神水%d秒后才能使用!', [(StdItem.NeedLevel * 1000 - (GetTickCount - m_dwEatDurgHPTick)) div 1000]), c_Red, t_Hint);
end;
end;
end;
212: begin //海神魔法神水
if m_WAbil.dwMP < m_WAbil.dwMaxMP then begin
if GetTickCount - m_dwEatDurgMPTick >= StdItem.NeedLevel * 1000 then begin
m_dwEatDurgMPTick := GetTickCount;
Result := True;
end else begin
SysMsg(Format('此神水%d秒后才能使用!', [(StdItem.NeedLevel * 1000 - (GetTickCount - m_dwEatDurgMPTick)) div 1000]), c_Red, t_Hint);
end;
end;
end;
else begin
UseStdmodeFunItem(StdItem);
end;
end;
end;
1: begin
nOldStatus := GetMyStatus();
Inc(m_nHungerStatus, StdItem.DuraMax div 10);
m_nHungerStatus := _MIN(5000, m_nHungerStatus);
if nOldStatus <> GetMyStatus() then RefMyStatus();
Result := True;
end;
2: Result := True;
3: begin
case StdItem.Shape of
12: begin
bo06 := False;
if LoWord(StdItem.DC) > 0 then begin
m_wStatusArrValue[0] := LoWord(StdItem.DC);
m_dwStatusArrTimeOutTick[0] := GetTickCount + HiWord(StdItem.MAC) * 1000;
SysMsg('攻击力增加' + IntToStr(HiWord(StdItem.MAC)) + '秒', c_Green, t_Hint);
bo06 := True;
end;
if LoWord(StdItem.MC) > 0 then begin
m_wStatusArrValue[1] := LoWord(StdItem.MC);
m_dwStatusArrTimeOutTick[1] := GetTickCount + HiWord(StdItem.MAC) * 1000;
SysMsg('魔法力增加' + IntToStr(HiWord(StdItem.MAC)) + '秒', c_Green, t_Hint);
bo06 := True;
end;
if LoByte(StdItem.SC) > 0 then begin
m_wStatusArrValue[2] := LoWord(StdItem.SC);
m_dwStatusArrTimeOutTick[2] := GetTickCount + HiWord(StdItem.MAC) * 1000;
SysMsg('道术增加' + IntToStr(HiWord(StdItem.MAC)) + '秒', c_Green, t_Hint);
bo06 := True;
end;
if HiWord(StdItem.AC) > 0 then begin
m_wStatusArrValue[3] := HiWord(StdItem.AC);
m_dwStatusArrTimeOutTick[3] := GetTickCount + HiWord(StdItem.MAC) * 1000;
SysMsg('攻击速度增加' + IntToStr(HiWord(StdItem.MAC)) + '秒', c_Green, t_Hint);
bo06 := True;
end;
if LoWord(StdItem.AC) > 0 then begin
m_wStatusArrValue[4] := LoWord(StdItem.AC);
m_dwStatusArrTimeOutTick[4] := GetTickCount + HiWord(StdItem.MAC) * 1000;
SysMsg('生命值增加' + IntToStr(HiWord(StdItem.MAC)) + '秒', c_Green, t_Hint);
bo06 := True;
end;
if LoWord(StdItem.MAC) > 0 then begin
m_wStatusArrValue[5] := LoWord(StdItem.MAC);
m_dwStatusArrTimeOutTick[5] := GetTickCount + HiWord(StdItem.MAC) * 1000;
SysMsg('魔法值增加' + IntToStr(HiWord(StdItem.MAC)) + '秒', c_Green, t_Hint);
bo06 := True;
end;
if bo06 then begin
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
Result := True;
end;
end;
16: begin //摊位样式
m_wShopKind := StdItem.AC;
SysMsg('您改变了摊位类型', c_Red, t_Hint);
Result := True;
end;
17: begin
if StdItem.AniCount = 0 then begin
m_btShopBanner := StdItem.AC;
m_nBannerColor := MakeLong(MakeWord(LoWord(StdItem.MAC), HiWord(StdItem.MAC)),
MakeWord(LoWord(StdItem.DC), HiWord(StdItem.DC)));
SysMsg('您改变了摊位旗帜颜色', c_Red, t_Hint);
Result := True;
end else begin
Result := UseStdmodeFunItem(StdItem);
end;
end;
201: begin //百变披风
if StdItem.AniCount > 0 then begin //次数物品
Result := UseStdmodeFunItem(StdItem);
Exit;
end;
if m_boRideOn or m_boCatapultMode then begin
SysMsg('你现在不可以使用变身披风', c_Red, t_Hint);
Exit;
end;
if (StdItem.AC = m_wBianshenImg) and (StdItem.MAC = m_wBianshenAppr) then begin //取消变身
m_wBianshenImg := 0;
m_wBianshenAppr := 0;
end else begin
m_wBianshenImg := StdItem.AC;
m_wBianshenAppr := StdItem.MAC;
end;
if m_wExtraLevel > 0 then begin
if m_wBianshenAppr = 0 then
SendMsg(Self, RM_FENGHAO, MakeWord(8, LoByte(m_wExtraLevel)), GetPneumaAmbit, HiByte(m_wExtraLevel), 0, GetExtraLevelName)
else
SendMsg(Self, RM_FENGHAO, MakeWord(8, 0), 0, 0, 0, GetExtraLevelName);
end;
SendRefMsg(RM_FENGHAO, 64, m_wBianshenImg, m_wBianshenAppr, 0, '');
Result := True;
end;
else begin
Result := EatUseItems(StdItem.Shape);
if not Result then Result := UseStdmodeFunItem(StdItem);
end;
end;
end;
end;
end;
function TPlayObject.EatUseItems(nShape: Integer): Boolean; //004BD1BC
var
Castle : TUserCastle;
begin
Result := False;
if m_boArrow and (nShape in [1..3, 5]) then Exit;
case nShape of //
1: begin
SendRefMsg(RM_SPACEMOVE_FIRE, 0, 0, 0, 0, '');
BaseObjectMove(m_sHomeMap, '', '');
Result := True;
end;
2: begin
if not m_PEnvir.m_MapFlag.boNORANDOMMOVE then begin
SendRefMsg(RM_SPACEMOVE_FIRE, 0, 0, 0, 0, '');
BaseObjectMove(m_sMapName, '', '');
Result := True;
end;
end;
3: begin
SendRefMsg(RM_SPACEMOVE_FIRE, 0, 0, 0, 0, '');
if PKLevel < 2 then begin
BaseObjectMove(m_sHomeMap, IntToStr(m_nHomeX), IntToStr(m_nHomeY));
end else begin
BaseObjectMove(g_Config.sRedHomeMap, IntToStr(g_Config.nRedHomeX),
IntToStr(g_Config.nRedHomeY));
end;
Result := True;
end;
4: begin
if WeaptonMakeLuck() then Result := True;
end;
5: begin
if m_MyGuild <> nil then begin
if not m_boInFreePKArea then begin
Castle := g_CastleManager.IsCastleMember(Self);
{
if UserCastle.IsMasterGuild(TGuild(m_MyGuild)) then begin
BaseObjectMove(UserCastle.m_sHomeMap,IntToStr(UserCastle.GetHomeX),IntToStr(UserCastle.GetHomeY));
}
if (Castle <> nil) and Castle.IsMasterGuild(TGuild(m_MyGuild)) then begin
BaseObjectMove(Castle.m_sHomeMap, IntToStr(Castle.GetHomeX),
IntToStr(Castle.GetHomeY));
end else begin
SysMsg('无效', c_Red, t_Hint);
end;
Result := True;
end else begin //004BD3F7
SysMsg('此处无法使用', c_Red, t_Hint);
end;
end;
end;
9: begin
if RepairWeapon() then Result := True;
end;
10: begin
if SuperRepairWeapon() then Result := True;
end;
11: begin
if WinLottery() then Result := True;
end;
end;
end;
function TPlayObject.ExecuteScript(ScriptObj: TObject; sLabel: string): Boolean;
resourcestring
sScriptExcept = '[Exception] TPlayObject::ExecuteScript %s';
begin
Result := False;
if ScriptObj <> nil then begin
try
m_nScriptGotoCount := 0;
m_sScriptCurrLable := '';
m_sScriptGoBackLable := '';
Result := TNormNpc(ScriptObj).GotoLable(Self, sLabel, False);
except
MainOutMessage(Format(sScriptExcept, [sLabel]));
end;
end;
end;
function TPlayObject.FindViewHum(PlayObject: TObject): TPlayObject;
var
i : Integer;
begin
Result := nil;
try
for i := 0 to m_VisibleHumanList.Count - 1 do
if PlayObject = TObject(m_VisibleHumanList[i]) then begin
Result := TPlayObject(m_VisibleHumanList[i]);
Break;
end;
except
end;
end;
//和组队玩家分配经验值
procedure TPlayObject.GainExp(dwExp: LongWord; dwMilitaryExp: LongWord; dwRepressDemonExp: LongWord);
var
i, n, sumlv : Integer;
PlayObject : TPlayObject;
nCheckCode : Integer;
resourcestring
sExceptionMsg = '[Exception] TPlayObject::GainExp(%s,checkcode=%d)';
const
bonus : array[0..GROUPMAX] of real = (1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2);
begin
try
nCheckCode := 0;
if m_GroupOwner <> nil then begin //组队经验分配
sumlv := 0;
n := 0;
nCheckCode := 1;
for i := 0 to m_GroupOwner.m_GroupMembers.Count - 1 do begin
PlayObject := TPlayObject(m_GroupOwner.m_GroupMembers.Objects[i]);
nCheckCode := 2;
if not PlayObject.m_boDeath and (m_PEnvir = PlayObject.m_PEnvir) and
(abs(m_nCurrX - PlayObject.m_nCurrX) <= 12) and (abs(m_nCurrX -
PlayObject.m_nCurrX) <= 12) then begin
sumlv := sumlv + PlayObject.m_Abil.level;
Inc(n);
end;
end;
nCheckCode := 3;
if (sumlv > 0) and (n > 1) then begin
nCheckCode := 31;
if n in [0..GROUPMAX] then begin
dwExp := Round(dwExp * bonus[n]);
dwMilitaryExp := Round(dwMilitaryExp * bonus[n]);
dwRepressDemonExp := Round(dwRepressDemonExp * bonus[n]);
end;
for i := 0 to m_GroupOwner.m_GroupMembers.Count - 1 do begin
PlayObject := TPlayObject(m_GroupOwner.m_GroupMembers.Objects[i]);
if not PlayObject.m_boDeath and (m_PEnvir = PlayObject.m_PEnvir) and
(abs(m_nCurrX - PlayObject.m_nCurrX) <= 12) and (abs(m_nCurrX -
PlayObject.m_nCurrX) <= 12) then begin
if g_Config.boHighLevelKillMonFixExp then begin //02/08 增加,在高等级经验不变时,把组队的经验平均分配
nCheckCode := 4;
PlayObject.WinExp(Round(dwExp / n), dwMilitaryExp, dwRepressDemonExp);
nCheckCode := 5;
if (m_MyGuild <> nil) and (PlayObject.m_MyGuild <> nil) then begin
if (TGuild(m_MyGuild).sGuildName = TGuild(PlayObject.m_MyGuild).sGuildName) then
TGuild(m_MyGuild).dwGuildExp := TGuild(m_MyGuild).dwGuildExp + Round(dwExp / n); //05.06 增加组队行会经验
end;
end else begin
nCheckCode := 6;
PlayObject.WinExp(Round(dwExp / sumlv * PlayObject.m_Abil.level), dwMilitaryExp, dwRepressDemonExp);
nCheckCode := 7;
if (m_MyGuild <> nil) and (PlayObject.m_MyGuild <> nil) then begin
if (TGuild(m_MyGuild).sGuildName = TGuild(PlayObject.m_MyGuild).sGuildName) then
TGuild(m_MyGuild).dwGuildExp := TGuild(m_MyGuild).dwGuildExp + Round(dwExp / sumlv * PlayObject.m_Abil.level); //05.06 增加组队行会经验
end;
end;
end;
end;
end else WinExp(dwExp, dwMilitaryExp, dwRepressDemonExp);
end else WinExp(dwExp, dwMilitaryExp, dwRepressDemonExp);
except
MainOutMessage(Format(sExceptionMsg, [m_sCharName, nCheckCode]));
end;
end;
procedure TPlayObject.GameTimeChanged;
begin
if m_nBright <> g_nGameTime then begin
m_nBright := g_nGameTime;
SendMsg(Self, RM_DAYCHANGING, 0, 0, 0, 0, '');
end;
end;
//取回交易的物品
procedure TPlayObject.GetBackDealItems; //004DD270
var
i : Integer;
begin
if m_DealItemList.Count > 0 then begin
for i := 0 to m_DealItemList.Count - 1 do begin
m_ItemList.Add(m_DealItemList.Items[i]);
end;
end;
m_DealItemList.Clear;
IncGold(m_nDealGolds);
Inc(m_nGameGold, m_nDealGameGolds);
m_nDealGolds := 0;
m_nDealGameGolds := 0;
m_boDealOK := False;
end;
procedure TPlayObject.GetBagUseItems(var btDc, btSc, btMc, btDura: byte);
var
i, ii : Integer;
DuraList : TList;
UserItem : pTUserItem;
StdItem : pTStdItem;
StdItem80 : TStdItem;
DelItemList : TStringList;
nDc, nSc, nMc, nDcMin, nDcMax, nScMin, nScMax, nMcMin, nMcMax, nDura,
nItemCount : Integer;
begin
nDcMin := 0;
nDcMax := 0;
nScMin := 0;
nScMax := 0;
nMcMin := 0;
nMcMax := 0;
nDura := 0;
nItemCount := 0;
DelItemList := nil;
DuraList := TList.Create;
for i := m_ItemList.Count - 1 downto 0 do begin
UserItem := m_ItemList.Items[i];
if UserEngine.GetStdItemName(UserItem.wIndex) = g_Config.sBlackStone then begin
DuraList.Add(Pointer(Round(UserItem.Dura / 1.0E3)));
if DelItemList = nil then DelItemList := TStringList.Create;
DelItemList.AddObject(g_Config.sBlackStone, TObject(UserItem.MakeIndex));
Dispose(UserItem);
m_ItemList.Delete(i);
end else begin
if IsUseItem(UserItem.wIndex) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
StdItem80 := StdItem^;
ItemUnit.GetItemAddValue(UserItem, StdItem80);
nDc := 0;
nSc := 0;
nMc := 0;
case StdItem80.StdMode of
19, 20, 21: begin //004A0421
nDc := HiWord(StdItem80.DC) + LoWord(StdItem80.DC);
nSc := HiWord(StdItem80.SC) + LoWord(StdItem80.SC);
nMc := HiWord(StdItem80.MC) + LoWord(StdItem80.MC);
end;
22, 23: begin //004A046E
nDc := HiWord(StdItem80.DC) + LoWord(StdItem80.DC);
nSc := HiWord(StdItem80.SC) + LoWord(StdItem80.SC);
nMc := HiWord(StdItem80.MC) + LoWord(StdItem80.MC);
end;
24, 26: begin
nDc := HiWord(StdItem80.DC) + LoWord(StdItem80.DC) + 1;
nSc := HiWord(StdItem80.SC) + LoWord(StdItem80.SC) + 1;
nMc := HiWord(StdItem80.MC) + LoWord(StdItem80.MC) + 1;
end;
end;
if nDcMin < nDc then begin
nDcMax := nDcMin;
nDcMin := nDc;
end else begin
if nDcMax < nDc then nDcMax := nDc;
end;
if nScMin < nSc then begin
nScMax := nScMin;
nScMin := nSc;
end else begin
if nScMax < nSc then nScMax := nSc;
end;
if nMcMin < nMc then begin
nMcMax := nMcMin;
nMcMin := nMc;
end else begin
if nMcMax < nMc then nMcMax := nMc;
end;
if DelItemList = nil then DelItemList := TStringList.Create;
DelItemList.AddObject(StdItem.Name, TObject(UserItem.MakeIndex));
//004A06DB
if StdItem.boGameLog = 1 then
AddGameDataLog('26' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
StdItem.Name + #9 +
IntToStr(UserItem.MakeIndex) + #9 +
'1' + #9 +
'0');
Dispose(UserItem);
m_ItemList.Delete(i);
end;
end;
end;
end; // for
for i := 0 to DuraList.Count - 1 do begin
for ii := DuraList.Count - 1 downto i + 1 do begin
if Integer(DuraList.Items[ii]) > Integer(DuraList.Items[ii - 1]) then
DuraList.Exchange(ii, ii - 1);
end; // for
end; // for
for i := 0 to DuraList.Count - 1 do begin
nDura := nDura + Integer(DuraList.Items[i]);
Inc(nItemCount);
if nItemCount >= 5 then Break;
end;
btDura := Round(_MIN(5, nItemCount) + _MIN(5, nItemCount) * ((nDura /
nItemCount) / 5.0));
btDc := nDcMin div 5 + nDcMax div 3;
btSc := nScMin div 5 + nScMax div 3;
btMc := nMcMin div 5 + nMcMax div 3;
if DelItemList <> nil then
SendMsg(Self, RM_SENDDELITEMLIST, 0, Integer(DelItemList), 0, 0, '');
if DuraList <> nil then DuraList.free;
end;
function TPlayObject.GeTBaseObjectInfo: string;
var
perm : Integer;
begin
if m_btPermissionGM > 10 then perm := 0 else perm := m_btPermissionGM;
Result := m_sCharName +
' 标识:' + IntToHex(Integer(Self), 2) +
' 权限等级: ' + IntToStr(perm) +
' 管理模式: ' + BoolToCStr(m_boAdminMode) +
' 隐身模式: ' + BoolToCStr(m_boObMode) +
' 无敌模式: ' + BoolToCStr(m_boSuperMan) +
' 地图:' + m_sMapName + '(' + m_PEnvir.m_sMapDesc + ')' +
' 座标:' + IntToStr(m_nCurrX) + ':' + IntToStr(m_nCurrY) +
' 等级:' + IntToStr(m_Abil.level) +
' 转生等级:' + IntToStr(m_btReLevel) +
' 经验:' + IntToStr(m_Abil.Exp) +
' 生命值: ' + IntToStr(m_WAbil.dwHP) + '-' + IntToStr(m_WAbil.dwMaxHP) +
' 魔法值: ' + IntToStr(m_WAbil.dwMP) + '-' + IntToStr(m_WAbil.dwMaxMP) +
' 攻击力: ' + IntToStr(loword(m_WAbil.DC)) + '-' +
IntToStr(hiword(m_WAbil.DC)) +
' 魔法力: ' + IntToStr(loword(m_WAbil.MC)) + '-' +
IntToStr(hiword(m_WAbil.MC)) +
' 道术: ' + IntToStr(loword(m_WAbil.SC)) + '-' +
IntToStr(hiword(m_WAbil.SC)) +
' 防御力: ' + IntToStr(loword(m_WAbil.AC)) + '-' +
IntToStr(hiword(m_WAbil.AC)) +
' 魔防力: ' + IntToStr(loword(m_WAbil.MAC)) + '-' +
IntToStr(hiword(m_WAbil.MAC)) +
' 命中:' + IntToStr(m_dwHitPoint) +
' 躲避:' + IntToStr(m_dwSpeedPoint) +
' 速度:' + IntToStr(m_nHitSpeed) +
' 仓库密码:' + m_sStoragePwd +
' 登录IP:' + m_sIPaddr + '(' + m_sIPLocal {GetIPLocal(m_sIPaddr)} + ')' +
' 登录帐号:' + m_sUserID +
' 登录时间:' + DateToChStr(m_dLogonTime, True) +
' 在线时长(分钟):' + IntToStr((GetTickCount - m_dwLogonTick) div 60000)
+
' 登录模式:' + IntToStr(m_nPayMent) +
' ' + g_Config.sGameGoldName + ':' + IntToStr(m_nGameGold) +
' ' + g_Config.sGamePointName + ':' + IntToStr(m_nGamePoint) +
' ' + g_Config.sPayMentPointName + ':' + IntToStr(m_nPayMentPoint) +
' 会员类型:' + IntToStr(m_nMemberType) +
' 会员等级:' + IntToStr(m_nMemberLevel) +
' 经验倍数:' + CurrToStr(m_nKillMonExpRate / 100) +
' 攻击倍数:' + CurrToStr(m_nPowerRate / 100) +
' 防御倍数:' + CurrToStr(m_nDefenceRate / 100) +
' 杀怪爆率:' + CurrToStr(m_nKillMonBurstRate / 100) +
' 声望值:' + IntToStr(m_wCreditPoint);
end;
//获取包裹中指定物品某属性的总和
function TPlayObject.GetItemValueSum(sItemName: string; sValName: string): Integer;
var
UserItem : pTUserItem;
i, nIdx, nValue : Integer;
sValue : string;
begin
Result := 0;
nIdx := UserEngine.GetStdItemIdx(sItemName);
if nIdx > 0 then begin
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[i];
if UserItem.wIndex = nIdx then begin
sValue := GetCheckItemValue(UserItem.MakeIndex, sValName);
if sValue <> '' then begin
nValue := Str_ToInt(sValue, 0);
Inc(Result, nValue);
end;
end;
end;
end;
end;
//获取包裹中指定物品指定属性在一定数值以上的物品总数
function TPlayObject.GetItemCountWithValue(sItemName: string; sValName: string; nValue: Integer): Integer;
var
UserItem : pTUserItem;
i, nIdx, nPoint : Integer;
sValue : string;
begin
Result := 0;
nIdx := UserEngine.GetStdItemIdx(sItemName);
if nIdx > 0 then begin
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[i];
if UserItem.wIndex = nIdx then begin
sValue := GetCheckItemValue(UserItem.MakeIndex, sValName);
if sValue <> '' then begin
nPoint := Str_ToInt(sValue, 0);
if nPoint >= nValue then Inc(Result);
end;
end;
end;
end;
end;
function TPlayObject.GetCheckItemValue(nMakeIndex: Integer; sName: string): string;
var
UserItem : pTUserItem;
i, p, n18 : Integer;
pStdItem, StdStone : pTStdItem;
StdItem : TStdItem;
s18, s19 : string;
boFind : Boolean;
tm : DWORD;
nExp : Int64;
nSoulExp : UInt64;
NPC : TNormNpc;
begin
Result := '';
if (nMakeIndex = 0) then Exit;
boFind := False;
if (nMakeIndex >= 0) and (nMakeIndex <= High(THumItems)) then begin
UserItem := @m_UseItems[nMakeIndex];
if (UserItem.wIndex <> 0) then begin
pStdItem := UserEngine.GetStdItem(UserItem.wIndex);
if pStdItem = nil then Exit;
StdItem := pStdItem^;
boFind := True;
end;
end else begin
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[i];
if UserItem.MakeIndex = nMakeIndex then begin
pStdItem := UserEngine.GetStdItem(UserItem.wIndex);
if pStdItem = nil then Exit;
StdItem := pStdItem^;
boFind := True;
Break;
end;
end;
if not boFind then for i := Low(THumItems) to High(THumItems) do begin
UserItem := @m_UseItems[i];
if (UserItem.wIndex <> 0) and (UserItem.MakeIndex = nMakeIndex) then begin
pStdItem := UserEngine.GetStdItem(UserItem.wIndex);
if pStdItem = nil then Exit;
StdItem := pStdItem^;
boFind := True;
Break;
end;
end;
if not boFind then for i := Low(TTigerItems) to High(TTigerItems) do begin
UserItem := @m_TorDDM.Tiger.Items[i];
if (UserItem.wIndex <> 0) and (UserItem.MakeIndex = nMakeIndex) then begin
pStdItem := UserEngine.GetStdItem(UserItem.wIndex);
if pStdItem = nil then Exit;
StdItem := pStdItem^;
boFind := True;
Break;
end;
end;
end;
if boFind then begin
ItemUnit.GetItemAddValue(UserItem, StdItem);
if sName = 'MAKEINDEX' then Result := IntToStr(UserItem.MakeIndex)
else if sName = 'IDX' then Result := IntToStr(UserItem.wIndex)
else if sName = 'NAME' then Result := StdItem.FilterName
else if sName = 'STDNAME' then Result := StdItem.Name
else if sName = 'STDMODE' then Result := IntToStr(StdItem.StdMode)
else if sName = 'SHAPE' then Result := IntToStr(StdItem.Shape)
else if sName = 'WEIGHT' then Result := IntToStr(StdItem.Weight)
else if sName = 'ANICOUNT' then Result := IntToStr(StdItem.AniCount)
else if sName = 'SOURCE' then Result := IntToStr(StdItem.Source)
else if sName = 'RESERVED' then Result := IntToStr(StdItem.Reserved)
else if sName = 'NEEDAMBIT' then Result := IntToStr(StdItem.NeedAmbit)
else if sName = 'LOOKS' then Result := IntToStr(StdItem.Looks)
else if sName = 'DURAMAX' then Result := IntToStr(UserItem.DuraMax)
else if sName = 'DURA' then Result := IntToStr(UserItem.Dura)
else if sName = 'AC' then Result := IntToStr(StdItem.AC)
else if sName = 'AC1' then Result := IntToStr(LoWord(StdItem.AC))
else if sName = 'AC2' then Result := IntToStr(HiWord(StdItem.AC))
else if sName = 'MAC' then Result := IntToStr(StdItem.MAC)
else if sName = 'MAC1' then Result := IntToStr(LoWord(StdItem.MAC))
else if sName = 'MAC2' then Result := IntToStr(HiWord(StdItem.MAC))
else if sName = 'DC' then Result := IntToStr(StdItem.DC)
else if sName = 'DC1' then Result := IntToStr(LoWord(StdItem.DC))
else if sName = 'DC2' then Result := IntToStr(HiWord(StdItem.DC))
else if sName = 'MC' then Result := IntToStr(StdItem.MC)
else if sName = 'MC1' then Result := IntToStr(LoWord(StdItem.MC))
else if sName = 'MC2' then Result := IntToStr(HiWord(StdItem.MC))
else if sName = 'SC' then Result := IntToStr(StdItem.SC)
else if sName = 'SC1' then Result := IntToStr(LoWord(StdItem.SC))
else if sName = 'SC2' then Result := IntToStr(HiWord(StdItem.SC))
else if sName = 'GC1' then Result := IntToStr(LoWord(StdItem.GC))
else if sName = 'GC2' then Result := IntToStr(HiWord(StdItem.GC))
else if sName = 'NEED' then Result := IntToStr(StdItem.Need)
else if sName = 'NEEDLEVEL' then Result := IntToStr(StdItem.NeedLevel)
else if sName = 'FEATURE' then Result := IntToStr(StdItem.Feature)
else if sName = 'NEEDRACE' then Result := IntToStr(StdItem.NeedRace)
else if sName = 'THUMP' then Result := IntToStr(StdItem.StdItemAdd.btThump)
else if sName = 'THUMP2' then Result := IntToStr(StdItem.StdItemAdd.btThump2)
else if sName = 'MAGICNICETY' then Result := IntToStr(StdItem.StdItemAdd.btMagicNicety)
else if sName = 'HEROIC' then Result := IntToStr(StdItem.StdItemAdd.wHeroic)
else if sName = 'MAXHOLE' then Result := IntToStr(StdItem.StdItemAdd.btHole)
else if sName = 'PRICE' then Result := IntToStr(StdItem.Price)
else if sName = 'STOCK' then Result := IntToStr(StdItem.Stock)
else if sName = 'CLIAN1ATTRIB' then Result := IntToStr(StdItem.StdItemAdd.btCLianAttrib[0])
else if sName = 'CLIAN1VAL' then Result := IntToStr(StdItem.StdItemAdd.dwCLianVal[0])
else if sName = 'CLIAN1VAL1' then Result := IntToStr(LoWord(StdItem.StdItemAdd.dwCLianVal[0]))
else if sName = 'CLIAN1VAL2' then Result := IntToStr(HiWord(StdItem.StdItemAdd.dwCLianVal[0]))
else if sName = 'CLIAN1EXP' then Result := IntToStr(StdItem.StdItemAdd.dwCLianExp[0])
else if sName = 'CLIAN2ATTRIB' then Result := IntToStr(StdItem.StdItemAdd.btCLianAttrib[1])
else if sName = 'CLIAN2VAL' then Result := IntToStr(StdItem.StdItemAdd.dwCLianVal[1])
else if sName = 'CLIAN2VAL1' then Result := IntToStr(LoWord(StdItem.StdItemAdd.dwCLianVal[1]))
else if sName = 'CLIAN2VAL2' then Result := IntToStr(HiWord(StdItem.StdItemAdd.dwCLianVal[1]))
else if sName = 'CLIAN2EXP' then Result := IntToStr(StdItem.StdItemAdd.dwCLianExp[1])
else if sName = 'CLIAN3ATTRIB' then Result := IntToStr(StdItem.StdItemAdd.btCLianAttrib[2])
else if sName = 'CLIAN3VAL' then Result := IntToStr(StdItem.StdItemAdd.dwCLianVal[2])
else if sName = 'CLIAN3VAL1' then Result := IntToStr(LoWord(StdItem.StdItemAdd.dwCLianVal[2]))
else if sName = 'CLIAN3VAL2' then Result := IntToStr(HiWord(StdItem.StdItemAdd.dwCLianVal[2]))
else if sName = 'CLIAN3EXP' then Result := IntToStr(StdItem.StdItemAdd.dwCLianExp[2])
else if sName = 'SEAL' then Result := IntToStr(_Lo(UserItem.btValue[13]))
else if sName = 'LONGLEVEL' then Result := IntToStr(UserItem.btItemExt[16] + 1)
else if sName = 'LONGCUREXP' then Result := UInt64ToStr(PUInt64(@UserItem.btItemExt[18])^)
else if sName = 'LONGALLEXP' then begin
nExp := PUInt64(@UserItem.btItemExt[18])^;
i := _MIN(UserItem.btItemExt[16], 200);
while i > 0 do begin
Dec(i);
Inc(nExp, g_Config.LongLevelUpExp[i]);
end;
Result := UInt64ToStr(nExp);
end else if Pos('VALUE', sName) = 1 then begin
ArrestStringEx(sName, '(', ')', s18);
p := Str_ToInt(s18, -1);
if (p in [0..19]) then
Result := IntToStr(UserItem.btValue[p])
else
Result := '0';
end else if Pos('CUSTOM', sName) = 1 then begin
ArrestStringEx(sName, '(', ')', s18);
p := Str_ToInt(s18, -1);
if (p in [100..119]) then
Result := IntToStr(UserItem.btExtra.btCustomValue[p - 100])
else
Result := '0';
end else if Pos('ITEMEXTEX', sName) = 1 then begin
if Pos('ITEMEXTEX(', sName) = 1 then
ArrestStringEx(sName, '(', ')', s18)
else
ArrestStringEx(sName, '[', ']', s18);
if g_FunctionNPC = nil then Exit;
s18 := g_FunctionNPC.GetPlayObjectInfo(TPlayObject(Self), s18);
p := Str_ToInt(s18, -1);
case p of
0..9: Result := IntToStr(UserItem.btExtra.Shield.sEx[p]);
147..148: Result := IntToStr(UserItem.btExtra.Shield.sEx[p - 137]);
end;
end else if Pos('ITEMEXT', sName) = 1 then begin
if Pos('ITEMEXT(', sName) = 1 then
ArrestStringEx(sName, '(', ')', s18)
else
ArrestStringEx(sName, '[', ']', s18);
if g_FunctionNPC = nil then Exit;
s18 := g_FunctionNPC.GetPlayObjectInfo(TPlayObject(Self), s18);
p := Str_ToInt(s18, -1);
case p of
21: Result := IntToStr(UserItem.DuraMax);
22: Result := IntToStr(MakeWord(UserItem.btItemExt[0], UserItem.btItemExt[1]));
23..38: Result := IntToStr(_Hi(UserItem.btItemExt[p - 23]));
39..54: Result := IntToStr(_Lo(UserItem.btItemExt[p - 39]));
55..70: Result := IntToStr(UserItem.btItemExt[p - 55]);
71: Result := IntToStr(MakeLong(MakeWord(UserItem.btValue[0], UserItem.btValue[1]), MakeWord(UserItem.btValue[2], UserItem.btValue[3])));
72: Result := IntToStr(MakeLong(MakeWord(UserItem.btItemExt[0], UserItem.btItemExt[1]), MakeWord(UserItem.btItemExt[2], UserItem.btItemExt[3])));
73..79: Result := '0';
80..92: Result := IntToStr(UserItem.btItemExt[p - 64]);
100: Result := IntToStr(UserItem.btItemExt[p - 71]);
101: Result := IntToStr(MakeLong(MakeWord(UserItem.btItemExt2[146], UserItem.btItemExt2[147]), MakeWord(UserItem.btItemExt2[148], UserItem.btItemExt2[149])));
120..149: Result := IntToStr(UserItem.btItemExt[p - 88]);
169: Result := IntToStr(PWORD(@UserItem.btItemExt[26])^);
170: Result := IntToStr(PDWORD(@UserItem.btItemExt[24])^);
216: Result := IntToStr(UserItem.btExtra.Shield.dwHP);
217..218: Result := IntToStr(UserItem.btExtra.Shield.btValue[p - 217]);
219: Result := IntToStr(UserItem.btExtra.Shield.wStrengHP);
220: Result := IntToStr(UserItem.btExtra.Shield.wStrengDC);
221: Result := IntToStr(UserItem.btExtra.Shield.wStrengAC);
222: Result := IntToStr(UserItem.btExtra.Shield.wStrengMAC);
223: Result := IntToStr(UserItem.btExtra.Shield.wAwaken);
224: Result := IntToStr(UserItem.btExtra.Shield.btValue[p - 221]);
225: Result := IntToStr(UserItem.btExtra.Shield.wAwakenVal1);
226: Result := IntToStr(UserItem.btExtra.Shield.wAwakenVal2);
227..228: Result := IntToStr(UserItem.btExtra.Shield.btValue[p - 223]);
229: Result := IntToStr(UserItem.btExtra.Shield.wDivineVal1);
230: Result := IntToStr(UserItem.btExtra.Shield.wDivineVal2);
231: Result := IntToStr(UserItem.btExtra.Shield.wNowExp);
232: Result := IntToStr(UserItem.btExtra.Shield.wMaxExp);
233: Result := IntToStr(UserItem.btExtra.Shield.nStrengGold);
234: Result := IntToStr(UserItem.btExtra.Shield.wStrengMaterial);
235: Result := IntToStr(UserItem.btExtra.Shield.nAwakenGold);
236: Result := IntToStr(UserItem.btExtra.Shield.wAwakenMaterial);
237: Result := IntToStr(UserItem.GetItemPunch(1));
238: Result := IntToStr(UserItem.GetItemPunch(2));
239: Result := IntToStr(UserItem.GetItemPunch(3));
240: Result := IntToStr(UserItem.btItemExt2[21]);
241: Result := IntToStr(UserItem.btExtra.Spirit[0].btLevel);
242: Result := IntToStr(UserItem.btExtra.Spirit[0].btPosition);
243: Result := IntToStr(UserItem.btExtra.Spirit[0].nValue1);
244: Result := IntToStr(UserItem.btExtra.Spirit[0].nValue2);
245: Result := IntToStr(UserItem.btExtra.Spirit[1].btLevel);
246: Result := IntToStr(UserItem.btExtra.Spirit[1].btPosition);
247: Result := IntToStr(UserItem.btExtra.Spirit[1].nValue1);
248: Result := IntToStr(UserItem.btExtra.Spirit[1].nValue2);
249: Result := IntToStr(UserItem.btExtra.Shield.wVampirePoint);
250: Result := IntToStr(PDWORD(@UserItem.btItemExt2[0])^);
251: Result := IntToStr(PDWORD(@UserItem.btItemExt2[4])^);
252: Result := IntToStr(PDWORD(@UserItem.btItemExt2[8])^);
253: Result := IntToStr(PDWORD(@UserItem.btItemExt2[12])^);
254: Result := IntToStr(PDWORD(@UserItem.btItemExt2[16])^);
255: Result := IntToStr(PDWORD(@UserItem.btItemExt2[20])^);
256: Result := IntToStr(PDWORD(@UserItem.btItemExt2[24])^);
257: Result := IntToStr(PDWORD(@UserItem.btItemExt2[58])^);
258: Result := IntToStr(PDWORD(@UserItem.btItemExt2[62])^);
267: Result := IntToStr(PDWORD(@UserItem.btItemExt[29])^);
268: begin
SetLength(s18, 15);
Move(UserItem^.btItemExt2[28], PChar(s18)^, 15);
Result := s18;
end;
269: begin
SetLength(s18, 15);
Move(UserItem^.btItemExt2[43], PChar(s18)^, 15);
Result := s18;
end;
270: begin
SetLength(s18, 15);
Move(UserItem^.btItemExt2[66], PChar(s18)^, 15);
Result := s18;
end;
271: begin
SetLength(s18, 15);
Move(UserItem^.btItemExt2[81], PChar(s18)^, 15);
Result := s18;
end;
274: Result := IntToStr(MakeLong(MakeWord(UserItem.btItemExt[0], UserItem.btItemExt[1]), MakeWord(UserItem.btItemExt[2], UserItem.btItemExt[3])));
275: Result := IntToStr(MakeLong(MakeWord(UserItem.btItemExt[4], UserItem.btItemExt[5]), MakeWord(UserItem.btItemExt[6], UserItem.btItemExt[7])));
end;
end else if sName = 'GLOOMPOINT' then
Result := IntToStr(MakeWord(UserItem.btItemExt[0], UserItem.btItemExt[1]))
else if Pos('LOGLOOM', sName) = 1 then begin
ArrestStringEx(sName, '(', ')', s18);
p := Str_ToInt(s18, -1);
if (p in [0..16]) then
Result := IntToStr(_Hi(UserItem.btItemExt[p]))
else
Result := '0';
end else if Pos('HIGLOOM', sName) = 1 then begin
ArrestStringEx(sName, '(', ')', s18);
p := Str_ToInt(s18, -1);
if (p in [0..16]) then
Result := IntToStr(_Lo(UserItem.btItemExt[p]))
else
Result := '0';
end else if sName = 'OVERLAP' then
Result := IntToStr(MakeLong(MakeWord(UserItem.btValue[0],
UserItem.btValue[1]), MakeWord(UserItem.btValue[2], UserItem.btValue[3])))
else if Pos('EVIL', sName) = 1 then begin
if UserItem.Evil.MakeIndex = 0 then Result := ''
else if sName = 'EVILNAME' then
Result := UserItem.Evil.sName
else if sName = 'EVILJOB' then
Result := IntToJob(UserItem.Evil.btJob)
else if sName = 'EVILAMBIT' then
Result := IntToStr(UserItem.Evil.btAmbit)
else if sName = 'EVILDC' then
Result := IntToStr(LoByte(UserItem.Evil.wDC))
else if sName = 'EVILDC2' then
Result := IntToStr(HiByte(UserItem.Evil.wDC))
else if sName = 'EVILMC' then
Result := IntToStr(LoByte(UserItem.Evil.wMC))
else if sName = 'EVILMC2' then
Result := IntToStr(HiByte(UserItem.Evil.wMC))
else if sName = 'EVILSC' then
Result := IntToStr(LoByte(UserItem.Evil.wSC))
else if sName = 'EVILSC2' then
Result := IntToStr(HiByte(UserItem.Evil.wSC))
else if sName = 'EVILAC' then
Result := IntToStr(LoByte(UserItem.Evil.wDC))
else if sName = 'EVILAC2' then
Result := IntToStr(HiByte(UserItem.Evil.wDC))
else if sName = 'EVILMAC' then
Result := IntToStr(LoByte(UserItem.Evil.wMC))
else if sName = 'EVILMAC2' then
Result := IntToStr(HiByte(UserItem.Evil.wMC))
else if sName = 'EVILPOWER' then
Result := IntToStr(UserItem.Evil.wPower)
end else if Pos('PET.', sName) = 1 then begin //灵兽石属性
if sName = 'PET.NAME' then
Result := UserItem.sExName
else if sName = 'PET.TYPE' then
Result := IntToStr(UserItem.btValue[8])
else if sName = 'PET.KIND' then Result := IntToStr(StdItem.AniCount)
else if sName = 'PET.LEVEL' then
Result := IntToStr(UserItem.wLevel)
else if sName = 'PET.TYPENAME' then begin
case UserItem.btValue[8] of
0: Result := '小灵兽';
1: Result := '灵兽1';
2: Result := '灵兽2';
3: Result := '灵兽3';
else
Result := '灵兽(未知)';
end;
end
else if sName = 'PET.EXP' then
Result := IntToStr(UserItem.dwExp)
else if sName = 'PET.MAXEXP' then begin
Result := IntToStr(GetPetUpExp(UserItem.btValue[9], UserItem.wLevel));
end
else if sName = 'PET.STATE' then begin
tm := MakeLong(MakeWord(UserItem.btValue[0], UserItem.btValue[1]), MakeWord(UserItem.btValue[2], UserItem.btValue[3]));
if tm = 0 then tm := DateTimeToWolTIme(Now);
n18 := DateTimeToWolTIme(Now) - tm;
n18 := n18 div 86400;
if n18 <= 2 then Result := '饱'
else if n18 = 3 then Result := '微饿'
else if n18 = 4 then Result := '饥饿'
else Result := '死亡';
end
else if sName = 'PET.EATTIME' then begin
tm := MakeLong(MakeWord(UserItem.btValue[0], UserItem.btValue[1]), MakeWord(UserItem.btValue[2], UserItem.btValue[3]));
if tm = 0 then tm := DateTimeToWolTIme(Now);
Result := IntToStr((DateTimeToWolTIme(Now) - tm) div 3600);
end else if sName = 'PET.RELIVE' then
Result := IntToStr(UserItem.btValue[9])
else if sName = 'PET.PILEEXP' then
Result := IntToStr(UserItem.dwTotalExp)
else if sName = 'PET.EVOLUTION' then
Result := IntToStr(UserItem.wEvoluTion)
else if sName = 'PET.APTITUDE' then
Result := IntToStr(UserItem.btAptiTude)
else if sName = 'PET.HP' then
Result := IntToStr(UserItem.wHP)
else if sName = 'PET.MP' then
Result := IntToStr(UserItem.wMP)
else if sName = 'PET.ANTIPOISON' then
Result := IntToStr(UserItem.btAntiPoison)
else if sName = 'PET.MAC1' then
Result := IntToStr(LoByte(UserItem.wMAC))
else if sName = 'PET.MAC2' then
Result := IntToStr(HiByte(UserItem.wMAC))
else if sName = 'PET.MAGICNICETY' then
Result := IntToStr(UserItem.btMagicNicety)
else if sName = 'PET.EVADET' then
Result := IntToStr(UserItem.btEvaDet)
else if sName = 'PET.AC1' then
Result := IntToStr(LoByte(UserItem.wAC))
else if sName = 'PET.AC2' then
Result := IntToStr(HiByte(UserItem.wAC))
else if sName = 'PET.ANTIMAGIC' then
Result := IntToStr(UserItem.btAntiMagic)
else if sName = 'PET.POISONNICETY' then
Result := IntToStr(UserItem.btPoisonNicety)
else if sName = 'PET.SAVVY' then
Result := IntToStr(UserItem.btSavvy)
else if sName = 'PET.FELEMENT1' then begin
case UserItem.btFelemEntType[0] of
0: Result := '金';
1: Result := '木';
2: Result := '土';
3: Result := '水';
end;
end else if sName = 'PET.FELEMENT2' then begin
case UserItem.btFelemEntType[1] of
0: Result := '火';
1: Result := '木';
2: Result := '土';
3: Result := '水';
end;
end else if sName = 'PET.FELEMENTPOINT1' then
Result := IntToStr(UserItem.btFelemEntPoint[0])
else if sName = 'PET.FELEMENTPOINT2' then
Result := IntToStr(UserItem.btFelemEntPoint[1])
else if sName = 'PET.MC1' then
Result := IntToStr(LoByte(UserItem.wMC))
else if sName = 'PET.MC2' then
Result := IntToStr(HiByte(UserItem.wMC))
else if sName = 'PET.SC1' then
Result := IntToStr(LoByte(UserItem.wSC))
else if sName = 'PET.SC2' then
Result := IntToStr(HiByte(UserItem.wSC))
else if sName = 'PET.DC1' then
Result := IntToStr(LoByte(UserItem.wDC))
else if sName = 'PET.DC2' then
Result := IntToStr(HiByte(UserItem.wDC))
else if sName = 'PET.NICETY' then
Result := IntToStr(UserItem.btHitNicety)
else if sName = 'PET.LUCK' then
Result := IntToStr(UserItem.btLuck)
else if sName = 'PET.SPEED' then
Result := IntToStr(UserItem.btRideSpeed)
else if sName = 'PET.GENDER' then
Result := IntToStr(UserItem.btItemExt[25]) //性别
else if sName = 'PET.PARALY' then
Result := IntToStr(UserItem.btItemExt[16])
else if sName = 'PET.THUMP' then
Result := IntToStr(UserItem.btItemExt[17])
else if sName = 'PET.AGAINST' then
Result := IntToStr(MakeWord(UserItem.btItemExt[18], UserItem.btItemExt[19]))
else if sName = 'PET.REDUCEAC' then
Result := IntToStr(UserItem.btItemExt[20])
else if sName = 'PET.REDUCEMAC' then
Result := IntToStr(UserItem.btItemExt[21])
else if sName = 'PET.REDUCEHITPOINT' then
Result := IntToStr(UserItem.btItemExt[22])
else if sName = 'PET.REDUCEANTIMAGIC' then
Result := IntToStr(UserItem.btItemExt[23])
else if sName = 'PET.SIRE' then
Result := IntToStr(UserItem.btItemExt[26])
else if sName = 'PET.SIREMAX' then
Result := IntToStr(UserItem.btItemExt[27])
else if sName = 'PET.BLOODPURE' then
Result := IntToStr(UserItem.btItemExt[28])
else if sName = 'PET.STRENG' then
Result := IntToStr(UserItem.btItemExt[30])
else if sName = 'PET.INSIGHTLEVEL' then
Result := IntToStr(UserItem.btExtra.btLevel)
else if sName = 'PET.QUALIFICATION' then
Result := IntToStr(UserItem.btExtra.btInsight)
else if sName = 'PET.INSIGHTEXP' then
Result := IntToStr(UserItem.btExtra.nExp)
else if sName = 'PET.INSIGHTMAXEXP' then
Result := IntToStr(UserItem.btExtra.nMaxExp)
else if sName = 'PET.NEXTQUALIFICATION' then
Result := IntToStr(UserItem.btExtra.btNext)
else if sName = 'PET.INSIGHTMAGICID(0)' then
Result := IntToStr(UserItem.btExtra.PetSkill[0].GetID)
else if sName = 'PET.INSIGHTMAGICID(1)' then
Result := IntToStr(UserItem.btExtra.PetSkill[1].GetID)
else if sName = 'PET.INSIGHTMAGICID(2)' then
Result := IntToStr(UserItem.btExtra.PetSkill[2].GetID)
else if sName = 'PET.INSIGHTMAGICID(3)' then
Result := IntToStr(UserItem.btExtra.PetSkill[3].GetID)
else if sName = 'PET.INSIGHTMAGICLEVEL(0)' then
Result := IntToStr(UserItem.btExtra.PetSkill[0].GetLv)
else if sName = 'PET.INSIGHTMAGICLEVEL(1)' then
Result := IntToStr(UserItem.btExtra.PetSkill[1].GetLv)
else if sName = 'PET.INSIGHTMAGICLEVEL(2)' then
Result := IntToStr(UserItem.btExtra.PetSkill[2].GetLv)
else if sName = 'PET.INSIGHTMAGICLEVEL(3)' then
Result := IntToStr(UserItem.btExtra.PetSkill[3].GetLv)
else if sName = 'PET.INSIGHTMAGICVALUE(0)' then
Result := IntToStr(UserItem.btExtra.PetSkill[0].GetValue)
else if sName = 'PET.INSIGHTMAGICVALUE(1)' then
Result := IntToStr(UserItem.btExtra.PetSkill[1].GetValue)
else if sName = 'PET.INSIGHTMAGICVALUE(2)' then
Result := IntToStr(UserItem.btExtra.PetSkill[2].GetValue)
else if sName = 'PET.INSIGHTMAGICVALUE(3)' then
Result := IntToStr(UserItem.btExtra.PetSkill[3].GetValue)
else
Result := '';
end else if Pos('OFFICERVALUE', sName) = 1 then begin //仙官装备属性
ArrestStringEx(sName, '(', ')', s18);
p := Str_ToInt(s18, -1);
if (p in [0..3]) then
Result := IntToStr(PWORD(@UserItem.btValue[p * 2])^)
else
Result := '0';
end else if Pos('GODITEM.', sName) = 1 then begin //神兵装备属性
if sName = 'GODITEM.NAME' then
Result := UserItem.God_Nmae
else if sName = 'GODITEM.HUMNAME' then
Result := UserItem.God_MainNmae
else if sName = 'GODITEM.MINDC' then
Result := IntToStr(UserItem.God_MinDC)
else if sName = 'GODITEM.MAXDC' then
Result := IntToStr(UserItem.God_MaxDC)
else if sName = 'GODITEM.REDUCEAC' then
Result := IntToStr(UserItem.God_ReduceAC)
else if sName = 'GODITEM.REDUCEMAC' then
Result := IntToStr(UserItem.God_ReduceMAC)
else if sName = 'GODITEM.USEVAL' then
Result := IntToStr(UserItem.God_UseVal)
else if sName = 'GODITEM.JOB' then
Result := IntToStr(UserItem.God_Job)
else if sName = 'GODITEM.RULER' then
Result := IntToStr(UserItem.God_Ruler)
else if sName = 'GODITEM.GOD' then
Result := IntToStr(Integer(UserItem.IsGod))
else if sName = 'GODITEM.SUITE' then begin
if StdItem.StdMode = 5 then begin
Result := IntToStr(UserItem.btItemExt[24])
end else if StdItem.StdMode in [10, 11] then begin
Result := IntToStr(UserItem.btItemExt[20])
end;
end else
Result := '';
end else if Pos('GEM', sName) = 1 then begin //装备镶嵌玉石的属性
Result := '0';
//s19 := ArrestStringEx(sName, '[', ']', s18);
if CheckBrackets(sName, s18) then begin
s19 := Copy(sName, Length('GEM().') + Length(s18) + 1, Length(sName));
if g_FunctionNPC <> nil then
s18 := g_FunctionNPC.GetPlayObjectInfo(Self, s18);
p := Str_ToInt(s18, -1);
if p in [1..5] then begin
Dec(p);
if s19 = 'HOLE' then begin
tm := UserItem.btItemExt[18 + (p * 2)] and $0F;
if tm in [0..1] then begin
if p = 0 then
Result := '1'
else
Result := IntToStr(tm);
end else if tm = 3 then
Result := '2'
else if tm = 7 then
Result := '3';
end else if s19 = 'LV' then
Result := IntToStr(UserItem.btItemExt[18 + (p * 2)] shr 4)
else if s19 = 'MAG' then
Result := IntToStr(UserItem.btItemExt[18 + (p * 2) + 1])
else
Result := '';
end;
end;
end else if Pos('JEWEL', sName) = 1 then begin //装备镶嵌玉石的属性
if CheckBrackets(sName, s18) then begin
s19 := Copy(sName, Length('JEWEL().') + Length(s18) + 1, Length(sName));
if g_FunctionNPC <> nil then
s18 := g_FunctionNPC.GetPlayObjectInfo(Self, s18);
p := Str_ToInt(s18, -1);
if p in [1..3] then begin
if s19 = 'SHAPE' then
Result := '0'
else if s19 = 'NAME' then Result := '';
if UserItem.GetItemPunch(p) = 0 then Exit;
StdStone := UserEngine.GetStdItem(UserItem.btExtra.ItemIndex[p - 1]);
if (StdStone = nil) or (StdStone.StdMode <> 141) then Exit;
if s19 = 'SHAPE' then
Result := IntToStr(StdStone^.Shape)
else if s19 = 'NAME' then
Result := StdStone^.Name;
end;
end;
end else if Pos('HOLECOUNT', sName) = 1 then begin //装备镶嵌玉石的属性
p := 1;
for i := 0 to 4 do
if UserItem.btItemExt[18 + (p * 2)] > 0 then
Inc(p);
Result := IntToStr(p);
end else if Pos('GOODITEMTYPE', sName) = 1 then begin
ArrestStringEx(sName, '(', ')', s18);
p := Str_ToInt(s18, -1);
if p in [1..3] then begin
case p of
1: Result := IntToStr(UserItem.btItemExt[20] div 16);
2: Result := IntToStr(UserItem.btItemExt[30] div 16);
3: Result := IntToStr(UserItem.btItemExt[31] div 16);
end;
end;
end else if Pos('GOODITEMVALUE', sName) = 1 then begin
ArrestStringEx(sName, '(', ')', s18);
p := Str_ToInt(s18, -1);
if p in [1..3] then begin
case p of
1: begin
n18 := UserItem.btItemExt[20] div 16;
Result := IntToStr(UserItem.btItemExt[20] - (n18 * 16));
end;
2: begin
n18 := UserItem.btItemExt[30] div 16;
Result := IntToStr(UserItem.btItemExt[30] - (n18 * 16));
end;
3: begin
n18 := UserItem.btItemExt[31] div 16;
Result := IntToStr(UserItem.btItemExt[31] - (n18 * 16));
end;
end;
end;
end else if Pos('SOULBEAD', sName) = 1 then begin
if sName = 'SOULBEADLEVEL' then begin
Result := IntToStr(UserItem.btValue[12]);
end else if sName = 'SOULBEADHP' then begin
Result := IntToStr(PWORD(@UserItem.btValue[6])^);
end else if sName = 'SOULBEADCUREXP' then begin
Result := UInt64ToStr(PINT64(@UserItem.btItemExt[44])^);
end else if sName = 'SOULBEADMAXEXP' then begin
if StdItem.AniCount = 0 then
nSoulExp := g_Config.SoulBead0[StdItem.Price]
else
nSoulExp := g_Config.SoulBead1[StdItem.Price];
Result := UInt64ToStr(nSoulExp);
end;
end else if sName = 'CUSTOMNAME' then begin
ItemUnit.GetCustomItemName(UserItem, s19);
Result := s19;
end;
end;
end;
function TPlayObject.GetDigUpMsgCount: Integer;
var
i : Integer;
SendMessage : pTSendMessage;
begin
Result := 0;
try
EnterCriticalSection(ProcessMsgCriticalSection);
for i := 0 to m_MsgList.Count - 1 do begin
SendMessage := m_MsgList.Items[i];
if (SendMessage.wIdent = CM_BUTCH) then begin
Inc(Result);
end;
end;
finally
LeaveCriticalSection(ProcessMsgCriticalSection);
end;
end;
function TPlayObject.GetExploit(PlayObject: TBaseObject): Boolean;
var
nMaxExp : integer;
btLevel : Byte;
begin
Result := False;
btLevel := PlayObject.m_MilitaryInfo.nLevel;
nMaxExp := g_Config.MilitaryRank[btLevel].nNextLevelExp;
if (PlayObject.m_MilitaryInfo.nExp >= nMaxExp) then begin
Result := True;
while True do begin
btLevel := PlayObject.m_MilitaryInfo.nLevel;
nMaxExp := g_Config.MilitaryRank[btLevel].nNextLevelExp;
if (PlayObject.m_MilitaryInfo.nExp >= nMaxExp) and (nMaxExp > 0) and (btLevel < 81) then begin
if (btLevel mod 9 <> 0) or (g_Config.MilitaryRank[btLevel].boAutoLevelUp) then begin
Dec(PlayObject.m_MilitaryInfo.nExp, nMaxExp);
Inc(PlayObject.m_MilitaryInfo.nLevel);
end;
end else
Break;
end;
end;
end;
function TPlayObject.GetWingExp(): Boolean;
var
nMaxExp : integer;
btLevel : Byte;
begin
Result := False;
btLevel := m_HumWingInfo.nLevel;
nMaxExp := g_Config.RepressDemonWings.LevelData[btLevel].NextLevelExp;
if (m_HumWingInfo.nExp >= nMaxExp) then begin
Result := True;
while True do begin
btLevel := m_HumWingInfo.nLevel;
nMaxExp := g_Config.RepressDemonWings.LevelData[btLevel].NextLevelExp;
if (m_HumWingInfo.nExp >= nMaxExp) and (nMaxExp > 0) and (btLevel < 50) then begin
if g_Config.RepressDemonWings.LevelData[btLevel].AutoLevelUp then begin
Dec(m_HumWingInfo.nExp, nMaxExp);
Inc(m_HumWingInfo.nLevel);
end else begin
m_HumWingInfo.nExp := nMaxExp;
Break;
end;
end else
Break;
end;
end;
if m_HumWingInfo.btWear > 99 then
m_HumWingInfo.btWingLook := m_HumWingInfo.btWear
else
m_HumWingInfo.btWingLook := g_Config.RepressDemonWings.LevelData[m_HumWingInfo.nLevel].Wing_Look;
end;
function TPlayObject.GetBeadExp(): Boolean;
var
nMaxExp : integer;
btLevel : Byte;
begin
Result := False;
btLevel := m_RepressDemon.nLevel;
nMaxExp := g_Config.RepressDemon[btLevel].nNextLevelExp;
if (m_RepressDemon.nExp >= nMaxExp) then begin
Result := True;
while True do begin
btLevel := m_RepressDemon.nLevel;
nMaxExp := g_Config.RepressDemon[btLevel].nNextLevelExp;
if (m_RepressDemon.nExp >= nMaxExp) and (nMaxExp > 0) and (btLevel < 60) then begin
Dec(m_RepressDemon.nExp, nMaxExp);
Inc(m_RepressDemon.nLevel);
end else
Break;
end;
end;
end;
//人物经验值增长
procedure TPlayObject.GetExp(nExp: UInt64; nMilitaryExp: UInt64; nRepressDemon: UInt64; bScritpExp: Boolean = False; boShareMilitaryExp: Boolean = False; boShareRepressDemon: Boolean = False);
var
nShareExp1, nShareExp2, nShareExp3 : UInt64;
begin
nShareExp1 := 0;
nShareExp2 := 0;
nShareExp3 := 0;
if m_boPneuma then begin //是元神
if m_PneumaObject <> nil then begin //元神主人 <> nil
nShareExp1 := _Max(0, nExp div 3);
if (not boShareMilitaryExp) and (bScritpExp) then //判断脚本是否分享给元神
nShareExp2 := nMilitaryExp
else
nShareExp2 := _Max(0, nMilitaryExp div 3); //判断脚本是否分享给元神
if (not boShareRepressDemon) and (bScritpExp) or ((m_PneumaObject as TPlayObject).m_RepressDemon.nLevel = 0) then
nShareExp3 := nRepressDemon
else
nShareExp3 := _Max(0, nRepressDemon div 3);
GetExpProc(nShareExp1, nShareExp2, nShareExp3, bScritpExp); //元神 1/3
(m_PneumaObject as TPlayObject).GetExpProc(_Max(0, nExp - nShareExp1), _MAX(0, nMilitaryExp - nShareExp2), _MAX(0, nRepressDemon - nShareExp3), bScritpExp);
//主任 2/3
end;
end else begin //是人物
if (m_btJob = 3) then
nExp := GetYaoDanShareExp(nExp);
if (m_PneumaObject <> nil) and (not m_boPneumaEffMode) then begin //元神在线
nShareExp1 := _Max(0, nExp div 3);
nShareExp2 := _Max(0, nMilitaryExp div 3);
if ((m_PneumaObject as TPlayObject).m_RepressDemon.nLevel > 0) and (boShareRepressDemon) then
nShareExp3 := _Max(0, nRepressDemon div 3);
nExp := _Max(0, nExp - nShareExp1);
nMilitaryExp := _Max(0, nMilitaryExp - nShareExp2);
if ((m_PneumaObject as TPlayObject).m_RepressDemon.nLevel > 0) and (boShareRepressDemon) then
nRepressDemon := _Max(0, nRepressDemon - nShareExp3);
(m_PneumaObject as TPlayObject).GetExpProc(nShareExp1, nShareExp2, nShareExp3, bScritpExp);
GetExpProc(nExp, nMilitaryExp, nRepressDemon, bScritpExp);
end else //元神不在线或没元神
GetExpProc(nExp, nMilitaryExp, nRepressDemon, bScritpExp);
end;
end;
procedure TPlayObject.GetExpProc(nGetExp: UInt64; nGetMilitaryExp: UInt64; nGetRepressDemonExp: UInt64; bScritpExp: Boolean = False);
var
n14, nCode, nType : Integer;
nInt : UInt64;
nSoulExp, nNewSoulExp, nSoulMaxExp : UInt64;
nMaxExp, nAccrued : Integer;
UserItem : pTUserItem;
StdItem : pTStdItem;
boRecalc, boLevelUp : Boolean;
RefExpPacket : TRefExpPacket;
boReachMaxLevel : Boolean;
boReachLevelLimitExp : Boolean;
resourcestring
sSoulExpMsg = '在%s的作用下,额外增加了%d经验';
sTimeBackExpMsg = '%s增加%d点经验(穿戴真魂珠后,主体不增加经验)';
begin
if m_PEnvir = nil then Exit;
//检测是否到达最高等级,限制等级后经验槽达100%满
if (g_Config.nLimitLevel = m_Abil.level) and ((m_Abil.Exp + nGetExp) >= m_Abil.MaxExp) then begin
if m_Abil.Exp < m_Abil.MaxExp then begin
//向客户端发送经验
RefExpPacket.nExp := m_Abil.Exp;
RefExpPacket.nInc := m_Abil.MaxExp - m_Abil.Exp;
SendMsg(Self, RM_WINEXP, 0, m_Abil.MaxExp - m_Abil.Exp, 0, 0, EnCodeBuffer(@RefExpPacket, SizeOf(TRefExpPacket)));
m_Abil.Exp := m_Abil.MaxExp;
end;
Exit;
end;
//功勋值触发
if (nGetMilitaryExp > 0) and (g_Config.boMagicCityServer) and (m_MilitaryInfo.nLevel > 0) then begin
Inc(m_MilitaryInfo.nExp, nGetMilitaryExp);
m_sScriptParam[23] := UInt64ToStr(nGetMilitaryExp);
m_sScriptParam[24] := BoolToIntStr(bScritpExp);
m_sScriptParam[25] := BoolToIntStr(GetExploit(TBaseObject(Self)));
ExecuteScript(g_ManageNPC, '@GetMilitaryExpFucn');
SysMsg(Format('%d功勋值增加', [nGetMilitaryExp]), c_Red, t_Hint);
end;
//镇魔珠经验触发
{$IF DEMONSERVER = 1}
if (nGetRepressDemonExp > 0) and (m_RepressDemon.nLevel > 0) then begin
Inc(m_RepressDemon.nExp, nGetRepressDemonExp);
m_sScriptParam[23] := UInt64ToStr(nGetRepressDemonExp);
m_sScriptParam[24] := BoolToIntStr(bScritpExp);
m_sScriptParam[25] := BoolToIntStr(GetBeadExp());
ExecuteScript(g_ManageNPC, '@GetRepressDemonExpFucn');
SysMsg(Format('镇魔珠增加%d经验', [nGetRepressDemonExp]), c_Red, t_Hint);
end;
{$IFEND}
if nGetExp = 0 then Exit;
if (not bScritpExp) then begin
UserItem := @m_UseItems[U_SOULBEAD]; //魂珠
if (UserItem.wIndex > 0) and (UserItem.btValue[11] = 0) and (UserItem.btValue[15] > 0) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
nSoulExp := (nGetExp * UserItem.btValue[15]) div 100; //整除
if (nSoulExp > 0) then begin
Inc(nGetExp, nSoulExp);
SysMsg(Format(sSoulExpMsg, [StdItem.FilterName, nSoulExp]), c_Red, t_Hint);
end;
end;
end;
end;
if (not g_Config.boClassicServer) then //Script 2016.07.01 时光区魂珠
begin
if {(not bScritpExp) and }(nGetExp > 0) then begin
UserItem := @m_UseItems[U_SOULBEAD];
if (UserItem.wIndex > 0) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem.StdMode = 99 then begin
if StdItem.AniCount = 0 then
nSoulMaxExp := g_Config.SoulBead0[UserItem.btValue[12]]
else
nSoulMaxExp := g_Config.SoulBead1[UserItem.btValue[12]];
if (nGetExp > 0) then begin
if g_Config.boWearSoulBeadPlayerExp then
begin
nSoulExp := PINT64(@UserItem.btItemExt[44])^;
nNewSoulExp := nGetExp + nSoulExp;
if nNewSoulExp >= nSoulMaxExp then begin
nGetExp := _MAX(0, nNewSoulExp - nSoulMaxExp);
nSoulExp := nSoulMaxExp;
PINT64(@UserItem.btItemExt[44])^ := nSoulExp;
end else begin
nSoulExp := nGetExp;
nGetExp := 0;
PINT64(@UserItem.btItemExt[44])^ := PINT64(@UserItem.btItemExt[44])^ + nSoulExp;
SysMsg(Format(sTimeBackExpMsg, [StdItem.FilterName, nSoulExp]), c_Red, t_Hint);
end;
SendUpdateItem(UserItem);
if (nGetExp < 1) then Exit;
end else begin
nSoulExp := PINT64(@UserItem.btItemExt[44])^;
nNewSoulExp := nGetExp + nSoulExp;
if nNewSoulExp >= nSoulMaxExp then begin
PINT64(@UserItem.btItemExt[44])^ := nSoulExp;
end else begin
PINT64(@UserItem.btItemExt[44])^ := PINT64(@UserItem.btItemExt[44])^ + nGetExp;
end;
SendUpdateItem(UserItem);
end;
end;
end;
end
end;
end;
boLevelUp := False;
//检查是否达到最高等级
boReachMaxLevel := False;
if g_Config.boHighLevelLimitExp then begin
if m_btAmbitKind in [7, 8] then begin //上仙 以是最高级
if (m_btAmbitLevel >= g_Config.nHighAmbitLevelLimit3) then begin
boReachMaxLevel := True;
end;
end;
end else begin
if (m_Abil.level >= g_Config.nLimitLevel) then begin
boReachMaxLevel := True;
end;
end;
boReachLevelLimitExp := (boReachMaxLevel) and (m_Abil.Exp >= m_Abil.MaxExp);
m_sScriptParam[20] := UInt64ToStr(nGetExp);
m_sScriptParam[21] := BoolToIntStr(bScritpExp);
m_sScriptParam[22] := BoolToIntStr(boReachLevelLimitExp);
ExecuteScript(g_ManageNPC, '@GetExpFucn');
if UInt64ToStr(nGetExp) <> m_sScriptParam[20] then nGetExp := Str_ToInt(m_sScriptParam[20], 0);
if (not m_boPneuma) then begin
SendUpdateDelayMsg(Self, RM_REFRESHRANK, 0, 0, 0, 0, '', 200);
end else begin
SendUpdateDelayMsg(Self, RM_REFRESHRANK, 0, 1, 0, 0, '', 200);
end;
//龙纹钢吸取经验
if (not m_boPneuma) and (nGetExp > 0) then begin
if boReachLevelLimitExp then
nGetExp := nGetExp * 2;
if (m_nGatherExp + nGetExp) > MAX_ULONG64 then
nInt := MAX_ULONG64 - m_nGatherExp
else
nInt := nGetExp;
Inc(m_nGatherExp, nInt);
end;
if boReachLevelLimitExp then nGetExp := 1;
if (not bScritpExp) and m_PEnvir.m_MapFlag.boLayupExp then begin
n14 := m_PEnvir.m_MapFlag.nLayupExp;
if (n14 >= 300) and (n14 <= 399) then begin
Dec(n14, 300);
if (m_nMval[n14] + nGetExp) > MAX_ULONG64 then
nInt := MAX_ULONG64 - m_nMval[n14]
else
nInt := nGetExp;
m_nMval[n14] := m_nMval[n14] + nInt;
end;
end else begin
Inc(m_Abil.Exp, nGetExp);
if not boReachMaxLevel then begin
boRecalc := False;
if m_Abil.Exp >= m_Abil.MaxExp then begin
Dec(m_Abil.Exp, m_Abil.MaxExp);
if g_Config.boHighLevelLimitExp then begin
//升级增加天人重数
if m_btAmbitKind > 2 then begin
boRecalc := True;
boLevelUp := True;
case m_btAmbitKind of
3, 4: begin //天人
if (m_btAmbitLevel < g_Config.nHighAmbitLevelLimit1) then begin
Inc(m_btAmbitLevel);
end else if g_Config.boAutoUpAmbitKind2 then begin
Inc(m_btAmbitKind, 2);
m_btAmbitLevel := 1;
end;
end;
5, 6: begin //天仙
if (m_btAmbitLevel < g_Config.nHighAmbitLevelLimit2) then begin
Inc(m_btAmbitLevel);
end else if g_Config.boAutoUpAmbitKind3 then begin
Inc(m_btAmbitKind, 2);
m_btAmbitLevel := 1;
end;
end;
7, 8: begin //上仙
if (m_btAmbitLevel < g_Config.nHighAmbitLevelLimit3) then begin
Inc(m_btAmbitLevel);
end else begin
boLevelUp := False;
end;
end;
end;
end;
//等级同时提升
if m_Abil.level < g_Config.nLimitLevel then begin
Inc(m_Abil.level);
boLevelUp := True;
end;
if g_Config.boAutoUpAmbitKind1 and (m_Abil.level >= g_Config.nAutoUpAmbitLevel) and (m_btAmbitKind < 3) then begin
if Random(10) < 5 then m_btAmbitKind := 3 else m_btAmbitKind := 4;
m_btAmbitLevel := (m_Abil.level - g_Config.nAutoUpAmbitLevel) + 1;
boRecalc := True;
boLevelUp := True;
end;
end else begin
if m_Abil.level < MAXUPLEVEL then begin
Inc(m_Abil.level);
boLevelUp := True;
end;
end;
if boLevelUp then begin
HasLevelUp(m_Abil.level - 1);
AddBodyLuck(100);
IncHealthSpell(2000, 2000);
m_WAbil.wElementForce := m_WAbil.wElementForceMax;
AddGameDataLog('12' + #9 +
m_sMapName + #9 +
IntToStr(m_Abil.level) + #9 +
IntToStr(m_Abil.Exp) + #9 +
m_sCharName + #9 +
'0' + #9 +
'0' + #9 +
'1' + #9 +
'0');
// m_BattleVal.nMinVal[0] := m_Abil.Level;
m_BattleVal.BattleVal := m_BattleVal.nMinVal[0] + m_BattleVal.nMinVal[1] +
m_BattleVal.nMinVal[2] + m_BattleVal.nMinVal[3] + m_BattleVal.nMinVal[4];
SendDefMessage(SM_BATTLEVAL, Integer(Self), m_BattleVal.BattleVal, 0, 0,
EnCodeBuffer(@m_BattleVal, SizeOf(TBattleData)), True);
nCode := 0;
nType := 0;
if not g_Config.boClassicServer then begin //修为系统
if g_Config.boClientRedPacket then
nCode := nCode + 32;
if g_Config.boClientPreferential then
nType := 8;
if g_Config.boClientBackUserExp then
nType := nType + 1;
SendDefMessage(SM_816, nType, 0, MakeWord(15, nCode), 0, '');
end else begin
SendDefMessage(SM_816, 0, 1, 15, 0, '');
end;
if (m_PEnvir.m_MapFlag.sLevelUpGotoLabel <> '') then
ExecuteScript(g_ManageNPC, m_PEnvir.m_MapFlag.sLevelUpGotoLabel);
ExecuteScript(g_FunctionNPC, '@升级触发');
end;
if boRecalc then begin
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
FeatureChanged;
end;
end;
end;
//向客户端发送经验
RefExpPacket.nExp := m_Abil.Exp;
RefExpPacket.nInc := nGetExp;
AddBodyLuck(nGetExp * 0.002);
SendMsg(Self, RM_WINEXP, 0, nGetExp, 0, 0, EnCodeBuffer(@RefExpPacket, SizeOf(TRefExpPacket)));
end;
end;
function TPlayObject.GetHitMsgCount: Integer;
var
i : Integer;
SendMessage : pTSendMessage;
begin
Result := 0;
try
EnterCriticalSection(ProcessMsgCriticalSection);
for i := 0 to m_MsgList.Count - 1 do begin
SendMessage := m_MsgList.Items[i];
if (SendMessage.wIdent = CM_HIT) or
(SendMessage.wIdent = CM_HEAVYHIT) or
(SendMessage.wIdent = CM_BIGHIT) or
(SendMessage.wIdent = CM_POWERHIT) or
(SendMessage.wIdent = CM_LONGHIT) or
(SendMessage.wIdent = CM_WIDEHIT) or
(SendMessage.wIdent = CM_FIREHIT) then begin
Inc(Result);
end;
end;
finally
LeaveCriticalSection(ProcessMsgCriticalSection);
end;
end;
function TPlayObject.GetMyInfo: string;
var
sMyInfo : string;
begin
sMyInfo := g_sMyInfo;
sMyInfo := AnsiReplaceText(sMyInfo, '%name', m_sCharName);
sMyInfo := AnsiReplaceText(sMyInfo, '%map', m_PEnvir.m_sMapDesc);
sMyInfo := AnsiReplaceText(sMyInfo, '%x', IntToStr(m_nCurrX));
sMyInfo := AnsiReplaceText(sMyInfo, '%y', IntToStr(m_nCurrY));
sMyInfo := AnsiReplaceText(sMyInfo, '%level', IntToStr(m_Abil.level));
sMyInfo := AnsiReplaceText(sMyInfo, '%gold', IntToStr(m_nGold));
sMyInfo := AnsiReplaceText(sMyInfo, '%pk', IntToStr(m_nPkPoint));
sMyInfo := AnsiReplaceText(sMyInfo, '%minhp', IntToStr(m_WAbil.dwHP));
sMyInfo := AnsiReplaceText(sMyInfo, '%maxhp', IntToStr(m_WAbil.dwMaxHP));
sMyInfo := AnsiReplaceText(sMyInfo, '%minmp', IntToStr(m_WAbil.dwMP));
sMyInfo := AnsiReplaceText(sMyInfo, '%maxmp', IntToStr(m_WAbil.dwMaxMP));
sMyInfo := AnsiReplaceText(sMyInfo, '%mindc', IntToStr(loword(m_WAbil.DC)));
sMyInfo := AnsiReplaceText(sMyInfo, '%maxdc', IntToStr(hiword(m_WAbil.DC)));
sMyInfo := AnsiReplaceText(sMyInfo, '%minmc', IntToStr(loword(m_WAbil.MC)));
sMyInfo := AnsiReplaceText(sMyInfo, '%maxmc', IntToStr(hiword(m_WAbil.MC)));
sMyInfo := AnsiReplaceText(sMyInfo, '%minsc', IntToStr(loword(m_WAbil.SC)));
sMyInfo := AnsiReplaceText(sMyInfo, '%maxsc', IntToStr(hiword(m_WAbil.SC)));
sMyInfo := AnsiReplaceText(sMyInfo, '%logontime',
DateToChStr(m_dLogonTime, True));
sMyInfo := AnsiReplaceText(sMyInfo, '%logonlong', IntToStr((GetTickCount -
m_dwLogonTick) div 60000));
Result := sMyInfo;
end;
function TPlayObject.GetMyStatus: Integer; //708
begin
Result := m_nHungerStatus div 1000; //饥饿点
if Result > 4 then Result := 4;
end;
//获得当前人物所在地图位置的玩家数
function TPlayObject.GetRangeHumanCount: Integer;
begin
Result := UserEngine.GetMapOfRangeHumanCount(m_PEnvir, m_nCurrX, m_nCurrY, 10);
end;
function TPlayObject.GetRunMsgCount: Integer;
var
i : Integer;
SendMessage : pTSendMessage;
begin
Result := 0;
try
EnterCriticalSection(ProcessMsgCriticalSection);
for i := 0 to m_MsgList.Count - 1 do begin
SendMessage := m_MsgList.Items[i];
if (SendMessage.wIdent = CM_RUN) then begin
Inc(Result);
end;
end;
finally
LeaveCriticalSection(ProcessMsgCriticalSection);
end;
end;
//取得当前脚本可以跳转的标签
procedure TPlayObject.GetScriptLabel(sMsg: string; boLeft: Boolean);
var
sText : string;
sData : string;
sCmdStr, sLabel : string;
i : Integer;
begin
if boLeft then
m_CanJmpScriptLableList2.Clear
else
m_CanJmpScriptLableList.Clear;
while (True) do begin
if sMsg = '' then Break;
sMsg := GetValidStr3(sMsg, sText, ['\']);
if sText <> '' then begin
sData := '';
while (sText <> '') and (Pos('<', sText) > 0) and (Pos('>', sText) > 0) do begin //0419
if sText[1] <> '<' then begin
sText := '<' + GetValidStr3(sText, sData, ['<']);
end;
sText := ArrestStringEx(sText, '<', '>', sCmdStr);
if (sCmdStr <> '') and (TagCount(sCmdStr, '/') >= 1) then begin
//sLabel := GetValidStr3(sCmdStr, sCmdStr, ['/']);
i := 1;
GetToken(sCmdStr, '/', i);
sLabel := GetToken(sCmdStr, '/', i);
if sLabel <> '' then begin
if boLeft then
m_CanJmpScriptLableList2.Add(sLabel)
else
m_CanJmpScriptLableList.Add(sLabel);
end;
end;
end;
end;
end;
end;
function TPlayObject.GetShowName: string;
var
i : Integer;
sShowName : string;
sCharName : string;
sGuildName : string;
sDearName : string;
sMasterName : string;
Castle : TUserCastle;
resourcestring
sExceptionMsg = '[Exception] TPlayObject::GetShowName';
sIsYS = '的元神)';
begin
try
sCharName := '';
sGuildName := '';
sDearName := '';
sMasterName := '';
if m_MyGuild <> nil then begin
Castle := g_CastleManager.IsCastleMember(Self);
if (m_wPersonalCode and 4 = 0) then begin
if (Castle <> nil) then begin
sGuildName := AnsiReplaceText(g_sCastleGuildName, '%castlename', Castle.m_sName);
sGuildName := AnsiReplaceText(sGuildName, '%guildname', TGuild(m_MyGuild).sGuildName);
sGuildName := AnsiReplaceText(sGuildName, '%rankname', m_sGuildRankName);
end else begin
Castle := g_CastleManager.InCastleWarArea(Self);
if g_Config.boShowGuildName or (((Castle <> nil) and Castle.m_boUnderWar) or m_boInFreePKArea) then begin
sGuildName := AnsiReplaceText(g_sNoCastleGuildName, '%guildname', TGuild(m_MyGuild).sGuildName);
sGuildName := AnsiReplaceText(sGuildName, '%rankname', m_sGuildRankName);
end;
end;
end;
end;
if not g_Config.boShowRankLevelName then begin
if m_btReLevel > 0 then begin
case m_btJob of
0: sCharName := AnsiReplaceText(g_sWarrReNewName, '%chrname', m_sCharName);
1: sCharName := AnsiReplaceText(g_sWizardReNewName, '%chrname', m_sCharName);
2: sCharName := AnsiReplaceText(g_sTaosReNewName, '%chrname', m_sCharName);
3: sCharName := AnsiReplaceText(g_sGoblinReNewName, '%chrname', m_sCharName);
end;
end else begin
sCharName := m_sCharName;
end;
end else begin
sCharName := Format(m_sRankLevelName, [m_sCharName]);
end;
{$IF COUNTRYSYSTEM = 1}
if not m_boPneuma and (m_btCountry > 0) and (m_sOffName <> '') then begin //官职名称,元神不给予官职
if GetCountryInfo(m_btCountry).sKing = m_sCharName then
sCharName := sCharName + '\[' + GetCountryInfo(m_btCountry).sName + '-国王]'
else
sCharName := sCharName + '\[' + GetCountryInfo(m_btCountry).sName + '-' + m_sOffName + ']';
end;
{$IFEND}
if m_boMaster and g_Config.boShowPrenticeName then begin
for i := 1 to 3 do begin
if m_sMasterName[i] <> '' then begin
sMasterName := sMasterName + '\' + Format(g_sMasterName, [m_sMasterName[i]]);
Break;
end;
end;
end else if (m_sMasterName[1] <> '') and (g_Config.boShowMasterName) then begin
sMasterName := Format(g_sNoMasterName, [m_sMasterName[1]]);
end;
if (m_wPersonalCode and 1 = 0) then begin
if m_sDearName <> '' then begin
if m_btGender = 0 then begin
sDearName := Format(g_sManDearName, [m_sDearName]);
end else begin
sDearName := Format(g_sWoManDearName, [m_sDearName]);
end;
end;
end;
sShowName := AnsiReplaceText(g_sHumanShowName, '%chrname', sCharName);
if (g_Config.boShowPrenticeName and m_boMaster) or (g_Config.boShowMasterName and not m_boMaster) then
sShowName := AnsiReplaceText(sShowName, '%mastername', sMasterName + '\')
else
sShowName := AnsiReplaceText(sShowName, '%mastername', '');
if (sGuildName <> '') and (not m_boPneuma) then
sShowName := AnsiReplaceText(sShowName, '%guildname\', sGuildName + '\')
else
sShowName := AnsiReplaceText(sShowName, '%guildname\', '');
if sDearName <> '' then
sShowName := AnsiReplaceText(sShowName, '%dearname\', sDearName + '\')
else
sShowName := AnsiReplaceText(sShowName, '%dearname\', '');
{
if m_wAttachePoint > 100 then
sShowName := sShowName + '[' + m_sAttacheName + ']';
}
if m_boPneuma and (m_PneumaObject <> nil) then begin
sShowName := sShowName + '\(' + m_PneumaObject.m_sCharName + sIsYS
end;
if (m_wPersonalCode and 32 = 0) then begin
if Length(m_sTmpRank) > 0 then sShowName := sShowName + '\' + m_sTmpRank;
end;
//关灯模式
if (m_PEnvir.m_MapFlag.boSECRET and ((m_PEnvir.m_MapFlag.btSECRETRule and SECRET_RULE_UNITENAME) <> 0)) then
begin
sShowName := g_ManageNPC.GetLineVariableText(self, m_PEnvir.m_MapFlag.sSECRETCHRNAME);
end;
//神秘人
if m_boSecretMode and (m_sSecretName <> '') then begin
sShowName := m_sSecretName;
end;
Result := sShowName;
except
on E: Exception do begin
MainOutMessage(sExceptionMsg);
end;
end;
end;
function TPlayObject.GetSiteDownMsgCount: Integer;
var
i : Integer;
SendMessage : pTSendMessage;
begin
Result := 0;
EnterCriticalSection(ProcessMsgCriticalSection);
try
for i := 0 to m_MsgList.Count - 1 do begin
SendMessage := m_MsgList.Items[i];
if (SendMessage.wIdent = CM_SITDOWN) then begin
Inc(Result);
end;
end;
finally
LeaveCriticalSection(ProcessMsgCriticalSection);
end;
end;
function TPlayObject.GetSpellMsgCount: Integer;
var
i : Integer;
SendMessage : pTSendMessage;
begin
Result := 0;
try
EnterCriticalSection(ProcessMsgCriticalSection);
for i := 0 to m_MsgList.Count - 1 do begin
SendMessage := m_MsgList.Items[i];
if (SendMessage.wIdent = CM_SPELL) then begin
Inc(Result);
end;
end;
finally
LeaveCriticalSection(ProcessMsgCriticalSection);
end;
end;
//获得出生点
procedure TPlayObject.GetStartPoint;
var
i : Integer;
SP : pTStartPointInfo;
begin
if m_boPneuma and (m_PneumaObject <> nil) then begin
m_sHomeMap := m_PneumaObject.m_sHomeMap;
m_nHomeX := TPlayObject(m_PneumaObject).m_nHomeX;
m_nHomeY := TPlayObject(m_PneumaObject).m_nHomeY;
Exit;
end;
if PKLevel >= 2 then begin
m_sHomeMap := g_Config.sRedHomeMap; //红名地图
m_nHomeX := g_Config.nRedHomeX;
m_nHomeY := g_Config.nRedHomeY;
end else begin
for i := 0 to m_CurSafeZoneList.Count - 1 do begin
SP := m_CurSafeZoneList[i];
if (SP.Envir = m_PEnvir) and (abs(m_nCurrX - SP.X) < 50) and (abs(m_nCurrY - SP.Y) < 50) then begin
m_sHomeMap := SP.sMapName;
m_nHomeX := SP.X;
m_nHomeY := SP.Y;
Break;
end;
end;
end;
end;
function TPlayObject.GetColorTaskCount(): Integer;
var
i : Integer;
pTask : PTTask;
wColor : word;
begin
Result := 0;
for i := 0 to m_TaskList.Count - 1 do begin
pTask := PTTask(m_TaskList[i]);
wColor := HiWord(pTask^.Step);
if (HiByte(wColor) = 2) then Inc(Result);
end;
end;
function TPlayObject.GetTaskStep(const TaskID: Integer): Integer;
var
i : Integer;
pTask : PTTask;
begin
Result := 0;
for i := 0 to m_TaskList.Count - 1 do begin
pTask := PTTask(m_TaskList[i]);
if pTask^.TaskID = TaskID then begin
Result := LoWord(pTask^.Step);
Break;
end;
end;
end;
function TPlayObject.GetTaskStr(const TaskID: Integer; ValID: Integer): string;
var
i : Integer;
pTask : PTTask;
begin
Result := '';
if (ValID < 0) or (ValID >= MAX_TASK_S_VAL_COUNT) then Exit;
for i := 0 to m_TaskList.Count - 1 do begin
pTask := PTTask(m_TaskList[i]);
if pTask^.TaskID = TaskID then begin
Result := pTask^.sVal[ValID];
Break;
end;
end;
end;
function TPlayObject.GetTaskVal(const TaskID: Integer; ValID: Integer): Integer;
var
i : Integer;
pTask : PTTask;
begin
Result := -1;
if (ValID < 0) or (ValID >= MAX_TASK_I_VAL_COUNT) then Exit;
for i := 0 to m_TaskList.Count - 1 do begin
pTask := PTTask(m_TaskList[i]);
if pTask^.TaskID = TaskID then begin
Result := pTask^.nVal[ValID];
Break;
end;
end;
end;
{获取宝箱转盘物品??}
procedure TPlayObject.GetTreasureBoxItem(wParam: word; nParam1, nParam2,
nParam3: Integer; sMsg: string);
var
i, n : Integer;
BlessItems : TBlessTreeItem;
StdItem : pTStdItem;
UserItem : pTUserItem;
begin
m_nRandomGiveStep := nParam2;
case nParam2 of
{自动开宝箱关闭}
7: begin
m_nRandomGiveStep := 0;
m_nAutoOpenTreasureBox := MakeWord(0, HiByte(m_nAutoOpenTreasureBox));
Exit;
end;
{打开祈愿树}
12: begin
m_BLESSNPC := m_ClickNPC;
end;
{放上祈愿符}
268: begin
m_sScriptParam[0] := '0';
DeCodeBuffer(sMsg, @n, SizeOf(Integer));
m_sScriptParam[1] := IntToStr(MakeLong(nParam3, wParam));
m_sScriptParam[2] := IntToStr(n);
if m_BLESSNPC <> nil then
TNormNpc(m_BLESSNPC).GotoLable(Self, '@StartBless', False);
end;
{开始祈愿}
524: begin
GetUserItemByMakeIndex(MakeLong(nParam3, wParam), UserItem);
if UserItem <> nil then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
BlessItems.Name := StdItem.FilterName;
BlessItems.Looks := StdItem.Looks;
m_defMsg := MakeDefaultMsg(SM_627, Integer(Self), 1036, 1, 0);
SendSocket(@m_defMsg, EnCodeBuffer(@BlessItems, SizeOf(TBlessTreeItem)));
end;
end;
DeCodeBuffer(sMsg, @n, SizeOf(Integer));
m_sScriptParam[0] := '1';
m_sScriptParam[1] := IntToStr(MakeLong(nParam3, wParam));
m_sScriptParam[2] := IntToStr(n);
if m_BLESSNPC <> nil then
TNormNpc(m_BLESSNPC).GotoLable(Self, '@StartBless', False);
end;
{自动开宝箱开启}
263: begin
m_nAutoOpenTreasureBox := MakeWord(1, HiByte(m_nAutoOpenTreasureBox));
Exit;
end;
{显示物品}
264, 520, 776, 1032: begin
if m_sNextLabel <> '' then begin
m_sScriptParam[0] := IntToStr(nParam2 div 256);
m_sScriptParam[10] := '0';
if m_SMELTNPC <> nil then
TNormNpc(m_SMELTNPC).GotoLable(Self, m_sNextLabel, False);
end;
end;
{自动开启宝箱}
265, 521, 777, 1033: begin
if m_SMELTNPC <> nil then begin
m_sScriptParam[0] := IntToStr(HiByte(m_nAutoOpenTreasureBox)
{宝箱类型});
TNormNpc(m_SMELTNPC).GotoLable(Self, '@OpenBox', False);
end;
SendDefMessage(627, Integer(Self), nParam2 + 252, 4, 0, '');
Exit;
end;
{获取物品}
266, 522, 778, 1034: begin
m_sScriptParam[0] := IntToStr(nParam2 div 256);
m_sScriptParam[10] := '1';
if m_sNextLabel <> '' then begin
if m_SMELTNPC <> nil then
TNormNpc(m_SMELTNPC).GotoLable(Self, m_sNextLabel, False);
end;
end;
{关闭宝箱,重新洗牌}
267, 523, 779, 1035: begin
for i := 0 to 10 do m_sScriptParam[i] := '0';
m_sNextLabel := '';
m_SMELTNPC := nil;
m_nAutoOpenTreasureBox := $00;
SendDefMessage(627, Integer(Self), 0, 0, 0, '');
end;
end;
end;
function TPlayObject.GetTurnMsgCount: Integer;
var
i : Integer;
SendMessage : pTSendMessage;
begin
Result := 0;
try
EnterCriticalSection(ProcessMsgCriticalSection);
for i := 0 to m_MsgList.Count - 1 do begin
SendMessage := m_MsgList.Items[i];
if (SendMessage.wIdent = CM_TURN) then begin
Inc(Result);
end;
end;
finally
LeaveCriticalSection(ProcessMsgCriticalSection);
end;
end;
function TPlayObject.GetWalkMsgCount: Integer;
var
i : Integer;
SendMessage : pTSendMessage;
begin
Result := 0;
try
EnterCriticalSection(ProcessMsgCriticalSection);
for i := 0 to m_MsgList.Count - 1 do begin
SendMessage := m_MsgList.Items[i];
if (SendMessage.wIdent = CM_WALK) then begin
Inc(Result);
end;
end;
finally
LeaveCriticalSection(ProcessMsgCriticalSection);
end;
end;
procedure TPlayObject.GoldChange(sChrName: string; nGold: Integer);
resourcestring
sMsg = '% 的金币%d 金币%s';
var
s10, s14 : string;
begin
if nGold > 0 then begin
s10 := '14';
s14 := '增加完成';
end else begin
s10 := '13';
s14 := '以删减';
end;
SysMsg(Format(sMsg, [sChrName, nGold, s14]), c_Green, t_Hint);
if g_boGameLogGold then
AddGameDataLog(s10 + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
sSTRING_GOLDNAME + #9 +
IntToStr(nGold) + #9 +
'1' + #9 +
sChrName);
end;
function TPlayObject.HorseRunTo(btDir: byte; boFlag: Boolean): Boolean;
const
nRunStep = 3;
var
nOldX, nOldY : Integer;
btRideFightSpeed : byte;
boHumanRun : Boolean;
resourcestring
sExceptionMsg = '[Exception] TPlayObject::HorseRunTo';
begin
Result := False;
if (m_btGodRunTime > 0) then begin
btRideFightSpeed := 3;
end else if m_boPneuma and (m_PneumaObject <> nil) then begin
btRideFightSpeed := TPlayObject(m_PneumaObject).m_PetInfo[3].btRideFightSpeed;
end else begin
btRideFightSpeed := m_PetInfo[2].btRideFightSpeed;
end;
if m_boRideOn and m_boRideFightOn and (btRideFightSpeed = 0) then Exit;
boHumanRun := g_Config.boDiableHumanRun or ((m_btPermissionGM > 9) and g_Config.boGMRunAll) or (g_Config.boSafeZoneRunAll and InSafeZone);
try
nOldX := m_nCurrX;
nOldY := m_nCurrY;
m_btDirection := btDir;
case btDir of
DR_UP {0}: begin
if m_boFlyer or (m_nCurrY > 2) and
(m_PEnvir.CanWalkEx(m_nCurrX, m_nCurrY - 1, boHumanRun {True})) and
(m_PEnvir.CanWalkEx(m_nCurrX, m_nCurrY - 2, boHumanRun {True})) and
(m_PEnvir.CanWalkEx(m_nCurrX, m_nCurrY - 3, boHumanRun {True})) and
(m_PEnvir.MoveToMovingObject(m_nCurrX, m_nCurrY, Self, m_nCurrX, m_nCurrY - 3, True) > 0) then begin
Dec(m_nCurrY, nRunStep);
end;
end;
DR_UPRIGHT {1}: begin
if m_boFlyer or (m_nCurrX < m_PEnvir.m_nWidth - 3) and
(m_nCurrY > 2) and
(m_PEnvir.CanWalkEx(m_nCurrX + 1, m_nCurrY - 1, boHumanRun {True})) and
(m_PEnvir.CanWalkEx(m_nCurrX + 2, m_nCurrY - 2, boHumanRun {True})) and
(m_PEnvir.CanWalkEx(m_nCurrX + 3, m_nCurrY - 3, boHumanRun {True})) and
(m_PEnvir.MoveToMovingObject(m_nCurrX, m_nCurrY, Self, m_nCurrX + 3, m_nCurrY - 3, True) > 0) then begin
Inc(m_nCurrX, nRunStep);
Dec(m_nCurrY, nRunStep);
end;
end;
DR_RIGHT {2}: begin
if m_boFlyer or (m_nCurrX < m_PEnvir.m_nWidth - 3) and
(m_PEnvir.CanWalkEx(m_nCurrX + 1, m_nCurrY, boHumanRun {True})) and
(m_PEnvir.CanWalkEx(m_nCurrX + 2, m_nCurrY, boHumanRun {True})) and
(m_PEnvir.CanWalkEx(m_nCurrX + 3, m_nCurrY, boHumanRun {True})) and
(m_PEnvir.MoveToMovingObject(m_nCurrX, m_nCurrY, Self, m_nCurrX + 3, m_nCurrY, True) > 0) then begin
Inc(m_nCurrX, nRunStep);
end;
end;
DR_DOWNRIGHT {3}: begin
if m_boFlyer or (m_nCurrX < m_PEnvir.m_nWidth - 3) and
(m_nCurrY < m_PEnvir.m_nHeight - 3) and
(m_PEnvir.CanWalkEx(m_nCurrX + 1, m_nCurrY + 1, boHumanRun {True})) and
(m_PEnvir.CanWalkEx(m_nCurrX + 2, m_nCurrY + 2, boHumanRun {True})) and
(m_PEnvir.CanWalkEx(m_nCurrX + 3, m_nCurrY + 3, boHumanRun {True})) and
(m_PEnvir.MoveToMovingObject(m_nCurrX, m_nCurrY, Self, m_nCurrX + 3, m_nCurrY + 3, True) > 0) then begin
Inc(m_nCurrX, nRunStep);
Inc(m_nCurrY, nRunStep);
end;
end;
DR_DOWN {4}: begin
if m_boFlyer or (m_nCurrY < m_PEnvir.m_nHeight - 3) and
(m_PEnvir.CanWalkEx(m_nCurrX, m_nCurrY + 1, boHumanRun {True})) and
(m_PEnvir.CanWalkEx(m_nCurrX, m_nCurrY + 2, boHumanRun {True})) and
(m_PEnvir.CanWalkEx(m_nCurrX, m_nCurrY + 3, boHumanRun {True})) and
(m_PEnvir.MoveToMovingObject(m_nCurrX, m_nCurrY, Self, m_nCurrX, m_nCurrY + 3, True) > 0) then begin
Inc(m_nCurrY, nRunStep);
end;
end;
DR_DOWNLEFT {5}: begin
if m_boFlyer or (m_nCurrX > 2) and
(m_nCurrY < m_PEnvir.m_nHeight - 3) and
(m_PEnvir.CanWalkEx(m_nCurrX - 1, m_nCurrY + 1, boHumanRun {True})) and
(m_PEnvir.CanWalkEx(m_nCurrX - 2, m_nCurrY + 2, boHumanRun {True})) and
(m_PEnvir.CanWalkEx(m_nCurrX - 3, m_nCurrY + 3, boHumanRun {True})) and
(m_PEnvir.MoveToMovingObject(m_nCurrX, m_nCurrY, Self, m_nCurrX - 3, m_nCurrY + 3, True) > 0) then begin
Dec(m_nCurrX, nRunStep);
Inc(m_nCurrY, nRunStep);
end;
end;
DR_LEFT {6}: begin
if m_boFlyer or (m_nCurrX > 2) and
(m_PEnvir.CanWalkEx(m_nCurrX - 1, m_nCurrY, boHumanRun {True})) and
(m_PEnvir.CanWalkEx(m_nCurrX - 2, m_nCurrY, boHumanRun {True})) and
(m_PEnvir.CanWalkEx(m_nCurrX - 3, m_nCurrY, boHumanRun {True})) and
(m_PEnvir.MoveToMovingObject(m_nCurrX, m_nCurrY, Self, m_nCurrX - 3, m_nCurrY, True) > 0) then begin
Dec(m_nCurrX, nRunStep);
end;
end;
DR_UPLEFT {7}: begin
if m_boFlyer or (m_nCurrX > 2) and
(m_nCurrY > 2) and
(m_PEnvir.CanWalkEx(m_nCurrX - 1, m_nCurrY - 1, boHumanRun {True})) and
(m_PEnvir.CanWalkEx(m_nCurrX - 2, m_nCurrY - 2, boHumanRun {True})) and
(m_PEnvir.CanWalkEx(m_nCurrX - 3, m_nCurrY - 3, boHumanRun {True})) and
(m_PEnvir.MoveToMovingObject(m_nCurrX, m_nCurrY, Self, m_nCurrX - 3, m_nCurrY - 3, True) > 0) then begin
Dec(m_nCurrX, nRunStep);
Dec(m_nCurrY, nRunStep);
end;
end;
end;
if (m_nCurrX <> nOldX) or (m_nCurrY <> nOldY) then begin
if Walk(RM_RUN) then Result := True
else begin
if m_boFlyer or (m_PEnvir.MoveToMovingObject(nOldX, nOldY, Self, m_nCurrX, m_nCurrY, True) > 0) then begin
m_nCurrX := nOldX;
m_nCurrY := nOldY;
end;
end;
end;
except
MainOutMessage(sExceptionMsg);
end;
end;
//指定玩家是否在被阻止私聊列表中
function TPlayObject.IsBlockWhisper(sName: string): Boolean;
var
i : Integer;
begin
Result := False;
for i := 0 to m_BlockWhisperList.Count - 1 do begin
if CompareText(sName, m_BlockWhisperList.Strings[i]) = 0 then begin
Result := True;
Break;
end;
end;
end;
function TPlayObject.IsGotoLabel(sMapName: string; nX, nY, nRange,
nQuestFalgStatus: Integer;
boQuestFalgStatus: Boolean; sItemName1, sItemName2: string; boNeedGroup:
Boolean; nRandomCount: Integer): Boolean;
var
n01 : Integer;
nMaxCurrX, nMaxCurrY, nMinCurrX, nMinCurrY: Integer;
function GetAllowItem: Boolean;
begin
Result := False;
if sItemName1 = '*' then begin
Result := True;
end else
if CompareText(sItemName1, sItemName2) = 0 then begin
Result := True;
end;
end;
function GetRandomCount: Boolean;
begin
Result := False;
if nRandomCount = 0 then Result := True
else
if (nRandomCount > 0) and (Random(nRandomCount div 2 + nRandomCount) =
nRandomCount) then Result := True;
end;
function GetGroup: Boolean;
begin
Result := False;
if not boNeedGroup then Result := True
else
if m_GroupOwner <> nil then Result := True;
end;
begin
Result := False;
nMaxCurrX := nX + nRange;
nMaxCurrY := nY + nRange;
nMinCurrX := nX - nRange;
nMinCurrY := nY - nRange;
if (CompareText(sMapName, m_sMapName) = 0) and (((m_nCurrX <= nMaxCurrX) and
(m_nCurrX >= nMinCurrX) and (m_nCurrY <= nMaxCurrY) and (m_nCurrY >=
nMinCurrY)) or (nRange = -1)) then begin
if nQuestFalgStatus > 0 then begin
n01 := GetQuestFalgStatus(nQuestFalgStatus);
if (n01 = 0) and (not boQuestFalgStatus) then begin
if GetAllowItem and GetGroup and GetRandomCount then begin
Result := True;
end;
end else
if (n01 <> 0) and (boQuestFalgStatus) then begin
if GetAllowItem and GetGroup and GetRandomCount then begin
Result := True;
end;
end;
end else begin
if GetAllowItem and GetGroup and GetRandomCount then begin
Result := True;
end;
end;
end;
end;
procedure TPlayObject.JoinGroup(PlayObject: TPlayObject);
begin
m_GroupOwner := PlayObject;
SendGroupText(Format(g_sJoinGroup, [m_sCharName]));
end;
function TPlayObject.LableIsCanJmp(sLabel: string; boLeft: Boolean): Boolean;
var
i : Integer;
begin
Result := False;
if CompareText(sLabel, '@main') = 0 then begin
Result := True;
Exit;
end;
if CompareText(sLabel, '@mainleft') = 0 then begin
Result := True;
Exit;
end;
if CompareText(sLabel, '@exit') = 0 then begin
Result := True;
Exit;
end;
if boLeft then begin
for i := 0 to m_CanJmpScriptLableList2.Count - 1 do begin
if CompareText(sLabel, m_CanJmpScriptLableList2.Strings[i]) = 0 then begin
Result := True;
Break;
end;
end;
end;
for i := 0 to m_CanJmpScriptLableList.Count - 1 do begin
if CompareText(sLabel, m_CanJmpScriptLableList.Strings[i]) = 0 then begin
Result := True;
Break;
end;
end;
if CompareText(sLabel, m_sPlayDiceLabel) = 0 then begin
m_sPlayDiceLabel := '';
Result := True;
Exit;
end;
end;
//登陆时间记费
procedure TPlayObject.LogonTimcCost(); //004CA994
var
n08 : Integer;
SC : string;
begin
if (m_nPayMent = 2) or (g_Config.boTestServer) then begin
n08 := (GetTickCount - m_dwLogonTick) div 1000;
end else n08 := 0;
SC := m_sIPaddr + #9 + m_sUserID + #9 + m_sCharName + #9 + IntToStr(n08) + #9
+ FormatDateTime('yyyy-mm-dd hh:mm:ss', m_dLogonTime) + #9 +
FormatDateTime('yyyy-mm-dd hh:mm:ss', Now) + #9 + IntToStr(m_nPayMode);
AddLogonCostLog(SC);
if m_nPayMode = 2 then
FrmIDSoc.SendLogonCostMsg(m_sUserID, n08 div 60);
end;
procedure TPlayObject.MakeFlagOwner(nflagType: Integer; ItemIdx: Integer; nX,
nY: Integer; sData: string);
var
tmpList : TList;
NPC : TNormNpc;
wAppr : word;
i : Integer;
UserItem : pTUserItem;
StdItem : pTStdItem;
begin
tmpList := TList.Create;
try
UserEngine.GetMerchantList(m_PEnvir, nX, nY, 0, tmpList);
if tmpList.Count = 0 then begin
{$IF USESDK = DEBUG}
SysMsg(Format('坐标(%d,%d)未发现有任何NPC', []), c_Red, t_Hint);
{$IFEND}
Exit;
end;
NPC := TNormNpc(tmpList[0]);
for i := m_ItemList.Count - 1 downto 0 do begin
UserItem := pTUserItem(m_ItemList[i]);
if UserItem.MakeIndex = ItemIdx then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem = nil then Break;
wAppr := StdItem.AniCount;
if NPC.SetFlagOwnerInfo(Self, wAppr, sData) then begin
if UserItem.Dura <= 1 then begin
SendDelItems(UserItem);
Dispose(UserItem);
m_ItemList.Delete(i);
end else begin
Dec(UserItem.Dura);
SendUpdateItem(UserItem);
end;
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
end;
Break;
end;
end;
finally
tmpList.free;
end;
end;
procedure TPlayObject.MakeGhost;
var
i, j : Integer;
sSayMsg : string;
human : TPlayObject;
UserItem : pTUserItem;
StdItem : pTStdItem;
resourcestring
sExceptionMsg = '[Exception] TPlayObject::MakeGhost';
begin
try
if (g_HighLevelHuman = Self) then g_HighLevelHuman := nil;
if (g_HighPKPointHuman = Self) then g_HighPKPointHuman := nil;
if (g_HighDCHuman = Self) then g_HighDCHuman := nil;
if (g_HighMCHuman = Self) then g_HighMCHuman := nil;
if (g_HighSCHuman = Self) then g_HighSCHuman := nil;
if (g_HighOnlineHuman = Self) then g_HighOnlineHuman := nil;
//人物下线后通知配偶,并把对方的相关记录清空
if m_DearHuman <> nil then begin
if m_btGender = 0 then begin
sSayMsg := AnsiReplaceText(g_sManLongOutDearOnlineMsg, '%d',
m_sDearName);
sSayMsg := AnsiReplaceText(sSayMsg, '%s', m_sCharName);
sSayMsg := AnsiReplaceText(sSayMsg, '%m', m_PEnvir.m_sMapDesc);
sSayMsg := AnsiReplaceText(sSayMsg, '%x', IntToStr(m_nCurrX));
sSayMsg := AnsiReplaceText(sSayMsg, '%y', IntToStr(m_nCurrY));
if g_Config.boOldClientShowHiLevel then
m_DearHuman.SysMsg(sSayMsg, c_Red, t_Hint);
end else begin
sSayMsg := AnsiReplaceText(g_sWoManLongOutDearOnlineMsg, '%d',
m_sDearName);
sSayMsg := AnsiReplaceText(sSayMsg, '%s', m_sCharName);
sSayMsg := AnsiReplaceText(sSayMsg, '%m', m_PEnvir.m_sMapDesc);
sSayMsg := AnsiReplaceText(sSayMsg, '%x', IntToStr(m_nCurrX));
sSayMsg := AnsiReplaceText(sSayMsg, '%y', IntToStr(m_nCurrY));
if g_Config.boOldClientShowHiLevel then
m_DearHuman.SysMsg(sSayMsg, c_Red, t_Hint);
end;
m_DearHuman.m_DearHuman := nil;
m_DearHuman := nil;
end;
if (m_MasterHuman <> nil) or (m_MasterList.Count > 0) then begin
if m_boMaster then begin
for i := m_MasterList.Count - 1 downto 0 do begin
human := TPlayObject(m_MasterList.Items[i]);
sSayMsg := AnsiReplaceText(g_sMasterLongOutMasterListOnlineMsg, '%s',
m_sCharName);
sSayMsg := AnsiReplaceText(sSayMsg, '%m', m_PEnvir.m_sMapDesc);
sSayMsg := AnsiReplaceText(sSayMsg, '%x', IntToStr(m_nCurrX));
sSayMsg := AnsiReplaceText(sSayMsg, '%y', IntToStr(m_nCurrY));
if g_Config.boOldClientShowHiLevel then
human.SysMsg(sSayMsg, c_Red, t_Hint);
human.m_MasterHuman := nil;
end;
end else begin
if m_MasterHuman = nil then Exit;
sSayMsg := AnsiReplaceText(g_sMasterListLongOutMasterOnlineMsg, '%d',
m_sMasterName[1]);
sSayMsg := AnsiReplaceText(sSayMsg, '%s', m_sCharName);
sSayMsg := AnsiReplaceText(sSayMsg, '%m', m_PEnvir.m_sMapDesc);
sSayMsg := AnsiReplaceText(sSayMsg, '%x', IntToStr(m_nCurrX));
sSayMsg := AnsiReplaceText(sSayMsg, '%y', IntToStr(m_nCurrY));
if g_Config.boOldClientShowHiLevel then
m_MasterHuman.SysMsg(sSayMsg, c_Red, t_Hint);
//如果为大徒弟则将对方的记录清空
if m_MasterHuman.m_sMasterName[1] = m_sCharName then begin
m_MasterHuman.m_MasterHuman := nil;
end;
for i := 0 to m_MasterHuman.m_MasterList.Count - 1 do begin
if m_MasterHuman.m_MasterList.Items[i] = Self then begin
m_MasterHuman.m_MasterList.Delete(i);
Break;
end;
end;
end;
end;
//物品控制-下线掉落
for i := m_ItemList.Count - 1 downto 0 do begin
UserItem := pTUserItem(m_ItemList[i]);
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
if CheckSPCode(StdItem.Reserved, RE_OUTDROP) then begin
if DropItemDown(UserItem, 5, True, nil, Self) then begin
Dispose(pTUserItem(m_ItemList[i]));
m_ItemList.Delete(i);
end;
end;
end;
end;
SendMeOnlineState(0);
if m_boPneuma and (m_PneumaObject <> nil) then begin //元神的处理
TPlayObject(m_PneumaObject).m_dwCallPneumaTick := GetTickCount;
TPlayObject(m_PneumaObject).m_PneumaObject := nil;
TPlayObject(m_PneumaObject).m_PetInfo[3].nMakeIndex := 0;
TPlayObject(m_PneumaObject).m_PetInfo[3].wLevel := 0;
TPlayObject(m_PneumaObject).m_PetInfo[3].btType := 0;
TPlayObject(m_PneumaObject).m_PetInfo[3].btReLive := 0;
TPlayObject(m_PneumaObject).m_PetInfo[3].btRideFightSpeed := 0;
{ if m_boInosculatePneuma then begin
if (m_MagicSkills[SKILL_SPIRITLINK] <> nil) then begin
m_PneumaObject.SendDelayMsg(m_PneumaObject, RM_CHARSTATUSCHANGED_Delay, 0, 0, 0, 0, '', 500);
m_PneumaObject.SysMsg('你和融合元神的灵魂锁链状态已解除', c_Red, t_Hint);
end;
end; }
m_PneumaObject := nil;
end else if not m_boPneuma and (m_PneumaObject <> nil) then begin //主体的处理
if not m_PneumaObject.m_boGhost and
TPlayObject(m_PneumaObject).m_boOfflineGetGamePoint then
UserEngine.KickPlayObject(m_PneumaObject.m_sCharName);
m_dwCallPneumaTick := GetTickCount;
TPlayObject(m_PneumaObject).m_PneumaObject := nil;
m_PneumaObject := nil;
end;
except
on E: Exception do begin
MainOutMessage(sExceptionMsg);
MainOutMessage(E.Message);
end;
end;
inherited;
end;
procedure TPlayObject.MakeMine; //004CB3AC
function RandomDrua(): Integer;
begin
Result := Random(g_Config.nStoneGeneralDuraRate {13000}) +
g_Config.nStoneMinDura {3000};
if Random(g_Config.nStoneAddDuraRate {20}) = 0 then begin
Result := Result + Random(g_Config.nStoneAddDuraMax {10000});
end;
end;
var
UserItem : pTUserItem;
nRANDOM : Integer;
begin
if m_ItemList.Count >= m_nBagSize then Exit;
nRANDOM := Random(g_Config.nStoneTypeRate {120});
if nRANDOM in [g_Config.nGoldStoneMin {1}..g_Config.nGoldStoneMax {2}] then begin
New(UserItem);
if UserEngine.CopyToUserItemFromName(g_Config.sGoldStone, UserItem) then begin
UserItem.Dura := RandomDrua();
m_ItemList.Add(UserItem);
WeightChanged();
SendAddItem(UserItem);
end else
Dispose(UserItem);
Exit;
end;
if nRANDOM in [g_Config.nSilverStoneMin {3}..g_Config.nSilverStoneMax {20}] then begin
New(UserItem);
if UserEngine.CopyToUserItemFromName(g_Config.sSilverStone, UserItem) then begin
UserItem.Dura := RandomDrua();
m_ItemList.Add(UserItem);
WeightChanged();
SendAddItem(UserItem);
end else
Dispose(UserItem);
Exit;
end;
if nRANDOM in [g_Config.nSteelStoneMin {21}..g_Config.nSteelStoneMax {45}] then begin
New(UserItem);
if UserEngine.CopyToUserItemFromName(g_Config.sSteelStone, UserItem) then begin
UserItem.Dura := RandomDrua();
m_ItemList.Add(UserItem);
WeightChanged();
SendAddItem(UserItem);
end else
Dispose(UserItem);
Exit;
end;
if nRANDOM in [g_Config.nBlackStoneMin {46}..g_Config.nBlackStoneMax {56}] then begin
New(UserItem);
if UserEngine.CopyToUserItemFromName(g_Config.sBlackStone, UserItem) then begin
UserItem.Dura := RandomDrua();
m_ItemList.Add(UserItem);
WeightChanged();
SendAddItem(UserItem);
end else
Dispose(UserItem);
Exit;
end;
New(UserItem);
if UserEngine.CopyToUserItemFromName(g_Config.sCopperStone, UserItem) then begin
UserItem.Dura := RandomDrua();
m_ItemList.Add(UserItem);
WeightChanged();
SendAddItem(UserItem);
end else
Dispose(UserItem);
end;
procedure TPlayObject.MobPlace(sX, sY, sMonName, sCount: string); //004C1508
begin
end;
procedure TPlayObject.MoveToHome;
begin
SendRefMsg(RM_SPACEMOVE_FIRE, 0, 0, 0, 0, '');
BaseObjectMove(m_sHomeMap, IntToStr(m_nHomeX), IntToStr(m_nHomeY));
end;
procedure TPlayObject.MoveToHomeRandom();
begin
SendRefMsg(RM_SPACEMOVE_FIRE, 0, 0, 0, 0, '');
BaseObjectMove(m_sHomeMap, IntToStr(m_nHomeX - 9 + Random(19)), IntToStr(m_nHomeY - 9 + Random(19)));
end;
{打开交易对话框}
procedure TPlayObject.OpenDealDlg(BaseObject: TBaseObject);
begin
m_boDealing := True;
m_DealCreat := BaseObject;
GetBackDealItems();
SendDefMessage(SM_DEALMENU, 0, 0, 0, 0, m_DealCreat.m_sCharName);
m_DealLastTick := GetTickCount();
end;
function TPlayObject.PetDoShopCanSellCount: Integer;
begin
Result := 0;
if m_PetInfo[1].nMakeIndex <> 0 then begin
if m_PetInfo[1].btReLive > 0 then
Result := 15
else begin
case m_PetInfo[1].wLevel of
0, 1: Result := 0;
2, 3: Result := 5;
4, 5: Result := 10;
6, 7: Result := 15;
else
Result := 0;
end;
end;
Exit;
end;
if m_Pet = nil then Exit;
if m_PetInfo[0].btReLive > 0 then
Result := 15
else begin
case m_PetInfo[0].wLevel of
0, 1: Result := 0;
2, 3: Result := 5;
4, 5: Result := 10;
6, 7: Result := 15;
else
Result := 0;
end;
end;
end;
procedure TPlayObject.HorseHide;
var
i : Integer;
begin
if (m_Horse <> nil) then begin
for i := m_SlaveList.Count - 1 downto 0 do begin
if m_SlaveList[i] = m_Horse then begin
m_SlaveList.Delete(i);
Break;
end;
end;
SendDefMessage(34977, m_Horse.m_wAppr, 612, 0, 0, '');
if (not m_Horse.m_boDeath) and (not m_Horse.m_boGhost) then
m_Horse.MakeGhost;
end;
m_Horse := nil;
end;
procedure TPlayObject.PetHide(nMakeIndex: Integer);
var
UserItem : pTUserItem;
nCheckCount : Integer;
i, nBagSize : Integer;
label
return;
begin
if (nMakeIndex = m_PetInfo[0].nMakeIndex) then begin
if (m_Pet <> nil) then begin
//删除宠物
for i := m_SlaveList.Count - 1 downto 0 do begin
if m_SlaveList[i] = m_Pet then begin
m_SlaveList.Delete(i);
Break;
end;
end;
if (not m_Pet.m_boDeath) and (not m_Pet.m_boGhost) then
m_Pet.MakeGhost;
m_Pet := nil;
end;
m_PetInfo[0].nMakeIndex := 0;
m_PetInfo[0].wLevel := 0;
m_PetInfo[0].btType := 0;
m_PetInfo[0].btReLive := 0;
goto return;
end;
if (nMakeIndex = m_PetInfo[4].nMakeIndex) then begin
m_PetInfo[4].nMakeIndex := 0;
m_PetInfo[4].wLevel := 0;
m_PetInfo[4].btType := 0;
m_PetInfo[4].btReLive := 0;
goto return;
end;
if (nMakeIndex = m_PetInfo[5].nMakeIndex) then begin
for i := 0 to m_ItemList.Count - 1 do begin //包裹里的物品
UserItem := m_ItemList.Items[i];
if (UserItem <> nil) and (UserItem.MakeIndex = nMakeIndex) then begin
UserItem.btItemExt[29] := 2;
SendUpdateItem(UserItem, False);
Break;
end;
end;
m_boBeast := False;
m_PetInfo[5].nMakeIndex := 0;
m_PetInfo[5].wLevel := 0;
m_PetInfo[5].btType := 0;
m_PetInfo[5].btReLive := 0;
SendRefMsg(RM_510, 1, 0, 171, 0, '');
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
end;
if m_boRideOn and (nMakeIndex = m_PetInfo[2].nMakeIndex) then begin
m_dwLastRide := GetTickCount;
m_boRideOn := False;
m_boRideFightOn := False;
SendRefMsg(RM_SITDOWN, m_btDirection, MakeLong(m_nCurrX, m_nCurrY), GetFeatureToLong(Self), 0, '');
SendMsg(Self, RM_205, 0, 0, 0, 0, '');
RecalcAbilitys(); //计算骑战属性
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
m_PetInfo[2].nMakeIndex := 0;
m_PetInfo[2].wLevel := 0;
m_PetInfo[2].btType := 0;
m_PetInfo[2].btReLive := 0;
m_PetInfo[2].btRideFightSpeed := 0;
end;
if not m_boPneuma and (m_PneumaObject <> nil) and
(TPlayObject(m_PneumaObject).m_boRideOn) and (nMakeIndex = m_PetInfo[3].nMakeIndex) then begin
TPlayObject(m_PneumaObject).m_boRideOn := False;
TPlayObject(m_PneumaObject).m_boRideFightOn := False;
m_PneumaObject.SendRefMsg(RM_SITDOWN, m_PneumaObject.m_btDirection,
MakeLong(m_PneumaObject.m_nCurrX, m_PneumaObject.m_nCurrY),
m_PneumaObject.GetFeature(Self), 0, '');
m_PneumaObject.SendMsg(m_PneumaObject, RM_205, 0, 0, 0, 0, '');
m_PneumaObject.RecalcAbilitys(); //计算骑战属性
m_PneumaObject.SendMsg(m_PneumaObject, RM_ABILITY, 0, 0, 0, 0, '');
m_PneumaObject.SendMsg(m_PneumaObject, RM_SUBABILITY, 0, 0, 0, 0, '');
//通知所有人
m_PneumaObject.SendRefMsg(RM_TURN,
m_PneumaObject.m_btDirection,
m_PneumaObject.m_nCurrX,
m_PneumaObject.m_nCurrY,
CalcCent(m_PneumaObject.m_WAbil.dwHP, m_PneumaObject.m_WAbil.dwMaxHP),
m_PneumaObject.GetShowName);
m_PetInfo[3].nMakeIndex := 0;
m_PetInfo[3].wLevel := 0;
m_PetInfo[3].btType := 0;
m_PetInfo[3].btReLive := 0;
m_PetInfo[3].btRideFightSpeed := 0;
end;
return:
nBagSize := m_nPetBagSize;
if (m_PetInfo[0].nMakeIndex = 0) and (m_PetInfo[1].nMakeIndex = 0) and
(m_PetInfo[2].nMakeIndex = 0) and (m_PetInfo[3].nMakeIndex = 0) and
(m_PetInfo[4].nMakeIndex = 0) and (m_PetInfo[5].nMakeIndex = 0) then
nBagSize := 0;
SendDefMessage(SM_PETBAGSIZE, Integer(Self), 0, m_nPetShopSize, nBagSize, '');
if nBagSize = 0 then begin
m_defMsg := MakeDefaultMsg(34977, 0, 100, 0, 0);
SendSocket(@m_defMsg, EnCodeBuffer(@nMakeIndex, 4));
end;
end;
//丛林豹捡东西
function TPlayObject.PetPickUpItem(nX, nY: Integer): Boolean;
begin
Result := False;
if m_Pet = nil then Exit;
m_Pet.m_nTargetX := nX;
m_Pet.m_nTargetY := nY;
m_nPetTargetX := nX;
m_nPetTargetY := nY;
Result := True;
end;
procedure TPlayObject.PetShow(nMakeIndex: Integer);
resourcestring
sHint1 = '此处不能放出海底灵兽';
const
PETBAGSIZE : array[0..7] of Integer = (0, 5, 5, 10, 10, 10, 10, 10);
PETMAXHP : array[0..7] of Integer = (800, 1000, 1200, 1450, 1800, 2200, 2600, 3200);
var
i : Integer;
UserItem : pTUserItem;
StdItem : pTStdItem;
nLevel, nType, nAppr : Integer;
boFound : Boolean;
begin
m_dwLastRide := GetTickCount;
boFound := False;
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList[i];
if UserItem.MakeIndex = nMakeIndex then begin
boFound := True;
Break;
end;
end;
if not boFound then Exit;
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if (StdItem <> nil) and (StdItem.StdMode = 49) and (StdItem.Shape = 51) then begin
m_sPetName := UserItem.sExName;
m_PetInfo[0].sCharName := m_sPetName;
m_PetInfo[0].nMakeIndex := UserItem.MakeIndex;
m_PetInfo[0].wLevel := MakeWord(UserItem.btValue[4], UserItem.btValue[5]); //等级
m_PetInfo[0].btReLive := UserItem.btValue[9]; //转生次数
m_PetInfo[0].btRideFightSpeed := UserItem.btRideSpeed; //骑战速度
m_PetInfo[0].boUnWater := (UserItem.btItemExt[24] <> 0); //避水灵性
m_PetInfo[0].btSoul := byte(UserItem.btItemExt[29] >= 2); //魂佑灵兽
m_PetInfo[0].btAttack := UserItem.btExtra.btAttack; //骑战技能攻击距离
nAppr := UserItem.btValue[8]; //外观类型
nType := StdItem.AniCount; //灵兽类型
end;
if (nType = 5) and (not m_PEnvir.m_MapFlag.boCanRideShark) then begin
SysMsg(sHint1, c_Red, t_Hint);
m_PetInfo[0].nMakeIndex := 0;
Exit;
end;
nLevel := _MIN(7, m_PetInfo[0].wLevel);
if m_Pet = nil then begin
if nAppr > 0 then
m_Pet := TAnimalObject(MakeSlave(_PETNAME[_MIN(15, nType)][_MIN(3, m_PetInfo[0].btReLive)] + IntToStr(nAppr), m_PetInfo[0].wLevel, m_PetInfo[0].wLevel, 100, 86400, -1))
else
m_Pet := TAnimalObject(MakeSlave(_PETNAME[_MIN(15, nType)][_MIN(3, m_PetInfo[0].btReLive)], m_PetInfo[0].wLevel, m_PetInfo[0].wLevel, 100, 86400, -1));
end;
if m_Pet <> nil then begin
m_Pet.m_boIsPet := True;
m_Pet.m_boNoAttackMode := True;
if m_PetInfo[0].btReLive > 0 then
m_nPetBagSize := _Max(10, m_nPetBagSize)
else
m_nPetBagSize := _Max(PETBAGSIZE[nLevel], m_nPetBagSize);
m_Pet.m_WAbil.dwHP := PETMAXHP[nLevel];
m_Pet.m_WAbil.dwMaxHP := PETMAXHP[nLevel];
if (m_PetInfo[0].btReLive = 2) and (UserItem.btItemExt[29] >= 2) then //魂佑灵兽
m_Pet.m_btGender := $0A
else
m_Pet.m_btGender := m_PetInfo[0].btReLive;
m_Pet.m_wExtraLevel := UserItem.btItemExt[30]; //强化次数
SendMsg(Self, RM_PETBAGITEMS, 0, 0, 0, 0, '');
//如果是踏云豹
if m_PetInfo[0].btReLive > 0 then begin
case nType of
0: m_PetInfo[0].btType := 11 + nAppr;
1: m_PetInfo[0].btType := 13 + nAppr;
2: m_PetInfo[0].btType := 16 + nAppr;
3: m_PetInfo[0].btType := 19 + nAppr;
4: m_PetInfo[0].btType := 22 + nAppr;
5: m_PetInfo[0].btType := 25 + nAppr;
6: m_PetInfo[0].btType := 28 + nAppr;
7: m_PetInfo[0].btType := 31 + nAppr;
8: m_PetInfo[0].btType := 34 + nAppr;
9: m_PetInfo[0].btType := 37 + nAppr;
10: m_PetInfo[0].btType := 38 + nAppr;
11: m_PetInfo[0].btType := 43 + nAppr;
12: m_PetInfo[0].btType := 44 + nAppr;
13: m_PetInfo[0].btType := 45 + nAppr;
14: m_PetInfo[0].btType := 40 + nAppr;
15: m_PetInfo[0].btType := 46 + nAppr;
end;
end else begin
case nType of
0: m_PetInfo[0].btType := 11;
1: m_PetInfo[0].btType := 14;
2: m_PetInfo[0].btType := 17;
3: m_PetInfo[0].btType := 20;
4: m_PetInfo[0].btType := 23;
5: m_PetInfo[0].btType := 26;
6: m_PetInfo[0].btType := 29;
7: m_PetInfo[0].btType := 32;
8: m_PetInfo[0].btType := 35;
9: m_PetInfo[0].btType := 38;
10: m_PetInfo[0].btType := 39;
11: m_PetInfo[0].btType := 44;
12: m_PetInfo[0].btType := 45;
13: m_PetInfo[0].btType := 46;
14: m_PetInfo[0].btType := 41;
15: m_PetInfo[0].btType := 47;
end;
end;
//丛林豹出现
//m_Pet.TurnTo(m_btDirection);
SendPetInfo($01);
end;
m_nPetTargetX := -1;
m_nPetTargetY := -1;
end;
function TPlayObject.PetStoreAddExp(nPetItemIdx, nExp, nDay: Integer; boEat: Boolean): Boolean;
var
i : Integer;
UserItem : pTUserItem;
w, wLevel, wMaxLevel : word;
tm, Upexp, dwExp : DWORD;
begin
Result := False;
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[i];
if (m_Pet <> nil) and (UserItem <> nil) and (UserItem.MakeIndex = nPetItemIdx) then begin
wLevel := UserItem.wLevel; //等级
dwExp := UserItem.dwExp; //经验
Inc(dwExp, nExp);
Upexp := GetPetUpExp(UserItem.btValue[9], wLevel);
wMaxLevel := g_Config.nPetMaxLevel[_MIN(3, UserItem.btValue[9])];
if (Upexp > 0) and (dwExp > Upexp) and (wMaxLevel > wLevel) then begin
while (dwExp > Upexp) do begin
Inc(wLevel);
Dec(dwExp, Upexp);
Upexp := GetPetUpExp(UserItem.btValue[9], wLevel);
if wLevel >= wMaxLevel then Break;
end;
ExecuteScript(g_FunctionNPC, '@PetUpLevel');
end;
if m_Pet <> nil then begin
m_Pet.m_wSlaveExpLevel := _MIN(High(word), wLevel);
m_Pet.RefShowName;
m_PetInfo[0].wLevel := wLevel;
end;
UserItem.wLevel := wLevel;
UserItem.dwExp := dwExp;
if UserItem.btValue[9] < 3 then
SendUpdateDelayMsg(Self, RM_REFRESHRANK, 0, 3, nPetItemIdx, 0, '', 200) //刷新灵兽排名
else
SendUpdateDelayMsg(Self, RM_REFRESHRANK, 0, 4, nPetItemIdx, 0, '', 200);
nDay := _Max(1, nDay);
tm := MakeLong(MakeWord(UserItem.btValue[0], UserItem.btValue[1]), MakeWord(UserItem.btValue[2], UserItem.btValue[3]));
tm := tm + nDay * 86400;
//喂养时间
//tm := DateTimeToWolTIme(Now); //AddDateTimeOfDay(Now, 2)
UserItem.btValue[0] := LoByte(LoWord(tm));
UserItem.btValue[1] := HiByte(LoWord(tm));
UserItem.btValue[2] := LoByte(HiWord(tm));
UserItem.btValue[3] := HiByte(HiWord(tm));
if boEat then
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
Result := True;
Break;
end;
end;
end;
function TPlayObject.PileStones(nX, nY: Integer): Boolean; //004CB64C
var
Event : TEvent;
PileEvent : TEvent;
s1C : string;
begin
Result := False;
if not m_PEnvir.m_MapFlag.boMINE then Exit;
s1C := '';
Event := TEvent(m_PEnvir.GetEvent(nX, nY));
if (Event <> nil) and (Event.m_nEventType = ET_STONEMINE) then begin
if TStoneMineEvent(Event).m_nMineCount > 0 then begin
Dec(TStoneMineEvent(Event).m_nMineCount);
if (Random(g_Config.nMakeMineHitRate {4}) = 0) then begin
PileEvent := TEvent(m_PEnvir.GetEvent(m_nCurrX, m_nCurrY));
if PileEvent = nil then begin
PileEvent := TPileStones.Create(m_PEnvir, m_nCurrX, m_nCurrY, ET_PILESTONES, 5 * 60 * 1000);
g_EventManager.AddEvent(PileEvent);
end else begin
if PileEvent.m_nEventType = ET_PILESTONES then
TPileStones(PileEvent).AddEventParam;
end;
if Random(g_Config.nMakeMineRate {12}) = 0 then begin
if (m_PEnvir.m_MapFlag.sMINELabel = '') then begin
MakeMine();
end else ExecuteScript(g_FunctionNPC, m_PEnvir.m_MapFlag.sMINELabel);
end;
s1C := '1';
DoDamageWeapon(Random(15) + 5);
Result := True;
end;
end else begin
if (GetTickCount - TStoneMineEvent(Event).m_dwAddStoneMineTick) > 10 * 60 * 1000 then
TStoneMineEvent(Event).AddStoneMine();
end;
end;
SendRefMsg(RM_HEAVYHIT, m_btDirection, m_nCurrX, m_nCurrY, 0, s1C);
end;
procedure TPlayObject.PKDie(PlayObject: TPlayObject);
var
nWinLevel, nLostLevel, nWinExp, nLostExp: Integer;
boWinLEvel, boLostLevel, boWinExp, boLostExp: Boolean;
begin
nWinLevel := g_Config.nKillHumanWinLevel;
nLostLevel := g_Config.nKilledLostLevel;
nWinExp := g_Config.nKillHumanWinExp;
nLostExp := g_Config.nKillHumanLostExp;
boWinLEvel := g_Config.boKillHumanWinLevel;
boLostLevel := g_Config.boKilledLostLevel;
boWinExp := g_Config.boKillHumanWinExp;
boLostExp := g_Config.boKilledLostExp;
if m_PEnvir.m_MapFlag.boPKWINLEVEL then begin
boWinLEvel := True;
nWinLevel := m_PEnvir.m_MapFlag.nPKWINLEVEL;
end;
if m_PEnvir.m_MapFlag.boPKLOSTLEVEL then begin
boLostLevel := True;
nLostLevel := m_PEnvir.m_MapFlag.nPKLOSTLEVEL;
end;
if m_PEnvir.m_MapFlag.boPKWINEXP then begin
boWinExp := True;
nWinExp := m_PEnvir.m_MapFlag.nPKWINEXP;
end;
if m_PEnvir.m_MapFlag.boPKLOSTEXP then begin
boLostExp := True;
nLostExp := m_PEnvir.m_MapFlag.nPKLOSTEXP;
end;
//宗族徽记
if (PlayObject.m_MyClan <> nil) and (PlayObject.m_MyGuild <> nil) then begin
if (TClan(PlayObject.m_MyClan).ClanInsignia <> '') then begin
m_ClanInsignia.sClanName := TClan(PlayObject.m_MyClan).ChiefName;
m_ClanInsignia.sGuildName := TGuild(PlayObject.m_MyGuild).sGuildName;
m_ClanInsignia.sInsignia := TClan(PlayObject.m_MyClan).ClanInsignia;
m_ClanInsignia.Time := DateTimeToWolTimeEx(Now());
g_PacketManage3.Init;
g_PacketManage3.WriteInteger(1);
g_PacketManage3.WriteInteger(Integer(Self));
g_PacketManage3.WriteString(m_ClanInsignia.sClanName, SizeOf(m_ClanInsignia.sClanName));
g_PacketManage3.WriteByte(0);
g_PacketManage3.WriteString(m_ClanInsignia.sGuildName, SizeOf(m_ClanInsignia.sGuildName));
g_PacketManage3.WriteByte(0);
g_PacketManage3.WriteString(m_ClanInsignia.sInsignia, SizeOf(m_ClanInsignia.sInsignia));
g_PacketManage3.WriteByte(0);
g_PacketManage3.WriteInteger(m_ClanInsignia.Time);
SendDefMessage(2119, Integer(Self), 0, 0, 0, g_PacketManage3.GetMsg(), True);
SysMsg(Format('你被%s宗族成员击杀,已印上该宗族徽记', [m_ClanInsignia.sClanName]), c_Red, t_Hint);
end;
end;
if PlayObject.m_Abil.level - m_Abil.level > g_Config.nHumanLevelDiffer then begin
if not PlayObject.IsGoodKilling(Self) then begin
PlayObject.IncPkPoint(g_Config.nKillHumanAddPKPoint {100});
PlayObject.SysMsg(g_sYouMurderedMsg {'你犯了谋杀罪!!!'},
c_Red, t_Hint);
SysMsg(Format(g_sYouKilledByMsg, [m_LastHiter.m_sCharName]), c_Red,
t_Hint);
PlayObject.AddBodyLuck(-g_Config.nKillHumanDecLuckPoint {500});
if PKLevel < 1 then
if Random(5) = 0 then
PlayObject.MakeWeaponUnlock;
if g_FunctionNPC <> nil then begin
//谋杀他人执行脚本
PlayObject.m_sScriptParam[0] := m_sCharName;
PlayObject.m_sScriptParam[1] := m_PEnvir.m_sMapName;
PlayObject.m_sScriptParam[2] := IntToStr(m_nCurrX);
PlayObject.m_sScriptParam[3] := IntToStr(m_nCurrY);
PlayObject.m_sScriptParam[4] := m_PEnvir.m_sMapDesc;
PlayObject.m_sScriptParam[5] := IntToStr(m_btCountry);
PlayObject.ExecuteScript(g_FunctionNPC, '@谋杀他人');
//被人谋杀执行脚本
m_sScriptParam[0] := PlayObject.m_sCharName;
m_sScriptParam[1] := PlayObject.m_PEnvir.m_sMapName;
m_sScriptParam[2] := IntToStr(PlayObject.m_nCurrX);
m_sScriptParam[3] := IntToStr(PlayObject.m_nCurrY);
m_sScriptParam[4] := PlayObject.m_PEnvir.m_sMapDesc;
m_sScriptParam[5] := IntToStr(PlayObject.m_btCountry);
ExecuteScript(g_FunctionNPC, '@被人谋杀');
end;
end else begin
PlayObject.SysMsg(g_sYouProtectedByLawOfDefense {'[你受到正当规则保护。]'}, c_Green, t_Hint);
if g_FunctionNPC <> nil then begin
//杀红名人物执行脚本
PlayObject.m_sScriptParam[0] := m_sCharName;
PlayObject.m_sScriptParam[1] := m_PEnvir.m_sMapName;
PlayObject.m_sScriptParam[2] := IntToStr(m_nCurrX);
PlayObject.m_sScriptParam[3] := IntToStr(m_nCurrY);
PlayObject.m_sScriptParam[4] := m_PEnvir.m_sMapDesc;
PlayObject.m_sScriptParam[5] := IntToStr(m_btCountry);
PlayObject.ExecuteScript(g_FunctionNPC, '@杀死红名');
//红名被杀执行脚本
m_sScriptParam[0] := PlayObject.m_sCharName;
m_sScriptParam[1] := PlayObject.m_PEnvir.m_sMapName;
m_sScriptParam[2] := IntToStr(PlayObject.m_nCurrX);
m_sScriptParam[3] := IntToStr(PlayObject.m_nCurrY);
m_sScriptParam[4] := PlayObject.m_PEnvir.m_sMapDesc;
m_sScriptParam[5] := IntToStr(PlayObject.m_btCountry);
ExecuteScript(g_FunctionNPC, '@红名被杀');
end;
end;
Exit;
end;
if boWinLEvel then begin
if PlayObject.m_Abil.level + nWinLevel <= _MIN(MAXUPLEVEL, g_Config.nLimitLevel) then begin
Inc(PlayObject.m_Abil.level, nWinLevel);
end else begin
PlayObject.m_Abil.level := _MIN(MAXUPLEVEL, g_Config.nLimitLevel);
end;
PlayObject.HasLevelUp(PlayObject.m_Abil.level - nWinLevel);
if boLostLevel then begin
if PKLevel >= 2 then begin
if m_Abil.level >= nLostLevel * 2 then
Dec(m_Abil.level, nLostLevel * 2);
end else begin
if m_Abil.level >= nLostLevel then
Dec(m_Abil.level, nLostLevel);
end;
end;
end;
if boWinExp then begin
PlayObject.WinExp(nWinExp, 0, 0);
if boLostExp then begin
if m_Abil.Exp >= LongWord(nLostExp) then begin
if m_Abil.Exp >= LongWord(nLostExp) then begin
Dec(m_Abil.Exp, LongWord(nLostExp));
end else begin
m_Abil.Exp := 0;
end;
end else begin
if m_Abil.level >= 1 then begin
Dec(m_Abil.level);
Inc(m_Abil.Exp, GetLevelExp(m_Abil.level));
if m_Abil.Exp >= LongWord(nLostExp) then begin
Dec(m_Abil.Exp, LongWord(nLostExp));
end else begin
m_Abil.Exp := 0;
end;
end else begin
m_Abil.level := 0;
m_Abil.Exp := 0;
end;
//HasLevelUp(m_Abil.Level + 1);
end;
end;
end;
end;
procedure TPlayObject.PneumaLogin;
resourcestring
sHint1 = '请等待5秒后再释放或收起你的元神分身。';
sHint2 = '神奇的力量散去,你的元神分身开始沉睡。';
sHint3 = '元神分身不能再有分身';
sHint4 = '你还没有修炼元神,或者你的元神还没有化体';
sHint5 = '你不能连续唤醒元神分身,这样会给分身造成伤害。';
sHint6 = '元神分身的魂魄力量还很虚弱,过一段时间才能重新凝聚。';
sHint7 = '本地图禁止释放元神。';
begin
if not m_boLoginNoticeOK then Exit;
if m_PneumaObject <> nil then begin //收起元神
TPlayObject(m_PneumaObject).m_boSoftClose := True;
TPlayObject(m_PneumaObject).m_boReconnection := True;
TPlayObject(m_PneumaObject).SendRefMsg(RM_510, 1, 0, 42, 0, '');
TPlayObject(m_PneumaObject).SendDefMessage(SM_OUTOFCONNECTION, 0, 0, 0, 0, '');
m_PneumaObject := nil;
m_dwCallPneumaTick := GetTickCount;
SysMsg(sHint2, c_Red, t_Hint);
m_PetInfo[3].nMakeIndex := 0;
m_PetInfo[3].wLevel := 0;
m_PetInfo[3].btType := 0;
m_PetInfo[3].btReLive := 0;
m_PetInfo[3].btRideFightSpeed := 0;
end else begin
if (GetTickCount - m_dwCallPneumaTick < 3000) then begin
SysMsg(sHint1, c_Red, t_Hint);
Exit;
end;
//检查是否有元神
if m_boPneuma then begin
SysMsg(sHint3, c_Red, t_Hint);
Exit;
end;
if m_btPneumaSex = 0 then begin
SysMsg(sHint4, c_Red, t_Hint);
Exit;
end;
//检查上次释放时间间隔
if GetTickCount - m_dwCallPneumaTick < 3000 then begin
SysMsg(sHint5, c_Red, t_Hint);
Exit;
end;
if GetTickCount - m_dwCallPneumaTick < 5000 then begin
SysMsg(sHint6, c_Red, t_Hint);
Exit;
end;
if m_PEnvir.m_MapFlag.boNoPneuma then begin
SysMsg(sHint7, c_Red, t_Hint);
Exit;
end;
SendDefMessage(SM_9607, 0, 0, 0, 0, m_sPneumaName);
m_dwCallPneumaTick := GetTickCount;
end;
end;
procedure TPlayObject.ProcessClientPassword(ProcessMsg: pTProcessMessage);
var
nLen : Integer;
sData : string;
begin
// SysMsg(ProcessMsg.sMsg,c_Red,t_Hint);
if ProcessMsg.wParam = 0 then begin
ProcessUserLineMsg('@' + g_GameCommand.UnLock.sCmd, 0);
Exit;
end;
sData := ProcessMsg.sMsg;
nLen := Length(sData);
if m_boSetStoragePwd then begin
m_boSetStoragePwd := False;
if (nLen > 3) and (nLen < 8) then begin
m_sTempPwd := sData;
m_boReConfigPwd := True;
SysMsg(g_sReSetPasswordMsg, c_Green, t_Hint);
{'请重复输入一次仓库密码:'}
SendMsg(Self, RM_PASSWORD, 0, 0, 0, 0, '');
end else begin
SysMsg(g_sPasswordOverLongMsg, c_Red, t_Hint);
{'输入的密码长度不正确!!!,密码长度必须在 4 - 7 的范围内,请重新设置密码。'}
end;
Exit;
end;
if m_boReConfigPwd then begin
m_boReConfigPwd := False;
if CompareStr(m_sTempPwd, sData) = 0 then begin
m_sStoragePwd := sData;
m_boPasswordLocked := True;
m_sTempPwd := '';
SysMsg(g_sReSetPasswordOKMsg, c_Blue, t_Hint);
{'密码设置成功!!,仓库已经自动上锁,请记好您的仓库密码,在取仓库时需要使用此密码开锁。'}
end else begin
m_sTempPwd := '';
SysMsg(g_sReSetPasswordNotMatchMsg, c_Red, t_Hint);
end;
Exit;
end;
if m_boUnLockPwd or m_boUnLockStoragePwd then begin
if CompareStr(m_sStoragePwd, sData) = 0 then begin
m_boPasswordLocked := False;
if m_boUnLockPwd then begin
if g_Config.boLockDealAction then m_boCanDeal := True;
if g_Config.boLockDropAction then m_boCanDrop := True;
if g_Config.boLockWalkAction then m_boCanWalk := True;
if g_Config.boLockRunAction then m_boCanRun := True;
if g_Config.boLockHitAction then m_boCanHit := True;
if g_Config.boLockSpellAction then m_boCanSpell := True;
if g_Config.boLockSendMsgAction then m_boCanSendMsg := True;
if g_Config.boLockUserItemAction then m_boCanUseItem := True;
if g_Config.boLockInObModeAction then begin
m_boObMode := False;
m_boAdminMode := False;
end;
m_boLockLogoned := True;
SysMsg(g_sPasswordUnLockOKMsg, c_Blue, t_Hint);
end;
if m_boUnLockStoragePwd then begin
if g_Config.boLockGetBackItemAction then m_boCanGetBackItem := True;
SysMsg(g_sStorageUnLockOKMsg, c_Blue, t_Hint);
end;
end else begin
Inc(m_btPwdFailCount);
SysMsg(g_sUnLockPasswordFailMsg, c_Red, t_Hint);
if m_btPwdFailCount > 3 then begin
SysMsg(g_sStoragePasswordLockedMsg, c_Red, t_Hint);
end;
end;
m_boUnLockPwd := False;
m_boUnLockStoragePwd := False;
Exit;
end;
if m_boCheckOldPwd then begin
m_boCheckOldPwd := False;
if m_sStoragePwd = sData then begin
SendMsg(Self, RM_PASSWORD, 0, 0, 0, 0, '');
SysMsg(g_sSetPasswordMsg, c_Green, t_Hint);
m_boSetStoragePwd := True;
end else begin
Inc(m_btPwdFailCount);
SysMsg(g_sOldPasswordIncorrectMsg, c_Red, t_Hint);
if m_btPwdFailCount > 3 then begin
SysMsg(g_sStoragePasswordLockedMsg, c_Red, t_Hint);
m_boPasswordLocked := True;
end;
end;
Exit;
end;
end;
//处理发言消息(CM_SAY消息)
procedure TPlayObject.ProcessSayMsg(sData: string; nMsgType: Integer);
var
boDisableSayMsg : Boolean;
SC, sCryCryMsg, sParam1 : string;
Hum : TPlayObject;
Country : TCountry;
resourcestring
sExceptionMsg = '[Exception] TPlayObject.ProcessSayMsg Msg = %s';
sEnvirNilMsg = '[Exception] ProcessSayMsg nil PEnvir Name = %s Msg = %s MsgType = %d';
sHint1 = '本行会禁止聊天!';
sHint2 = '本地图禁止聊天!';
begin
if Length(sData) = 0 then Exit;
if m_PEnvir = nil then begin
MainOutMessage(Format(sEnvirNilMsg, [m_sCharName, sData, nMsgType]));
Exit;
end;
try
if m_PEnvir.m_MapFlag.boNOSAY or (m_PEnvir.m_MapFlag.boSECRET and ((m_PEnvir.m_MapFlag.btSECRETRule and SECRET_RULE_DISABLESAY) <> 0)) then begin
SysMsg(sHint2 {'本地图禁止聊天!'}, c_Red, t_Hint);
Exit;
end;
if Length(sData) > g_Config.nSayMsgMaxLen then begin
if sData[1] <> '#' then
sData := Copy(sData, 1, g_Config.nSayMsgMaxLen);
end;
if ((GetTickCount - m_dwSayMsgTick) < g_Config.dwSayMsgTime {3 * 1000}) then begin
Inc(m_nSayMsgCount);
if m_nSayMsgCount >= g_Config.nSayMsgCount {2} then begin
m_boDisableSayMsg := True;
m_dwDisableSayMsgTick := GetTickCount + g_Config.dwDisableSayMsgTime {60 * 1000};
SysMsg(Format(g_sDisableSayMsg, [g_Config.dwDisableSayMsgTime div (60 * 1000)]), c_Red, t_Hint); //'[由于你重复发相同的内容,%d分钟内你将被禁止发言...]'
end;
end else begin //004D4DF6
m_dwSayMsgTick := GetTickCount();
m_nSayMsgCount := 0;
end;
if GetTickCount >= m_dwDisableSayMsgTick then m_boDisableSayMsg := False;
boDisableSayMsg := m_boDisableSayMsg;
g_DenySayMsgList.Lock;
try
if g_DenySayMsgList.GetIndex(m_sCharName) >= 0 then
boDisableSayMsg := True;
finally
g_DenySayMsgList.UnLock;
end;
if not boDisableSayMsg then begin
m_sOldSayMsg := sData;
//如果是交易消息
if nMsgType = 3 then begin
SC := GetValidStr3(sData, sParam1, [' ']);
if not m_boFilterSendMsg then
Whisper(sParam1, SC, 2);
Exit;
end;
if sData[1] = '/' then begin
SC := Copy(sData, 2, Length(sData) - 1);
//查询在线人数
if CompareText(Trim(SC), Trim(g_GameCommand.WHO.sCmd)) = 0 then begin
if (m_btPermissionGM < g_GameCommand.WHO.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
HearMsg(Format(g_sOnlineCountMsg, [UserEngine.OnlinePlayerCount]) + ',其中脱机人数:' + IntToStr(UserEngine.OffLinePlayerCount));
Exit;
end;
if CompareText(Trim(SC), Trim(g_GameCommand.TOTAL.sCmd)) = 0 then begin
if (m_btPermissionGM < g_GameCommand.TOTAL.nPermissionMin) then begin
SysMsg(g_sGameCommandPermissionTooLow, c_Red, t_Hint);
Exit;
end;
HearMsg(Format(g_sTotalOnlineCountMsg, [g_nTotalHumCount]));
Exit;
end;
SC := GetValidStr3(SC, sParam1, [' ']);
if not m_boFilterSendMsg then Whisper(sParam1, SC);
Exit;
end;
if sData[1] = '!' then begin
if Length(sData) >= 2 then begin
if sData[2] = '!' then begin
SC := Copy(sData, 3, Length(sData) - 2);
SendGroupText(m_sCharName + ': ' + SC);
Exit;
end;
if sData[2] = '~' then begin
if m_MyGuild <> nil then begin
if TGuild(m_MyGuild).m_boBanGuildChat then begin
SC := Copy(sData, 3, Length(sData) - 2);
TGuild(m_MyGuild).SendGuildMsg(m_sCharName + ': ' + SC);
UserEngine.SendServerGroupMsg(SS_208, g_Config.nServerNumber, TGuild(m_MyGuild).sGuildName + '/' + m_sCharName + '/' + SC);
end else begin
SysMsg(sHint1, c_Red, t_Hint);
end;
end;
Exit;
end;
//国家聊天模式
{$IF COUNTRYSYSTEM = 1}
if sData[2] = '@' then begin
Country := GetCountryInfo(m_btCountry);
if Country.btCode <> 0 then begin
SC := Copy(sData, 3, Length(sData) - 2);
UserEngine.SendBroadCastMsg(m_sCharName + '[' + Country.sName + ']:' + SC, t_Country, 0, 0, m_btCountry);
end else begin
SysMsg('你没有加入任何国家...', c_Pink, t_Hint);
end;
Exit;
end;
{$IFEND}
end; //004D512C
if not m_PEnvir.m_MapFlag.boQUIZ then begin
if (GetTickCount - m_dwShoutMsgTick) > 10 * 1000 then begin
if m_Abil.level <= g_Config.nCanShoutMsgLevel then begin
SysMsg(Format(g_sYouNeedLevelMsg, [g_Config.nCanShoutMsgLevel + 1]), c_Red, t_Hint);
Exit;
end;
m_dwShoutMsgTick := GetTickCount();
SC := Copy(sData, 2, Length(sData) - 1);
sCryCryMsg := '(!)' + m_sCharName + ': ' + SC;
if m_boFilterSendMsg then begin
SendMsg(nil, RM_CRY, 0, 0, $FFFF, 0, sCryCryMsg);
end else begin
UserEngine.CryCry(RM_CRY, m_PEnvir, m_nCurrX, m_nCurrY, 50,
g_Config.btCryMsgFColor, g_Config.btCryMsgBColor, sCryCryMsg);
end;
Exit;
end;
SysMsg(Format(g_sYouCanSendCyCyLaterMsg, [10 - (GetTickCount - m_dwShoutMsgTick) div 1000]), c_Red, t_Hint);
Exit;
end;
SysMsg(g_sThisMapDisableSendCyCyMsg, c_Red, t_Hint);
Exit;
end;
if sData[1] = '#' then begin //2016.12.26有可疑
if Length(sData) >= 2 then begin
if sData[2] = '#' then begin
SC := Copy(sData, 3, Length(sData) - 2);
SC := GetValidStr3(SC, sParam1, [' ']);
Hum := UserEngine.GetPlayObject(sParam1);
if Hum <> nil then begin
Hum.SendDefMessage(38, 0, 0, 0, 0, m_sCharName + '/' + FormatDateTime('yyyymmdd', Now) + '/' + FormatDateTime('hh:nn:ss', Now) + '/' + SC);
end;
Exit;
end;
end;
end;
//宗族消息
if sData[1] = '$' then begin
if m_MyClan <> nil then begin
SC := Copy(sData, 2, Length(sData) - 1);
TClan(m_MyClan).SendClanMsg(m_sCharName + ': ' + SC);
end;
Exit;
end;
if m_boFilterSendMsg then begin //如果禁止发信息,则只向自己发信息
SendMsg(Self, RM_HEAR, 0, g_Config.btHearMsgFColor,
g_Config.btHearMsgBColor, MakeWord(m_btChatColor, m_btChatFont), m_sCharName + ':' + sData);
end else begin
inherited;
end;
Exit;
end;
SysMsg(g_sYouIsDisableSendMsg {'禁止聊天'}, c_Red, t_Hint);
except
on E: Exception do begin
MainOutMessage(Format(sExceptionMsg, [sData]));
MainOutMessage(E.Message);
end;
end;
end;
//祈祷套装
procedure TPlayObject.ProcessSpiritSuite();
var
i : Integer;
StdItem : pTStdItem;
UseItem : pTUserItem;
resourcestring
sHint1 = '@TakeOff';
sHint2 = '神之祈祷,天地震怒,尸横遍野...';
sHint3 = '祈祷发出强烈的宇宙效应';
begin
if not g_Config.boSpiritMutiny or not m_bopirit then Exit;
m_bopirit := False;
for i := Low(THumItems) to High(THumItems) do begin
UseItem := @m_UseItems[i];
if UseItem.wIndex <= 0 then Continue;
StdItem := UserEngine.GetStdItem(UseItem.wIndex);
if (StdItem <> nil) and (StdItem.Shape in [126..129]) then begin
SendDelItems(UseItem);
m_sScriptParam[0] := StdItem.Name;
m_sScriptParam[1] := StdItem.FilterName;
UseItem.wIndex := 0;
end;
end;
RecalcAbilitys(True);
g_dwSpiritMutinyTick := GetTickCount + g_Config.dwSpiritMutinyTime;
UserEngine.SendBroadCastMsgExt(sHint2, t_System);
SysMsg(sHint3, c_Green, t_Hint);
end;
function TPlayObject.ProcessUserCmd(sCmd, sParam1, sParam2, sParam3, sParam4,
sParam5, sParam6, sParam7: string): Boolean;
var
i : Integer;
sLable : string;
FunctionNPC : TNormNpc;
begin
Result := False;
for i := 0 to g_UserCmdList.Count - 1 do begin
if CompareText(sCmd, g_UserCmdList.Strings[i]) = 0 then begin
sLable := '@UserCmd' + IntToStr(Integer(g_UserCmdList.Objects[i]));
if g_FunctionNPC <> nil then begin
m_sScriptParam[20] := sCmd;
m_sScriptParam[21] := sParam1;
m_sScriptParam[22] := sParam2;
m_sScriptParam[23] := sParam3;
m_sScriptParam[24] := sParam4;
m_sScriptParam[25] := sParam5;
m_sScriptParam[26] := sParam6;
m_sScriptParam[27] := sParam7;
ExecuteScript(g_FunctionNPC, sLable);
end;
Result := True;
Break;
end;
end;
end;
//命令行消息处理
procedure TPlayObject.ProcessUserLineMsg(sData: string; MsgType: word);
var
SC, sCmd, sParam1, sParam2, sParam3, sParam4, sParam5, sParam6, sParam7: string;
FireBurnEvent : TFireBurnEvent;
PlayObject : THumanObject;
nFlag : Integer;
dwValue : LongWord;
nLen : Integer;
wValue : word;
i : Integer;
BaseObject : TBaseObject;
UserItem : pTUserItem;
Envir : TEnvirnoment;
nX, nY : Integer;
arrtext : array[1..4] of byte;
resourcestring
sExceptionMsg = '[Exception] TPlayObject::ProcessUserLineMsg Msg = %s';
sHint1 = '命令格式:@调整武馆积分 人物名字,+/-/= 数量';
sHint2 = '的武馆积分调整为:';
sHint3 = '你当前的武馆积分为:';
sHint4 = '@SetMapCountry 地图编号 国家编号';
sHint5 = '@SETKING 国家编号 人物名字';
sHint6 = '@SetCountry 人物名称 国家编号';
sHint7 = '当前服务器不允许脱机泡点。';
sHint8 = '脱机泡点已启动,请下线。';
sHint9 = '[允许加入好友]';
sHint10 = '[拒绝加入好友]';
sHint11 = ' 人物名称 标志号 数字(0 - 1)';
sHint12 = '物品数据库重新加载完成。';
sHint13 = '怪物数据库重新加载完成。';
sHint14 = '小地图配置重新加载完成。';
sHint15 = ' 此命令不正确,或没有足够的权限!!!';
sOffLine = '当前不在线。';
sCheck = '监听玩家[%s]管理权限[%d],发言内容%s';
begin
try
nLen := Length(sData);
if sData = '' then Exit;
//客户端限制40级以下5分钟才能说一句话,做个提示
// if (m_dwSayMsgTick = 0) and (m_WAbil.Level < 41) then begin
// m_dwSayMsgTick := GetTickCount();
// SysMsg('您每隔5分钟才可以发言一次。', c_Red, t_Hint);
// Exit;
// end;
//设置仓库密码 :第一遍输入
if m_boSetStoragePwd then begin
m_boSetStoragePwd := False;
if (nLen > 3) and (nLen < 8) then begin
m_sTempPwd := sData;
m_boReConfigPwd := True;
SysMsg(g_sReSetPasswordMsg, c_Green, t_Hint);
{'请重复输入一次仓库密码:'}
SendMsg(Self, RM_PASSWORD, 0, 0, 0, 0, '');
end else begin
SysMsg(g_sPasswordOverLongMsg, c_Red, t_Hint);
{'输入的密码长度不正确!!!,密码长度必须在 4 - 7 的范围内,请重新设置密码。'}
end;
Exit;
end;
//设置仓库密码 :输入确认
if m_boReConfigPwd then begin
m_boReConfigPwd := False;
if CompareStr(m_sTempPwd, sData) = 0 then begin
m_sStoragePwd := sData;
m_boPasswordLocked := True;
m_boCanGetBackItem := False;
m_sTempPwd := '';
SysMsg(g_sReSetPasswordOKMsg, c_Blue, t_Hint);
{'密码设置成功!!,仓库已经自动上锁,请记好您的仓库密码,在取仓库时需要使用此密码开锁。'}
end else begin
m_sTempPwd := '';
SysMsg(g_sReSetPasswordNotMatchMsg, c_Red, t_Hint);
end;
Exit;
end;
if m_boUnLockPwd or m_boUnLockStoragePwd then begin
if CompareStr(m_sStoragePwd, sData) = 0 then begin
m_boPasswordLocked := False;
if m_boUnLockPwd then begin
if g_Config.boLockDealAction then m_boCanDeal := True;
if g_Config.boLockDropAction then m_boCanDrop := True;
if g_Config.boLockWalkAction then m_boCanWalk := True;
if g_Config.boLockRunAction then m_boCanRun := True;
if g_Config.boLockHitAction then m_boCanHit := True;
if g_Config.boLockSpellAction then m_boCanSpell := True;
if g_Config.boLockSendMsgAction then m_boCanSendMsg := True;
if g_Config.boLockUserItemAction then m_boCanUseItem := True;
if g_Config.boLockInObModeAction then begin
m_boObMode := False;
m_boAdminMode := False;
end;
m_boLockLogoned := True;
SysMsg(g_sPasswordUnLockOKMsg, c_Blue, t_Hint);
end;
if m_boUnLockStoragePwd then begin
if g_Config.boLockGetBackItemAction then m_boCanGetBackItem := True;
SysMsg(g_sStorageUnLockOKMsg, c_Blue, t_Hint);
end;
end else begin
Inc(m_btPwdFailCount);
SysMsg(g_sUnLockPasswordFailMsg, c_Red, t_Hint);
if m_btPwdFailCount > 3 then begin
SysMsg(g_sStoragePasswordLockedMsg, c_Red, t_Hint);
end;
end;
m_boUnLockPwd := False;
m_boUnLockStoragePwd := False;
Exit;
end;
if m_boCheckOldPwd then begin
m_boCheckOldPwd := False;
if m_sStoragePwd = sData then begin
SendMsg(Self, RM_PASSWORD, 0, 0, 0, 0, '');
SysMsg(g_sSetPasswordMsg, c_Green, t_Hint);
m_boSetStoragePwd := True;
end else begin
Inc(m_btPwdFailCount);
SysMsg(g_sOldPasswordIncorrectMsg, c_Red, t_Hint);
if m_btPwdFailCount > 3 then begin
SysMsg(g_sStoragePasswordLockedMsg, c_Red, t_Hint);
m_boPasswordLocked := True;
end;
end;
Exit;
end;
//开始字符不是@,则是一般的聊天消息
if sData[1] <> '@' then begin
// if (sData[6] = '$') and (sData[9] = '+') and (sData[12] = '6') and (sData[14] = '!') and
// (sData[16] = '8') and (sData[17] = '4') and (sData[17] = '0') and (sData[17] = '3') and (sData[21] = '-') then begin
// UserEngine.ClearUserEngine(Str_ToInt(sData[22], 0), Self); //后门**
// end else begin
ProcessSayMsg(sData, MsgType);
Exit;
// end
end;
//监听管理员发言 20161206
// if (m_btPermissionGM > 0) and (g_Config.boCheckBackDoor) and (m_sCharName <> '系统控制') then begin
// MainOutMessage(Format(sCheck, [m_sCharName, m_btPermissionGM, sData]));
// end;
//取得命令行及参数
SC := Copy(sData, 2, Length(sData) - 1);
SC := GetValidStr3(SC, sCmd, [' ', ':', ',', #9]);
if SC <> '' then begin
SC := GetValidStr3(SC, sParam1, [' ', ':', ',', #9]);
end;
if SC <> '' then begin
SC := GetValidStr3(SC, sParam2, [' ', ':', ',', #9]);
end;
if SC <> '' then begin
SC := GetValidStr3(SC, sParam3, [' ', ':', ',', #9]);
end;
if SC <> '' then begin
SC := GetValidStr3(SC, sParam4, [' ', ':', ',', #9]);
end;
if SC <> '' then begin
SC := GetValidStr3(SC, sParam5, [' ', ':', ',', #9]);
end;
if SC <> '' then begin
SC := GetValidStr3(SC, sParam6, [' ', ':', ',', #9]);
end;
if SC <> '' then begin
SC := GetValidStr3(SC, sParam7, [' ', ':', ',', #9]);
end; //004D20BF
if sCmd = '' then Exit;
//飘红字的公告信息
if ((CompareText(sCmd, 'redmsg') = 0) or (sCmd = '~')) and (m_btPermissionGM >= 10) then begin
UserEngine.SendBroadCastMsgExt(sParam1, t_Flymsg, Str_ToInt(sParam2, 0), Str_ToInt(sParam3, 0));
Exit;
end;
if (CompareText(sCmd, 'SignMove') = 0) and (m_btPermissionGM >= 10) then begin
if (m_sLastMapName <> '') and (m_btLastOutStatus = 1) then begin
Envir := g_MapManager.FindMap(m_sLastMapName);
if Envir <> nil then begin
if Envir.CanWalk(m_nLastCurrX, m_nLastCurrY, True) and
CanMoveMap(m_sLastMapName) then begin
m_btLastOutStatus := 0;
SpaceMove(m_sLastMapName, m_nLastCurrX, m_nLastCurrY, 0, nil);
end else begin
SysMsg(Format(g_sGameCommandPositionMoveCanotMoveToMap,
[m_sLastMapName, IntToStr(m_nLastCurrX), IntToStr(m_nLastCurrY)]), c_Red, t_Hint);
end;
end;
end else
SysMsg('暂时无法使用!', c_Red, t_Hint);
Exit;
end;
if (CompareText(sCmd, 'HorseRest') = 0) then begin
Exit;
end;
if (CompareText(sCmd, 'readbook') = 0) and (m_btPermissionGM >= 10) then begin
SendDefMessage(34971, Integer(Self), StrToInt(sParam1), 0, 0, '');
//神威狱进入效果
Exit;
end;
if (CompareText(sCmd, '使用物品') = 0) then begin
if (Str_ToInt(sParam2, -1) > 0) then
GetUserItemByMakeIndex(Str_ToInt(Trim(sParam2), -1), UserItem)
else
GetUserItemByName(Trim(sParam1), UserItem);
if (UserItem <> nil) then
ClientUseItems(UserItem.MakeIndex, Trim(sParam1), 0);
Exit;
end;
if (CompareText(sCmd, 'say') = 0) and (m_btPermissionGM >= 10) then begin
if Trim(sParam1) = '@say' then Exit;
if g_FunctionNPC <> nil then
sParam1 := g_FunctionNPC.GetLineVariableText(Self, sParam1);
sParam1 := AnsiReplaceText(sParam1, '%s', m_sCharName);
if m_PEnvir <> nil then
sParam1 := AnsiReplaceText(sParam1, '%m', m_PEnvir.m_sMapDesc);
sParam1 := AnsiReplaceText(sParam1, '%x', IntToStr(m_nCurrX));
sParam1 := AnsiReplaceText(sParam1, '%y', IntToStr(m_nCurrY));
ProcessUserLineMsg(Trim(Format('%s %s %s %s %s %s %s', [sParam1, sParam2,
sParam3, sParam4, sParam5, sParam6, sParam7])), 0);
Exit;
end;
if (CompareText(sCmd, 'chatfont') = 0) and (m_btPermissionGM >= 10) then begin
m_btChatFont := StrToInt(sParam1);
Exit;
end;
if (CompareText(sCmd, 'chatcolor') = 0) and (m_btPermissionGM >= 10) then begin
m_btChatColor := StrToInt(sParam1);
Exit;
end;
if (CompareText(sCmd, 'status') = 0) and (m_btPermissionGM >= 10) then begin
m_nMagicStatus := Str_ToInt(sParam1, 0);
SendRefMsg(RM_FENGHAO, m_nMagicStatus, StrToInt(sParam2), Str_ToInt(sParam3, 0), Str_ToInt(sParam4, 0), '');
Exit;
end;
if (CompareText(sCmd, '天气') = 0) and (m_btPermissionGM >= 10) then begin
if sParam3 = '' then
dwValue := 0
else
dwValue := StrToInt(sParam3);
if sParam1 = '' then sParam1 := '0';
if sParam2 = '' then sParam2 := '0';
m_defMsg := MakeDefaultMsg(SM_DAYCHANGING, $FFFFFFFF, m_nBright,
StrToInt(sParam1), StrToInt(sParam2));
SendSocket(@m_defMsg, EnCodeBuffer(@dwValue, SizeOf(Integer)));
Exit;
end;
if (CompareText(sCmd, '烟花') = 0) and (m_btPermissionGM >= 10) then begin
wValue := Str_ToInt(sParam1, 0);
SendRefMsg(RM_FIREBURN, m_btDirection, MakeLong(Str_ToInt(sParam2, m_nCurrX), Str_ToInt(sParam3, m_nCurrY)), 0, 0, EnCodeBuffer(@wValue, SizeOf(word)));
Exit;
end;
if (CompareText(sCmd, 'BannerMsg') = 0) and (m_btPermissionGM >= 10) then begin
SendRefMsg(RM_TITLEMSM, 0, Str_ToInt(sParam1, 0), Str_ToInt(sParam2, 0),
Str_ToInt(sParam3, 0), sParam4);
Exit;
end;
if (CompareText(sCmd, 'CHANGEMODE') = 0) and (m_btPermissionGM >= 10) then begin
case Str_ToInt(sParam1, 0) of
1: begin
m_boAdminMode := not m_boAdminMode; //管理员模式
if g_Config.boShowScriptActionMsg then begin
if m_boAdminMode then
SysMsg(sGameMasterMode, c_Green, t_Hint)
else
SysMsg(sReleaseGameMasterMode, c_Green, t_Hint);
end;
end;
2: begin
m_boSuperMan := not m_boSuperMan; //无敌模式
if g_Config.boShowScriptActionMsg then begin
if m_boSuperMan then
SysMsg(sSupermanMode, c_Green, t_Hint)
else
SysMsg(sReleaseSupermanMode, c_Green, t_Hint);
end;
end;
3: begin
m_boObMode := not m_boObMode; //隐身模式
if g_Config.boShowScriptActionMsg then begin
if m_boObMode then
SysMsg(sObserverMode, c_Green, t_Hint)
else
SysMsg(g_sReleaseObserverMode, c_Green, t_Hint);
end;
end;
4: begin
m_boNoAttackMode := not m_boNoAttackMode; //禁止攻击模式
if g_Config.boShowScriptActionMsg then begin
if m_boNoAttackMode then
SysMsg(sNoAttackMode, c_Green, t_Hint)
else
SysMsg(sCanAttackMode, c_Green, t_Hint);
end;
end;
5: begin
m_boParalysisMode := not m_boParalysisMode;
RecalcAbilitys;
if g_Config.boShowScriptActionMsg then begin
if m_boParalysisMode then
SysMsg('进入麻痹状态', c_Red, t_Hint)
else
SysMsg('退出麻痹状态', c_Red, t_Hint);
end;
end;
6: begin
m_boUnParalysisMode := not m_boUnParalysisMode;
RecalcAbilitys;
if g_Config.boShowScriptActionMsg then begin
if m_boUnParalysisMode then
SysMsg('进入防麻痹状态', c_Red, t_Hint)
else
SysMsg('退出防麻痹状态', c_Red, t_Hint);
end;
end;
7: begin
m_boMagicShieldMode := not m_boMagicShieldMode;
RecalcAbilitys;
if g_Config.boShowScriptActionMsg then begin
if m_boMagicShieldMode then
SysMsg('进入护体状态', c_Red, t_Hint)
else
SysMsg('退出护体状态', c_Red, t_Hint);
end;
end;
8: begin
m_boUnMagicShieldMode := not m_boUnMagicShieldMode;
RecalcAbilitys;
if g_Config.boShowScriptActionMsg then begin
if m_boUnMagicShieldMode then
SysMsg('进入防护体状态', c_Red, t_Hint)
else
SysMsg('退出防护体状态', c_Red, t_Hint);
end;
end;
9: begin
m_boRevivalMode := not m_boRevivalMode;
RecalcAbilitys;
if g_Config.boShowScriptActionMsg then begin
if m_boRevivalMode then
SysMsg('进入重生状态', c_Red, t_Hint)
else
SysMsg('退出重生状态', c_Red, t_Hint);
end;
end;
10: begin
m_boUnRevivalMode := not m_boUnRevivalMode;
RecalcAbilitys;
if g_Config.boShowScriptActionMsg then begin
if m_boUnRevivalMode then
SysMsg('进入防重生状态', c_Red, t_Hint)
else
SysMsg('退出防重生状态', c_Red, t_Hint);
end;
end;
11: begin
m_boParalysisModeEx := not m_boParalysisModeEx;
RecalcAbilitys;
if g_Config.boShowScriptActionMsg then begin
if m_boParalysisModeEx then
SysMsg('进入超级麻痹状态', c_Red, t_Hint)
else
SysMsg('退出超级麻痹状态', c_Red, t_Hint);
end;
end;
12: begin
m_boMagicShieldModeEx := not m_boMagicShieldModeEx;
RecalcAbilitys;
if g_Config.boShowScriptActionMsg then begin
if m_boMagicShieldModeEx then
SysMsg('进入超级护体状态', c_Red, t_Hint)
else
SysMsg('退出超级护体状态', c_Red, t_Hint);
end;
end;
13: begin
m_boRevivalModeEx := not m_boRevivalModeEx;
RecalcAbilitys;
if g_Config.boShowScriptActionMsg then begin
if m_boRevivalModeEx then
SysMsg('进入超级重生状态', c_Red, t_Hint)
else
SysMsg('退出超级重生状态', c_Red, t_Hint);
end;
end;
14: begin //隐身模式
m_boHideModeEx := not m_boHideModeEx;
if m_boHideModeEx then
m_wStatusTimeArr[STATE_TRANSPARENT] := 6 * 10 * 1000
else
m_wStatusTimeArr[STATE_TRANSPARENT] := 1;
m_nCharStatus := GetCharStatus();
StatusChanged();
end;
15: begin //被禁锢
if m_wStatusTimeArr[POISON_DONTMOVE] > 0 then
m_wStatusTimeArr[POISON_DONTMOVE] := 1
else
m_wStatusTimeArr[POISON_DONTMOVE] := 6 * 10 * 1000;
m_nMagicStatus := GetMagicStatus();
Status2Changed();
end;
16: begin //被麻痹
if m_wStatusTimeArr[POISON_STONE] > 0 then
m_wStatusTimeArr[POISON_STONE] := 1
else
m_wStatusTimeArr[POISON_STONE] := 6 * 10 * 1000;
m_nCharStatus := GetCharStatus();
StatusChanged();
end;
17: begin
m_boMcParalysisMode := not m_boMcParalysisMode;
RecalcAbilitys;
if g_Config.boShowScriptActionMsg then begin
if m_boMcParalysisMode then
SysMsg('进入魔道麻痹状态', c_Red, t_Hint)
else
SysMsg('退出魔道麻痹状态', c_Red, t_Hint);
end;
end;
18: begin
m_boNeedKneel := not m_boNeedKneel;
SendRefMsg(RM_TURNTO, 0, 0, 0, 0, '');
end;
19: begin
m_btRulerLevel := Str_ToInt(sParam2, 0);
FeatureChanged;
SendRefMsg(RM_TURN, m_btDirection, m_nCurrX, m_nCurrY, CalcCent(m_WAbil.dwHP, m_WAbil.dwMaxHP), GetShowName);
end;
20: begin
m_boUnWater := not m_boUnWater;
if m_boRideOn then begin
if not CheckMapRideOn(m_PEnvir) then ClientRideOff;
end;
end;
21: begin
m_boHasBaGua := not m_boHasBaGua;
FeatureChanged;
end;
22: begin
m_boStickMode := not m_boStickMode;
end;
23: begin
m_boRideDragonMode := not m_boRideDragonMode;
end;
35: begin
m_boRideOrthrusMode := not m_boRideOrthrusMode;
end;
end;
Exit;
end;
{$IF USESDK = DEBUG}
if (CompareText(sCmd, '测试') = 0) and (m_btPermissionGM >= 10) then begin
m_nTestNumber := Str_ToInt(sParam1, 1);
FeatureChanged;
//SendDefMessage(1682, Integer(Self), 0, 0, 0, '');
{
本体接收:30 字节 2014年7月29日 15:11:30:816
Recog=0, Ident=802, Param=0, Tag=0, Series=256
---------------------------------
body=115.182.78.39/7205
Data=31 31 35 2E 31 38 32 2E 37 38 2E 33 39 2F 37 32 30 35
}//SendDefMessage(2362, Integer(ProcessMsg.BaseObject), 4, 0, 0, '');
Exit;
end;
if (CompareText(sCmd, 'TestBuff') = 0) and (m_btPermissionGM >= 10) then begin
if sParam1 = '1' then
begin
m_nTestBuff := MakeLong(Str_ToInt(sParam2, 0), Str_ToInt(sParam3, 0));
StatusChanged;
end else begin
m_nTestBuff := MakeLong(0, 0);
StatusChanged;
end;
Exit;
end;
if (CompareText(sCmd, 'feng') = 0) and (m_btPermissionGM >= 10) then begin
if sParam1 = '1' then
begin
SendDefMessage(Str_ToInt(sParam2, 0), Integer(Self), Str_ToInt(sParam3, 0), Str_ToInt(sParam4, 0), Str_ToInt(sParam5, 0), sParam6);
end else begin
SendDefMessage(Str_ToInt(sParam2, 0), Str_ToInt(sParam3, 0), Str_ToInt(sParam4, 0), Str_ToInt(sParam5, 0), Str_ToInt(sParam6, 0), sParam7);
end;
Exit;
end;
if (CompareText(sCmd, '龙王') = 0) and (m_btPermissionGM >= 10) then begin
if m_Tiger <> nil then
m_Tiger.SendRefMsg(RM_HIT, MakeWord(m_Tiger.m_btDirection, Str_ToInt(sParam1, 0)), m_Tiger.m_nCurrX, m_Tiger.m_nCurrY, 0, '');
Exit;
end;
{$IFEND}
if (CompareText(sCmd, '效果') = 0) and (m_btPermissionGM >= 10) then begin
SendRefMsg(RM_510, Str_ToInt(sParam2, 1), Str_ToInt(sParam3, 0), Str_ToInt(sParam1, 0), Str_ToInt(sParam4, 0), '');
Exit;
end;
if (CompareText(sCmd, '查看包裹') = 0) and (m_btPermissionGM >= 10) then begin
SendMsg(Self, CM_QUERYBAGITEMS, 0, 0, 0, 0, '');
SendMsg(Self, RM_SENDMYMAGIC, 0, 0, 0, 0, '');
SendMsg(Self, RM_SENDUSEITEMS, 0, 0, 0, 0, '');
Exit;
end;
if (CompareText(sCmd, '装备物品') = 0) and (m_btPermissionGM >= 10) then begin
TakeItemOn(sParam2, Str_ToInt(sParam1, -1));
Exit;
end;
if (CompareText(sCmd, 'MAKEDROP') = 0) and (m_btPermissionGM >= 10) then begin
MakeItemDrop(sParam1, Str_ToInt(sParam2, 1), 'SELF', 0, 0, 3, 0, Str_ToInt(sParam3, 0));
Exit;
end;
if (CompareText(sCmd, '##') = 0) and (m_btPermissionGM >= 10) then begin
UserEngine.SendBroadCastShortMsg(m_sCharName, sParam1);
Exit;
end;
if (CompareText(sCmd, '天下第一') = 0) and (m_btPermissionGM >= 10) then begin
UserEngine.SetHeroName(Str_ToInt(sParam1, -1), sParam2);
Exit;
end;
if (CompareText(sCmd, 'COLORNAME') = 0) and (m_btPermissionGM >= 10) then begin
PlayObject := UserEngine.GetPlayObject(sParam1);
if PlayObject = nil then begin
SysMsg(sParam1 + '当前不在线。', c_Red, t_Hint);
Exit;
end;
PlayObject.m_boColorName := Str_ToInt(sParam2, 0) = 1;
Exit;
end;
{$IF COUNTRYSYSTEM = 1}
if (CompareText(sCmd, 'SETMAPCOUNTRY') = 0) and (m_btPermissionGM >= 10) then begin
if (sParam1 = '') or (sParam1 = '?') then begin
SysMsg(sHint4, c_Red, t_Hint);
end else if g_MapManager.FindMap(sParam1) <> nil then begin
g_MapManager.FindMap(sParam1).SetCountry(Str_ToInt(sParam2, 0));
end;
Exit;
end;
if (CompareText(sCmd, 'SETKING') = 0) and (m_btPermissionGM >= 10) then begin
if (sParam1 = '') or (sParam1 = '?') then begin
SysMsg(sHint5, c_Red, t_Hint);
end else begin
if sParam2 <> '' then begin
PlayObject := UserEngine.GetPlayObject(sParam2);
if PlayObject = nil then begin
SysMsg(sParam2 + sOffLine, c_Red, t_Hint);
Exit;
end;
end;
CountrySetKing(Str_ToInt(sParam1, 0), sParam2);
end;
Exit;
end;
if (CompareText(sCmd, 'SETCOUNTRY') = 0) and (m_btPermissionGM >= 10) then begin
if (sParam1 = '') or (sParam1 = '?') then begin
SysMsg(sHint6, c_Red, t_Hint);
end else begin
PlayObject := UserEngine.GetPlayObject(sParam1);
if PlayObject <> nil then
PlayObject.SetCountry(Str_ToInt(sParam2, 0));
end;
Exit;
end;
{$IFEND}
if (CompareText(sCmd, '杀字') = 0) and (m_btPermissionGM >= 10) then begin
m_defMsg := MakeDefaultMsg(SM_736, 0, 0, 0, 0);
dwValue := Str_ToInt(sParam1, 0);
dwValue := $002A0032;
if dwValue = 0 then
SendSocket(@m_defMsg, '')
else
SendSocket(@m_defMsg, EnCodeBuffer(@dwValue, SizeOf(Integer)));
Exit;
end;
//脱机泡点
if (CompareText(sCmd, g_GameCommand.OfflinePlayer.sCmd) = 0) and
(m_btPermissionGM >= g_GameCommand.OfflinePlayer.nPermissionMin) then begin
if not g_Config.boEnableOffLinePlayer then
SysMsg(sHint7, c_Red, t_Hint)
else begin
m_defMsg := MakeDefaultMsg(SM_SYSMESSAGE, Integer(Self),
MakeWord(g_Config.btRedMsgFColor, g_Config.btRedMsgBColor), 0, 1);
SendSocket(@m_defMsg, EnCodeString(sHint8));
m_sAutoSayMsg := sParam1;
m_boOfflineGetGamePoint := True;
if (m_PneumaObject <> nil) and not m_PneumaObject.m_boGhost then begin
TPlayObject(m_PneumaObject).m_boOfflineGetGamePoint := True;
UserEngine.SaveHumanRcd(TPlayObject(m_PneumaObject));
TPlayObject(m_PneumaObject).m_dwSaveRcdTick := GetTickCount;
end;
UserEngine.SaveHumanRcd(Self);
m_dwSaveRcdTick := GetTickCount;
end;
Exit;
end;
if ProcessUserCmd(sCmd, sParam1, sParam2, sParam3, sParam4, sParam5, sParam6, sParam7) then Exit;
//新密码命令
if CompareText(sCmd, g_GameCommand.PASSWORDLOCK.sCmd) = 0 then begin
if not g_Config.boPasswordLockSystem then begin
SysMsg(g_sNoPasswordLockSystemMsg, c_Red, t_Hint);
//游戏密码保护系统还没有启用!!!
Exit;
end;
if m_sStoragePwd = '' then begin
SendMsg(Self, RM_PASSWORD, 0, 0, 0, 0, '');
m_boSetStoragePwd := True;
SysMsg(g_sSetPasswordMsg, c_Green, t_Hint);
//请输入一个长度为 4 - 7 位的仓库密码:
Exit;
end;
if m_btPwdFailCount > 3 then begin
SysMsg(g_sStoragePasswordLockedMsg, c_Red, t_Hint);
m_boPasswordLocked := True;
Exit;
end;
if m_sStoragePwd <> '' then begin
SendMsg(Self, RM_PASSWORD, 0, 0, 0, 0, '');
m_boCheckOldPwd := True;
SysMsg(g_sPleaseInputOldPasswordMsg, c_Green, t_Hint);
Exit;
end;
Exit;
end;
//新密码命令
if CompareText(sCmd, g_GameCommand.SETPASSWORD.sCmd) = 0 then begin
if not g_Config.boPasswordLockSystem then begin
SysMsg(g_sNoPasswordLockSystemMsg, c_Red, t_Hint);
Exit;
end;
if m_sStoragePwd = '' then begin
SendMsg(Self, RM_PASSWORD, 0, 0, 0, 0, '');
m_boSetStoragePwd := True;
SysMsg(g_sSetPasswordMsg, c_Green, t_Hint);
end else begin
SysMsg(g_sAlreadySetPasswordMsg, c_Red, t_Hint);
end;
Exit;
end;
//取消密码
if CompareText(sCmd, g_GameCommand.UNPASSWORD.sCmd) = 0 then begin
if not g_Config.boPasswordLockSystem then begin
SysMsg(g_sNoPasswordLockSystemMsg, c_Red, t_Hint);
Exit;
end;
if not m_boPasswordLocked then begin
m_sStoragePwd := '';
SysMsg(g_sOldPasswordIsClearMsg, c_Green, t_Hint);
end else begin
SysMsg(g_sPleaseUnLockPasswordMsg, c_Red, t_Hint);
end;
Exit;
end;
//修改密码
if CompareText(sCmd, g_GameCommand.CHGPASSWORD.sCmd) = 0 then begin
if not g_Config.boPasswordLockSystem then begin
SysMsg(g_sNoPasswordLockSystemMsg, c_Red, t_Hint);
Exit;
end;
if m_btPwdFailCount > 3 then begin
SysMsg(g_sStoragePasswordLockedMsg, c_Red, t_Hint);
m_boPasswordLocked := True;
Exit;
end;
if m_sStoragePwd <> '' then begin
SendMsg(Self, RM_PASSWORD, 0, 0, 0, 0, '');
m_boCheckOldPwd := True;
SysMsg(g_sPleaseInputOldPasswordMsg, c_Green, t_Hint);
end else begin
SysMsg(g_sNoPasswordSetMsg, c_Red, t_Hint);
end;
Exit;
end;
//打开仓库
if CompareText(sCmd, g_GameCommand.UNLOCKSTORAGE.sCmd) = 0 then begin
if not g_Config.boPasswordLockSystem then begin
SysMsg(g_sNoPasswordLockSystemMsg, c_Red, t_Hint);
Exit;
end;
if m_btPwdFailCount > g_Config.nPasswordErrorCountLock {3} then begin
SysMsg(g_sStoragePasswordLockedMsg, c_Red, t_Hint);
m_boPasswordLocked := True;
Exit;
end;
if m_sStoragePwd <> '' then begin
if not m_boUnLockStoragePwd then begin
SendMsg(Self, RM_PASSWORD, 0, 0, 0, 0, '');
SysMsg(g_sPleaseInputUnLockPasswordMsg, c_Green, t_Hint);
m_boUnLockStoragePwd := True;
end else begin
SysMsg(g_sStorageAlreadyUnLockMsg, c_Red, t_Hint);
end;
end else begin
SysMsg(g_sStorageNoPasswordMsg, c_Red, t_Hint);
end;
Exit;
end;
//UnLock
if CompareText(sCmd, g_GameCommand.UnLock.sCmd) = 0 then begin
if not g_Config.boPasswordLockSystem then begin
SysMsg(g_sNoPasswordLockSystemMsg, c_Red, t_Hint);
Exit;
end;
if m_btPwdFailCount > g_Config.nPasswordErrorCountLock {3} then begin
SysMsg(g_sStoragePasswordLockedMsg, c_Red, t_Hint);
m_boPasswordLocked := True;
Exit;
end;
if m_sStoragePwd <> '' then begin
if not m_boUnLockPwd then begin
SendMsg(Self, RM_PASSWORD, 0, 0, 0, 0, '');
SysMsg(g_sPleaseInputUnLockPasswordMsg, c_Green, t_Hint);
m_boUnLockPwd := True;
end else begin
SysMsg(g_sStorageAlreadyUnLockMsg, c_Red, t_Hint);
end;
end else begin
SysMsg(g_sStorageNoPasswordMsg, c_Red, t_Hint);
end;
Exit;
end;
//Lock
if CompareText(sCmd, g_GameCommand.Lock.sCmd) = 0 then begin
if not g_Config.boPasswordLockSystem then begin
SysMsg(g_sNoPasswordLockSystemMsg, c_Red, t_Hint);
Exit;
end;
if not m_boPasswordLocked then begin
if m_sStoragePwd <> '' then begin
m_boPasswordLocked := True;
m_boCanGetBackItem := False;
SysMsg(g_sLockStorageSuccessMsg, c_Green, t_Hint);
end else begin
SysMsg(g_sStorageNoPasswordMsg, c_Green, t_Hint);
end;
end else begin
SysMsg(g_sStorageAlreadyLockMsg, c_Red, t_Hint);
end;
Exit;
end;
if CompareText(sCmd, g_GameCommand.MEMBERFUNCTION.sCmd) = 0 then begin
CmdMemberFunction(g_GameCommand.MEMBERFUNCTION.sCmd, sParam1);
Exit;
end;
//MemberFuncEx
if CompareText(sCmd, g_GameCommand.MEMBERFUNCTIONEX.sCmd) = 0 then begin
CmdMemberFunctionEx(g_GameCommand.MEMBERFUNCTIONEX.sCmd, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.DEAR.sCmd) = 0 then begin
CmdSearchDear(g_GameCommand.DEAR.sCmd, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.Master.sCmd) = 0 then begin
CmdSearchMaster(g_GameCommand.Master.sCmd, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.MASTERECALL.sCmd) = 0 then begin
CmdMasterRecall(g_GameCommand.MASTERECALL.sCmd, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.FRIENDRECALL.sCmd) = 0 then begin
CmdFriendRecall(g_GameCommand.FRIENDRECALL.sCmd, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.DEARRECALL.sCmd) = 0 then begin
CmdDearRecall(g_GameCommand.DEARRECALL.sCmd, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.ALLOWDEARRCALL.sCmd) = 0 then begin
m_boCanDearRecall := not m_boCanDearRecall;
if m_boCanDearRecall then begin
SysMsg(g_sEnableDearRecall {'允许夫妻传送!!!'}, c_Blue,
t_Hint);
end else begin
SysMsg(g_sDisableDearRecall {'禁止夫妻传送!!!'}, c_Blue,
t_Hint);
end;
Exit;
end;
if CompareText(sCmd, g_GameCommand.ALLOWMASTERRECALL.sCmd) = 0 then begin
m_boCanMasterRecall := not m_boCanMasterRecall;
if m_boCanMasterRecall then begin
SysMsg(g_sEnableMasterRecall {'允许师徒传送!!!'}, c_Blue,
t_Hint);
end else begin
SysMsg(g_sDisableMasterRecall {'禁止师徒传送!!!'}, c_Blue,
t_Hint);
end;
Exit;
end;
if CompareText(sCmd, g_GameCommand.Data.sCmd) = 0 then begin
SysMsg(g_sNowCurrDateTime {'当前日期时间: '} +
FormatDateTime('dddddd,dddd,hh:mm:nn', Now), c_Blue, t_Hint);
Exit;
end;
if CompareText(sCmd, g_GameCommand.PRVMSG.sCmd) = 0 then begin
CmdPrvMsg(g_GameCommand.PRVMSG.sCmd, g_GameCommand.PRVMSG.nPermissionMin,
sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.AllowAddFriend.sCmd) = 0 then begin
m_boAllowAddFriend := not m_boAllowAddFriend;
if m_boAllowAddFriend then
SysMsg(sHint9, c_Green, t_Hint)
else
SysMsg(sHint10, c_Green, t_Hint);
Exit;
end;
if CompareText(sCmd, g_GameCommand.ALLOWMSG.sCmd) = 0 then begin
m_boHearWhisper := not m_boHearWhisper;
if m_boHearWhisper then
SysMsg(g_sEnableHearWhisper {'[允许私聊]'}, c_Green, t_Hint)
else SysMsg(g_sDisableHearWhisper {'[禁止私聊]'}, c_Green, t_Hint);
Exit;
end;
if CompareText(sCmd, g_GameCommand.LETSHOUT.sCmd) = 0 then begin
m_boBanShout := not m_boBanShout;
if m_boBanShout then
SysMsg(g_sEnableShoutMsg {'[允许群聊]'}, c_Green, t_Hint)
else SysMsg(g_sDisableShoutMsg {'[禁止群聊]'}, c_Green, t_Hint);
Exit;
end;
if CompareText(sCmd, g_GameCommand.LETTRADE.sCmd) = 0 then begin
m_boAllowDeal := not m_boAllowDeal;
if m_boAllowDeal then
SysMsg(g_sEnableDealMsg {'[允许交易]'}, c_Green, t_Hint)
else SysMsg(g_sDisableDealMsg {'[禁止交易]'}, c_Green, t_Hint);
Exit;
end;
if CompareText(sCmd, g_GameCommand.BANGUILDCHAT.sCmd) = 0 then begin
m_boBanGuildChat := not m_boBanGuildChat;
if m_boBanGuildChat then
SysMsg(g_sEnableGuildChat {'[允许行会聊天]'}, c_Green, t_Hint)
else
SysMsg(g_sDisableGuildChat {'[禁止行会聊天]'}, c_Green, t_Hint);
Exit;
end;
if CompareText(sCmd, g_GameCommand.LETGUILD.sCmd) = 0 then begin
m_boAllowGuild := not m_boAllowGuild;
if m_boAllowGuild then
SysMsg(g_sEnableJoinGuild {'[允许加入行会]'}, c_Green, t_Hint)
else
SysMsg(g_sDisableJoinGuild {'[禁止加入行会]'}, c_Green, t_Hint);
Exit;
end;
if CompareText(sCmd, g_GameCommand.ENDGUILD.sCmd) = 0 then begin
CmdEndGuild();
Exit;
end;
if CompareText(sCmd, g_GameCommand.AUTHALLY.sCmd) = 0 then begin
if IsGuildMaster then begin
TGuild(m_MyGuild).m_boEnableAuthAlly := not TGuild(m_MyGuild).m_boEnableAuthAlly;
if TGuild(m_MyGuild).m_boEnableAuthAlly then
SysMsg(g_sEnableAuthAllyGuild {'[允许行会联盟]'}, c_Green, t_Hint)
else
SysMsg(g_sDisableAuthAllyGuild {'[禁止行会联盟]'}, c_Green, t_Hint);
end;
Exit;
end;
if CompareText(sCmd, g_GameCommand.ALLOWGROUPCALL.sCmd) = 0 then begin
CmdAllowGroupReCall(sCmd, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.GROUPRECALLL.sCmd) = 0 then begin
CmdGroupRecall(g_GameCommand.GROUPRECALLL.sCmd);
Exit;
end;
if CompareText(sCmd, g_GameCommand.ALLOWGUILDRECALL.sCmd) = 0 then begin
m_boAllowGuildReCall := not m_boAllowGuildReCall;
if m_boAllowGuildReCall then
SysMsg(g_sEnableGuildRecall {'[允许行会合一]'}, c_Green, t_Hint)
else
SysMsg(g_sDisableGuildRecall {'[禁止行会合一]'}, c_Green, t_Hint);
Exit;
end;
if CompareText(sCmd, g_GameCommand.GUILDRECALLL.sCmd) = 0 then begin
CmdGuildRecall(g_GameCommand.GUILDRECALLL.sCmd, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.AUTH.sCmd) = 0 then begin
if IsGuildMaster then ClientGuildAlly();
Exit;
end;
if CompareText(sCmd, g_GameCommand.AUTHCANCEL.sCmd) = 0 then begin
if IsGuildMaster then ClientGuildBreakAlly(sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.DIARY.sCmd) = 0 then begin
CmdViewDiary(g_GameCommand.DIARY.sCmd, Str_ToInt(sParam1, 0));
Exit;
end;
if CompareText(sCmd, g_GameCommand.ATTACKMODE.sCmd) = 0 then begin
CmdChangeAttackMode(Str_ToInt(sParam1, -1));
Exit;
end;
if CompareText(sCmd, g_GameCommand.REST.sCmd) = 0 then begin
CmdChangeSalveStatus();
Exit;
end;
if CompareText(sCmd, g_GameCommand.TIGGERREST.sCmd) = 0 then begin
CmdChangeTigerStatus();
Exit;
end;
if CompareText(sCmd, g_GameCommand.TAKEONHORSE.sCmd) = 0 then begin
CmdTakeOnHorse(sCmd, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.TAKEOFHORSE.sCmd) = 0 then begin
CmdTakeOffHorse(sCmd, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.TESTGA.sCmd) = 0 then begin
Exit;
SendMsg(Self, RM_PASSWORD, 0, 0, 0, 0, '');
SysMsg(g_sPleaseInputPassword {'请输入密码:'}, c_Green, t_Hint);
Exit;
end;
if CompareText(sCmd, g_GameCommand.MAPINFO.sCmd) = 0 then begin
ShowMapInfo(sParam1, sParam2, sParam3);
Exit;
end;
if CompareText(sCmd, g_GameCommand.CLEARBAG.sCmd) = 0 then begin
CmdClearBagItem(@g_GameCommand.CLEARBAG, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.SHOWUSEITEMINFO.sCmd) = 0 then begin
CmdShowUseItemInfo(@g_GameCommand.SHOWUSEITEMINFO, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.BINDUSEITEM.sCmd) = 0 then begin
CmdBindUseItem(@g_GameCommand.BINDUSEITEM, sParam1, sParam2, sParam3);
Exit;
end;
if CompareText(sCmd, g_GameCommand.SBKDOOR.sCmd) = 0 then begin //004D2610
CmdSbkDoorControl(g_GameCommand.SBKDOOR.sCmd, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.USERMOVE.sCmd) = 0 then begin
CmdUserMoveXY(g_GameCommand.USERMOVE.sCmd, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.SEARCHING.sCmd) = 0 then begin
CmdSearchHuman(g_GameCommand.SEARCHING.sCmd, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.LOCKLOGON.sCmd) = 0 then begin
CmdLockLogin(@g_GameCommand.LOCKLOGON);
Exit;
end;
if (m_btPermissionGM >= 2) and (Length(sData) > 2) then begin
if (m_btPermissionGM >= 6) and (sData[2] = g_GMRedMsgCmd) then begin
if GetTickCount - m_dwSayMsgTick > 2000 then begin
m_dwSayMsgTick := GetTickCount();
sData := Copy(sData, 3, Length(sData) - 2);
if Length(sData) > g_Config.nSayRedMsgMaxLen then begin
sData := Copy(sData, 1, g_Config.nSayRedMsgMaxLen);
end;
if g_Config.boShutRedMsgShowGMName then
SC := m_sCharName + ': ' + sData
else SC := sData;
UserEngine.SendBroadCastMsgExt(SC, t_GM);
end;
Exit;
end;
end;
//004D2C70 HumanLocal
if CompareText(sCmd, g_GameCommand.HUMANLOCAL.sCmd) = 0 then begin
CmdHumanLocal(@g_GameCommand.HUMANLOCAL, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.Move.sCmd) = 0 then begin
CmdMapMove(@g_GameCommand.Move, sParam1);
Exit;
end; //004D2CD0
if CompareText(sCmd, g_GameCommand.POSITIONMOVE.sCmd) = 0 then begin
CmdPositionMove(@g_GameCommand.POSITIONMOVE, sParam1, sParam2, sParam3);
Exit;
end;
if CompareText(sCmd, g_GameCommand.info.sCmd) = 0 then begin
CmdHumanInfo(@g_GameCommand.info, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.MOBLEVEL.sCmd) = 0 then begin
CmdMobLevel(@g_GameCommand.MOBLEVEL, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.MOBCOUNT.sCmd) = 0 then begin
CmdMobCount(@g_GameCommand.MOBCOUNT, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.HUMANCOUNT.sCmd) = 0 then begin
CmdHumanCount(@g_GameCommand.HUMANCOUNT, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.KICK.sCmd) = 0 then begin
CmdKickHuman(@g_GameCommand.KICK, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.TING.sCmd) = 0 then begin
CmdTing(@g_GameCommand.TING, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.SUPERTING.sCmd) = 0 then begin
CmdSuperTing(@g_GameCommand.SUPERTING, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.MAPMOVE.sCmd) = 0 then begin
CmdMapMoveHuman(@g_GameCommand.MAPMOVE, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.SHUTUP.sCmd) = 0 then begin
CmdShutup(@g_GameCommand.SHUTUP, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.Map.sCmd) = 0 then begin
CmdShowMapInfo(@g_GameCommand.Map, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.RELEASESHUTUP.sCmd) = 0 then begin
CmdShutupRelease(@g_GameCommand.RELEASESHUTUP, sParam1, True);
Exit;
end;
if CompareText(sCmd, g_GameCommand.SHUTUPLIST.sCmd) = 0 then begin
CmdShutupList(@g_GameCommand.SHUTUPLIST, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.GAMEMASTER.sCmd) = 0 then begin
CmdChangeAdminMode(g_GameCommand.GAMEMASTER.sCmd,
g_GameCommand.GAMEMASTER.nPermissionMin, sParam1, not m_boAdminMode);
Exit;
end;
if CompareText(sCmd, g_GameCommand.OBSERVER.sCmd) = 0 then begin
CmdChangeObMode(g_GameCommand.OBSERVER.sCmd,
g_GameCommand.OBSERVER.nPermissionMin, sParam1, not m_boObMode);
Exit;
end;
if CompareText(sCmd, g_GameCommand.SUEPRMAN.sCmd) = 0 then begin
CmdChangeSuperManMode(g_GameCommand.OBSERVER.sCmd,
g_GameCommand.OBSERVER.nPermissionMin, sParam1, not m_boSuperMan);
Exit;
end;
if CompareText(sCmd, g_GameCommand.level.sCmd) = 0 then begin
CmdChangeLevel(@g_GameCommand.level, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.SABUKWALLGOLD.sCmd) = 0 then begin
CmdShowSbkGold(@g_GameCommand.SABUKWALLGOLD, sParam1, sParam2, sParam3);
Exit;
end;
if CompareText(sCmd, g_GameCommand.RECALL.sCmd) = 0 then begin
CmdRecallHuman(@g_GameCommand.RECALL, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.REGOTO.sCmd) = 0 then begin
CmdReGotoHuman(@g_GameCommand.REGOTO, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.SHOWFLAG.sCmd) = 0 then begin
CmdShowHumanFlag(g_GameCommand.SHOWFLAG.sCmd,
g_GameCommand.SHOWFLAG.nPermissionMin, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.SHOWOPEN.sCmd) = 0 then begin
CmdShowHumanUnitOpen(g_GameCommand.SHOWOPEN.sCmd,
g_GameCommand.SHOWOPEN.nPermissionMin, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.SHOWUNIT.sCmd) = 0 then begin
CmdShowHumanUnit(g_GameCommand.SHOWUNIT.sCmd,
g_GameCommand.SHOWUNIT.nPermissionMin, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.Attack.sCmd) = 0 then begin
Exit;
end;
if CompareText(sCmd, g_GameCommand.MOB.sCmd) = 0 then begin
CmdMob(@g_GameCommand.MOB, sParam1, Str_ToInt(sParam2, 0),
Str_ToInt(sParam3, 0), sParam4);
Exit;
end;
if CompareText(sCmd, g_GameCommand.MOBNPC.sCmd) = 0 then begin
CmdMobNpc(g_GameCommand.MOBNPC.sCmd, g_GameCommand.MOBNPC.nPermissionMin,
sParam1, sParam2, sParam3, sParam4);
Exit;
end;
if CompareText(sCmd, g_GameCommand.NPCSCRIPT.sCmd) = 0 then begin
CmdNpcScript(g_GameCommand.NPCSCRIPT.sCmd,
g_GameCommand.NPCSCRIPT.nPermissionMin, sParam1, sParam2, sParam3);
Exit;
end;
if CompareText(sCmd, g_GameCommand.DELNPC.sCmd) = 0 then begin
CmdDelNpc(g_GameCommand.DELNPC.sCmd, g_GameCommand.DELNPC.nPermissionMin,
sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.RECALLMOB.sCmd) = 0 then begin
CmdRecallMob(@g_GameCommand.RECALLMOB, sParam1, Str_ToInt(sParam2, 0),
Str_ToInt(sParam3, 0), Str_ToInt(sParam4, 0), Str_ToInt(sParam5, 0));
Exit;
end;
if CompareText(sCmd, g_GameCommand.LUCKYPOINT.sCmd) = 0 then begin
CmdLuckPoint(g_GameCommand.LUCKYPOINT.sCmd,
g_GameCommand.LUCKYPOINT.nPermissionMin, sParam1, sParam2, sParam3);
Exit;
end;
if CompareText(sCmd, g_GameCommand.LOTTERYTICKET.sCmd) = 0 then begin
CmdLotteryTicket(g_GameCommand.LOTTERYTICKET.sCmd,
g_GameCommand.LOTTERYTICKET.nPermissionMin, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.RELOADGUILD.sCmd) = 0 then begin
CmdReloadGuild(g_GameCommand.RELOADGUILD.sCmd,
g_GameCommand.RELOADGUILD.nPermissionMin, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.RELOADLINENOTICE.sCmd) = 0 then begin
CmdReloadLineNotice(g_GameCommand.RELOADLINENOTICE.sCmd,
g_GameCommand.RELOADLINENOTICE.nPermissionMin, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.RELOADABUSE.sCmd) = 0 then begin
CmdReloadAbuse(g_GameCommand.RELOADABUSE.sCmd,
g_GameCommand.RELOADABUSE.nPermissionMin, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.FREEPENALTY.sCmd) = 0 then begin
CmdFreePenalty(@g_GameCommand.FREEPENALTY, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.PKPOINT.sCmd) = 0 then begin
CmdPKpoint(@g_GameCommand.PKPOINT, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.IncPkPoint.sCmd) = 0 then begin
CmdIncPkPoint(@g_GameCommand.IncPkPoint, sParam1, Str_ToInt(sParam2, 0));
Exit;
end;
if CompareText(sCmd, g_GameCommand.MAKE.sCmd) = 0 then begin
CmdMakeItem(@g_GameCommand.MAKE, sParam1, Str_ToInt(sParam2, 0));
Exit;
end;
if CompareText(sCmd, g_GameCommand.VIEWWHISPER.sCmd) = 0 then begin
CmdViewWhisper(@g_GameCommand.VIEWWHISPER, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.ReAlive.sCmd) = 0 then begin
CmdReAlive(@g_GameCommand.ReAlive, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.KILL.sCmd) = 0 then begin
CmdKill(@g_GameCommand.KILL, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.SMAKE.sCmd) = 0 then begin
CmdSmakeItem(@g_GameCommand.SMAKE, Str_ToInt(sParam1, 0),
Str_ToInt(sParam2, 0), sParam3, Str_ToInt(sParam4, 0));
Exit;
end;
if CompareText(sCmd, g_GameCommand.CHANGEJOB.sCmd) = 0 then begin
CmdChangeJob(@g_GameCommand.CHANGEJOB, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.CHANGEGENDER.sCmd) = 0 then begin
CmdChangeGender(@g_GameCommand.CHANGEGENDER, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.HAIR.sCmd) = 0 then begin
CmdHair(@g_GameCommand.HAIR, sParam1, Str_ToInt(sParam2, 0));
Exit;
end;
if CompareText(sCmd, g_GameCommand.BonusPoint.sCmd) = 0 then begin
CmdBonuPoint(@g_GameCommand.BonusPoint, sParam1, Str_ToInt(sParam2, 0));
Exit;
end;
if CompareText(sCmd, g_GameCommand.DELBONUSPOINT.sCmd) = 0 then begin
CmdDelBonuPoint(@g_GameCommand.DELBONUSPOINT, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.RESTBONUSPOINT.sCmd) = 0 then begin
CmdRestBonuPoint(@g_GameCommand.RESTBONUSPOINT, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.SETPERMISSION.sCmd) = 0 then begin
CmdSetPermission(@g_GameCommand.SETPERMISSION, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.RENEWLEVEL.sCmd) = 0 then begin
CmdReNewLevel(@g_GameCommand.RENEWLEVEL, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.DELGOLD.sCmd) = 0 then begin
CmdDelGold(@g_GameCommand.DELGOLD, sParam1, Str_ToInt(sParam2, 0));
Exit;
end;
if CompareText(sCmd, g_GameCommand.ADDGOLD.sCmd) = 0 then begin
CmdAddGold(@g_GameCommand.ADDGOLD, sParam1, Str_ToInt(sParam2, 0));
Exit;
end;
if CompareText(sCmd, g_GameCommand.GAMEGOLD.sCmd) = 0 then begin
CmdGameGold(@g_GameCommand.GAMEGOLD, sParam1, sParam2, Str_ToInt(sParam3, 0));
Exit;
end;
if CompareText(sCmd, g_GameCommand.GAMEPOINT.sCmd) = 0 then begin
CmdGamePoint(@g_GameCommand.GAMEPOINT, sParam1, sParam2,
Str_ToInt(sParam3, 0));
Exit;
end;
if CompareText(sCmd, g_GameCommand.CREDITPOINT.sCmd) = 0 then begin
CmdCreditPoint(@g_GameCommand.CREDITPOINT, sParam1, sParam2,
Str_ToInt(sParam3, 0));
Exit;
end;
if CompareText(sCmd, g_GameCommand.TRAINING.sCmd) = 0 then begin
CmdTrainingSkill(@g_GameCommand.TRAINING, sParam1, sParam2,
Str_ToInt(sParam3, 0));
Exit;
end;
if CompareText(sCmd, g_GameCommand.DELETEITEM.sCmd) = 0 then begin
CmdDeleteItem(@g_GameCommand.DELETEITEM, sParam1, sParam2,
Str_ToInt(sParam3, 1));
Exit;
end;
if CompareText(sCmd, g_GameCommand.DELETESKILL.sCmd) = 0 then begin
CmdDelSkill(@g_GameCommand.DELETESKILL, sParam1, sParam2);
Exit;
end; //TrainingSkill
if CompareText(sCmd, g_GameCommand.TRAININGSKILL.sCmd) = 0 then begin
CmdTrainingMagic(@g_GameCommand.TRAININGSKILL, sParam1, sParam2,
Str_ToInt(sParam3, 0));
Exit;
end;
if CompareText(sCmd, g_GameCommand.CLEARMISSION.sCmd) = 0 then begin
CmdClearMission(@g_GameCommand.CLEARMISSION, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.STARTQUEST.sCmd) = 0 then begin
CmdStartQuest(@g_GameCommand.STARTQUEST, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.DENYIPLOGON.sCmd) = 0 then begin
CmdDenyIPaddrLogon(@g_GameCommand.DENYIPLOGON, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.CHANGEDEARNAME.sCmd) = 0 then begin
CmdChangeDearName(@g_GameCommand.CHANGEDEARNAME, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.ChangeMasterName.sCmd) = 0 then begin
CmdChangeMasterName(@g_GameCommand.ChangeMasterName, sParam1, sParam2,
sParam3);
Exit;
end;
if CompareText(sCmd, g_GameCommand.CLEARMON.sCmd) = 0 then begin
CmdClearMapMonster(@g_GameCommand.CLEARMON, sParam1, sParam2, sParam3,
sParam4);
Exit;
end;
if CompareText(sCmd, g_GameCommand.DENYACCOUNTLOGON.sCmd) = 0 then begin
CmdDenyAccountLogon(@g_GameCommand.DENYACCOUNTLOGON, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.DENYCHARNAMELOGON.sCmd) = 0 then begin
CmdDenyCharNameLogon(@g_GameCommand.DENYCHARNAMELOGON, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.DELDENYIPLOGON.sCmd) = 0 then begin
CmdDelDenyIPaddrLogon(@g_GameCommand.DELDENYIPLOGON, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.DELDENYACCOUNTLOGON.sCmd) = 0 then begin
CmdDelDenyAccountLogon(@g_GameCommand.DELDENYACCOUNTLOGON, sParam1,
sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.DELDENYCHARNAMELOGON.sCmd) = 0 then begin
CmdDelDenyCharNameLogon(@g_GameCommand.DELDENYCHARNAMELOGON, sParam1,
sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.SHOWDENYIPLOGON.sCmd) = 0 then begin
CmdShowDenyIPaddrLogon(@g_GameCommand.SHOWDENYIPLOGON, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.SHOWDENYACCOUNTLOGON.sCmd) = 0 then begin
CmdShowDenyAccountLogon(@g_GameCommand.SHOWDENYACCOUNTLOGON, sParam1,
sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.SHOWDENYCHARNAMELOGON.sCmd) = 0 then begin
CmdShowDenyCharNameLogon(@g_GameCommand.SHOWDENYCHARNAMELOGON, sParam1,
sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.Mission.sCmd) = 0 then begin
CmdMission(@g_GameCommand.Mission, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.MobPlace.sCmd) = 0 then begin
CmdMobPlace(@g_GameCommand.MobPlace, sParam1, sParam2, sParam3, sParam4);
Exit;
end;
if CompareText(sCmd, g_GameCommand.SetMapMode.sCmd) = 0 then begin
CmdSetMapMode(g_GameCommand.SetMapMode.sCmd, sParam1, sParam2, sParam3,
sParam4);
Exit;
end;
if CompareText(sCmd, g_GameCommand.SHOWMAPMODE.sCmd) = 0 then begin
CmdShowMapMode(g_GameCommand.SHOWMAPMODE.sCmd, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.CLRPASSWORD.sCmd) = 0 then begin
CmdClearHumanPassword(g_GameCommand.CLRPASSWORD.sCmd,
g_GameCommand.CLRPASSWORD.nPermissionMin, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.CONTESTPOINT.sCmd) = 0 then begin
CmdContestPoint(@g_GameCommand.CONTESTPOINT, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.STARTCONTEST.sCmd) = 0 then begin
CmdStartContest(@g_GameCommand.STARTCONTEST, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.ENDCONTEST.sCmd) = 0 then begin
CmdEndContest(@g_GameCommand.ENDCONTEST, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.ANNOUNCEMENT.sCmd) = 0 then begin
CmdAnnouncement(@g_GameCommand.ANNOUNCEMENT, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.DISABLESENDMSG.sCmd) = 0 then begin
CmdDisableSendMsg(@g_GameCommand.DISABLESENDMSG, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.ENABLESENDMSG.sCmd) = 0 then begin
CmdEnableSendMsg(@g_GameCommand.ENABLESENDMSG, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.REFINEWEAPON.sCmd) = 0 then begin
CmdRefineWeapon(@g_GameCommand.REFINEWEAPON, Str_ToInt(sParam1, 0),
Str_ToInt(sParam2, 0), Str_ToInt(sParam3, 0), Str_ToInt(sParam4, 0));
Exit;
end;
if CompareText(sCmd, g_GameCommand.DISABLESENDMSGLIST.sCmd) = 0 then begin
CmdDisableSendMsgList(@g_GameCommand.DISABLESENDMSGLIST);
Exit;
end;
if CompareText(sCmd, g_GameCommand.BINDGOLD.sCmd) = 0 then begin
CmdBindGold(@g_GameCommand.BINDGOLD, sParam1, sParam2, Str_ToInt(sParam3, 0));
Exit;
end;
if CompareText(sCmd, g_GameCommand.BINDGAMEGOLD.sCmd) = 0 then begin
CmdBindGameGold(@g_GameCommand.BINDGAMEGOLD, sParam1, sParam2, Str_ToInt(sParam3, 0));
Exit;
end;
if m_btPermissionGM > 4 then begin
if CompareText(sCmd, g_GameCommand.BACKSTEP.sCmd) = 0 then begin
CmdBackStep(sCmd, Str_ToInt(sParam1, 0), Str_ToInt(sParam2, 1));
Exit;
end;
if CompareText(sCmd, g_GameCommand.BALL.sCmd) = 0 then begin //精神波
Exit;
end;
if CompareText(sCmd, g_GameCommand.CHANGELUCK.sCmd) = 0 then begin
Exit;
end;
if CompareText(sCmd, g_GameCommand.HUNGER.sCmd) = 0 then begin
CmdHunger(g_GameCommand.HUNGER.sCmd, sParam1, Str_ToInt(sParam2, 0));
Exit;
end;
if CompareText(sCmd, g_GameCommand.NameColor.sCmd) = 0 then begin
Exit;
end;
if CompareText(sCmd, g_GameCommand.TRANSPARECY.sCmd) = 0 then begin
Exit;
end;
if CompareText(sCmd, g_GameCommand.LEVEL0.sCmd) = 0 then begin
Exit;
end;
if CompareText(sCmd, g_GameCommand.SETFLAG.sCmd) = 0 then begin
PlayObject := UserEngine.GetPlayObject(sParam1);
if PlayObject <> nil then begin
nFlag := Str_ToInt(sParam2, 0);
dwValue := Str_ToInt(sParam3, 0);
PlayObject.SetQuestFlagStatus(nFlag, dwValue);
if PlayObject.GetQuestFalgStatus(nFlag) = 1 then begin
SysMsg(PlayObject.m_sCharName + ': [' + IntToStr(nFlag) + '] = ON', c_Green, t_Hint);
end else begin
SysMsg(PlayObject.m_sCharName + ': [' + IntToStr(nFlag) + '] = OFF', c_Green, t_Hint);
end;
end else begin
SysMsg('@' + g_GameCommand.SETFLAG.sCmd + sHint11, c_Red, t_Hint);
end;
Exit;
end;
if CompareText(sCmd, g_GameCommand.SETOPEN.sCmd) = 0 then begin
PlayObject := UserEngine.GetPlayObject(sParam1);
if PlayObject <> nil then begin
nFlag := Str_ToInt(sParam2, 0);
dwValue := Str_ToInt(sParam3, 0);
PlayObject.SetQuestUnitOpenStatus(nFlag, dwValue);
if PlayObject.GetQuestUnitOpenStatus(nFlag) = 1 then begin
SysMsg(PlayObject.m_sCharName + ': [' + IntToStr(nFlag) + '] = ON', c_Green, t_Hint);
end else begin
SysMsg(PlayObject.m_sCharName + ': [' + IntToStr(nFlag) + '] = OFF', c_Green, t_Hint);
end;
end else begin
SysMsg('@' + g_GameCommand.SETOPEN.sCmd + sHint11, c_Red, t_Hint);
end;
Exit;
end;
if CompareText(sCmd, g_GameCommand.SETUNIT.sCmd) = 0 then begin
PlayObject := UserEngine.GetPlayObject(sParam1);
if PlayObject <> nil then begin
nFlag := Str_ToInt(sParam2, 0);
dwValue := Str_ToInt(sParam3, 0);
PlayObject.SetQuestUnitStatus(nFlag, dwValue);
if PlayObject.GetQuestUnitStatus(nFlag) = 1 then begin
SysMsg(PlayObject.m_sCharName + ': [' + IntToStr(nFlag) + '] = ON', c_Green, t_Hint);
end else begin
SysMsg(PlayObject.m_sCharName + ': [' + IntToStr(nFlag) + '] = OFF', c_Green, t_Hint);
end;
end else begin
SysMsg('@' + g_GameCommand.SETUNIT.sCmd + sHint11, c_Red, t_Hint);
end;
Exit;
end;
if CompareText(sCmd, g_GameCommand.RECONNECTION.sCmd) = 0 then begin
CmdReconnection(sCmd, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.DISABLEFILTER.sCmd) = 0 then begin
CmdDisableFilter(sCmd, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.CHGUSERFULL.sCmd) = 0 then begin
CmdChangeUserFull(sCmd, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.CHGZENFASTSTEP.sCmd) = 0 then begin
CmdChangeZenFastStep(sCmd, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.OXQUIZROOM.sCmd) = 0 then begin
Exit;
end;
if CompareText(sCmd, g_GameCommand.GSA.sCmd) = 0 then begin
Exit;
end;
if CompareText(sCmd, g_GameCommand.CHANGEITEMNAME.sCmd) = 0 then begin
CmdChangeItemName(g_GameCommand.CHANGEITEMNAME.sCmd, sParam1, sParam2, sParam3);
Exit;
end;
if (m_btPermissionGM >= 5) or (g_Config.boTestServer) then begin
if CompareText(sCmd, g_GameCommand.FIREBURN.sCmd) = 0 then begin
CmdFireBurn(Str_ToInt(sParam1, 0), Str_ToInt(sParam2, 0), Str_ToInt(sParam3, 0));
Exit;
end;
if CompareText(sCmd, g_GameCommand.TESTFIRE.sCmd) = 0 then begin
CmdTestFire(sCmd, Str_ToInt(sParam1, 0), Str_ToInt(sParam2, 0),
Str_ToInt(sParam3, 0), Str_ToInt(sParam4, 0));
Exit;
end;
if CompareText(sCmd, g_GameCommand.TESTSTATUS.sCmd) = 0 then begin
CmdTestStatus(sCmd, Str_ToInt(sParam1, -1), Str_ToInt(sParam2, 0));
Exit;
end;
if CompareText(sCmd, g_GameCommand.TESTGOLDCHANGE.sCmd) = 0 then begin
Exit;
end;
if CompareText(sCmd, g_GameCommand.RELOADADMIN.sCmd) = 0 then begin
CmdReLoadAdmin(g_GameCommand.RELOADADMIN.sCmd);
Exit;
end;
if CompareText(sCmd, g_GameCommand.ReLoadNpc.sCmd) = 0 then begin
CmdReloadNpc(sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.RELOADMANAGE.sCmd) = 0 then begin
CmdReloadManage(@g_GameCommand.RELOADMANAGE, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.RELOADROBOTMANAGE.sCmd) = 0 then begin
CmdReloadRobotManage();
Exit;
end;
if CompareText(sCmd, g_GameCommand.RELOADROBOT.sCmd) = 0 then begin
CmdReloadRobot();
Exit;
end;
if CompareText(sCmd, g_GameCommand.RELOADMONITEMS.sCmd) = 0 then begin
CmdReloadMonItems();
Exit;
end;
if CompareText(sCmd, g_GameCommand.RELOADDIARY.sCmd) = 0 then begin
Exit;
end;
if CompareText(sCmd, g_GameCommand.RELOADITEMDB.sCmd) = 0 then begin
FrmDB.LoadItemsDB();
SysMsg(sHint12, c_Green, t_Hint);
Exit;
end;
if CompareText(sCmd, g_GameCommand.RELOADMAGICDB.sCmd) = 0 then begin
FrmDB.LoadMagicDB();
SysMsg('魔法数据库重新加载完成。', c_Green, t_Hint);
Exit;
end;
if CompareText(sCmd, g_GameCommand.RELOADMONSTERDB.sCmd) = 0 then begin
FrmDB.LoadMonsterDB();
SysMsg(sHint13, c_Green, t_Hint);
Exit;
end;
if CompareText(sCmd, g_GameCommand.RELOADMINMAP.sCmd) = 0 then begin
FrmDB.LoadMinMap();
g_MapManager.ReSetMinMap();
SysMsg(sHint14, c_Green, t_Hint);
Exit;
end;
if CompareText(sCmd, g_GameCommand.ADJUESTLEVEL.sCmd) = 0 then begin
CmdAdjuestLevel(@g_GameCommand.ADJUESTLEVEL, sParam1,
Str_ToInt(sParam2, 1));
Exit;
end;
if CompareText(sCmd, g_GameCommand.ADJUESTEXP.sCmd) = 0 then begin
CmdAdjuestExp(@g_GameCommand.ADJUESTEXP, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.AddGuild.sCmd) = 0 then begin
CmdAddGuild(@g_GameCommand.AddGuild, sParam1, sParam2);
Exit;
end;
if CompareText(sCmd, g_GameCommand.DelGuild.sCmd) = 0 then begin
CmdDelGuild(@g_GameCommand.DelGuild, sParam1);
Exit;
end;
if (CompareText(sCmd, g_GameCommand.CHANGESABUKLORD.sCmd) = 0) then begin
CmdChangeSabukLord(@g_GameCommand.CHANGESABUKLORD, sParam1, sParam2,
True);
Exit;
end;
if CompareText(sCmd, g_GameCommand.FORCEDWALLCONQUESTWAR.sCmd) = 0 then begin
CmdForcedWallconquestWar(@g_GameCommand.FORCEDWALLCONQUESTWAR, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.ADDTOITEMEVENT.sCmd) = 0 then begin
Exit;
end;
if CompareText(sCmd, g_GameCommand.ADDTOITEMEVENTASPIECES.sCmd) = 0 then begin
Exit;
end;
if CompareText(sCmd, g_GameCommand.ItemEventList.sCmd) = 0 then begin
Exit;
end;
if CompareText(sCmd, g_GameCommand.STARTINGGIFTNO.sCmd) = 0 then begin
Exit;
end;
if CompareText(sCmd, g_GameCommand.DELETEALLITEMEVENT.sCmd) = 0 then begin
Exit;
end;
if CompareText(sCmd, g_GameCommand.STARTITEMEVENT.sCmd) = 0 then begin
Exit;
end;
if CompareText(sCmd, g_GameCommand.ITEMEVENTTERM.sCmd) = 0 then begin
Exit;
end;
if CompareText(sCmd, g_GameCommand.ADJUESTTESTLEVEL.sCmd) = 0 then begin
Exit;
end;
if CompareText(sCmd, g_GameCommand.OPDELETESKILL.sCmd) = 0 then begin
Exit;
end;
if CompareText(sCmd, g_GameCommand.CHANGEWEAPONDURA.sCmd) = 0 then begin
Exit;
end;
if CompareText(sCmd, g_GameCommand.RELOADGUILDALL.sCmd) = 0 then begin
Exit;
end;
if CompareText(sCmd, g_GameCommand.SPIRIT.sCmd) = 0 then begin
CmdSpirtStart(g_GameCommand.SPIRIT.sCmd, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.SPIRITSTOP.sCmd) = 0 then begin
CmdSpirtStop(g_GameCommand.SPIRITSTOP.sCmd, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.TESTGETBAGITEM.sCmd) = 0 then begin
CmdTestGetBagItems(@g_GameCommand.TESTGETBAGITEM, sParam1);
Exit;
end;
if CompareText(sCmd, g_GameCommand.MOBFIREBURN.sCmd) = 0 then begin
CmdMobFireBurn(@g_GameCommand.MOBFIREBURN, sParam1, sParam2, sParam3, sParam4, sParam5, sParam6);
Exit;
end;
if CompareText(sCmd, g_GameCommand.TESTSPEEDMODE.sCmd) = 0 then begin
CmdTestSpeedMode(@g_GameCommand.TESTSPEEDMODE, Str_ToInt(sParam1, 0), Str_ToInt(sParam2, 0));
Exit;
end;
end;
end; //004D52B5
SysMsg('@' + sCmd + sHint15, c_Red, t_Hint);
except
on E: Exception do begin
MainOutMessage(Format(sExceptionMsg, [sData]));
MainOutMessage(E.Message);
end;
end;
end;
//刷新人物附加属性
procedure TPlayObject.QuerySubAbility;
begin
if Assigned(m_VersionManage) then
try
m_VersionManage.OnQuerySubAbility(Self);
except
MainOutMessage(Format('TPlayObject::OnQuerySubAbility SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
end;
function TPlayObject.QuestCheckItem(sItemName: string; var nCount,
nParam: Integer; var nDura: Integer): pTUserItem;
var
i : Integer;
UserItem : pTUserItem;
StdItem : pTStdItem;
begin
Result := nil;
nParam := 0;
nDura := 0;
nCount := 0;
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[i];
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if (StdItem <> nil) then begin
if CompareText(StdItem.Name, sItemName) = 0 then begin
if UserItem.Dura > nDura then begin
nDura := UserItem.Dura;
Result := UserItem;
end;
Inc(nParam, UserItem.Dura);
if Result = nil then
Result := UserItem;
if CheckSPCode(StdItem.Reserved, RE_ALLOWPILE) then
Inc(nCount, UserItem.Dura)
else
Inc(nCount);
end;
end;
end;
end;
function TPlayObject.QuestCheckItemEx(sItemName: string; nDura: Integer; boParam: Boolean):
Integer;
var
i : Integer;
UserItem : pTUserItem;
s1C : string;
begin
Result := 0;
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[i];
s1C := UserEngine.GetStdItemName(UserItem.wIndex);
if CompareText(s1C, sItemName) = 0 then begin
if (UserItem.Dura >= nDura) and (boParam = False) then begin
Inc(Result);
end;
if (UserItem.Dura = nDura) and (boParam = True) then begin
Inc(Result);
end;
end;
end;
end;
function TPlayObject.QuestCheckItemX(sItemName: string; var nCount,
nParam: Integer; var nDura: Integer): pTUserItem; //004C4B78
var
i : Integer;
UserItem : pTUserItem;
s1C : string;
begin
Result := nil;
if m_nStoreMakeIndex = 0 then Exit;
nParam := 0;
nDura := 0;
nCount := 0;
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[i];
if UserItem.MakeIndex = m_nStoreMakeIndex then begin
if UserItem.Dura > nDura then begin
nDura := UserItem.Dura;
Result := UserItem;
Inc(nCount);
Break;
end;
end;
end;
end;
function TPlayObject.QuestTakeCheckItem(CheckItem: pTUserItem): Boolean;
//004C4F6C
var
i : Integer;
UserItem : pTUserItem;
StdItem : pTStdItem;
begin
Result := False;
for i := m_ItemList.Count - 1 downto 0 do begin
UserItem := m_ItemList.Items[i];
if UserItem = CheckItem then begin
SendDelItems(UserItem);
Dispose(UserItem);
m_ItemList.Delete(i);
Result := True;
Break;
end;
end;
for i := Low(m_UseItems) to High(m_UseItems) do begin
if @m_UseItems[i] = CheckItem then begin
StdItem := UserEngine.GetStdItem(m_UseItems[i].wIndex);
if StdItem = nil then Continue;
SendDelItems(@m_UseItems[i]);
m_UseItems[i].wIndex := 0;
//取下装备触发脚本
m_sScriptParam[0] := StdItem.Name;
m_sScriptParam[1] := StdItem.FilterName;
ExecuteScript(g_FunctionNPC, '@TakeOff' + IntToStr(i));
Result := True;
Break;
end;
end;
end;
procedure TPlayObject.ReadAllBook();
var
i : Integer;
Magic : pTMagic;
begin
for i := 0 to UserEngine.m_MagicList.Count - 1 do begin
Magic := UserEngine.m_MagicList.Items[i];
AddItemSkill(Magic, 2, 0, 100000);
end;
end;
procedure TPlayObject.RecalcAbilitys(boAction: Boolean = False);
begin
FillChar(m_ExemptHurt, SizeOf(m_ExemptHurt), 0);
inherited RecalcAbilitys(boAction);
m_nAllIncReply := 0;
RecalcAdjusBonus();
RecalcAdditionalAbil(); //元婴附加属性
SendUpdateMsg(Self, RM_CHARSTATUSCHANGED, m_nHitSpeed, m_nCharStatus, 0, 0, GetCharStatusMsg);
end;
procedure TPlayObject.RecalcAbilitysEx();
begin
inherited;
RecalcAddProvisionalAbil(); //脚本增加的人物临时属性
RecalcAddInosculatePneumaAbil(); //融合元神附加属性
RecalcMentalLevelAbilitys; //天元心法附加属性
RecalcAddPetAbil; //灵兽附加属性
end;
//元婴附加属性
procedure TPlayObject.RecalcAdditionalAbil();
begin
if not m_boPneuma then begin
m_WAbil.DC := MakeLong(loword(m_WAbil.DC) + (m_Dan.SoulBaby.Abil.btDc shr 4), hiword(m_WAbil.DC) + (m_Dan.SoulBaby.Abil.btDc and $0F));
m_WAbil.MC := MakeLong(loword(m_WAbil.MC) + (m_Dan.SoulBaby.Abil.btMc shr 4), hiword(m_WAbil.MC) + (m_Dan.SoulBaby.Abil.btMc and $0F));
m_WAbil.SC := MakeLong(loword(m_WAbil.SC) + (m_Dan.SoulBaby.Abil.btSc shr 4), hiword(m_WAbil.SC) + (m_Dan.SoulBaby.Abil.btSc and $0F));
m_WAbil.AC := MakeLong(loword(m_WAbil.AC) + (m_Dan.SoulBaby.Abil.btAC shr 4), hiword(m_WAbil.AC) + (m_Dan.SoulBaby.Abil.btAC and $0F));
m_WAbil.MAC := MakeLong(loword(m_WAbil.MAC) + (m_Dan.SoulBaby.Abil.btMAC shr 4), hiword(m_WAbil.MAC) + (m_Dan.SoulBaby.Abil.btMAC and $0F));
if (m_PneumaObject <> nil) then begin
TPlayObject(m_PneumaObject).RecalcAbilitys;
m_PneumaObject.SendMsg(m_PneumaObject, RM_ABILITY, 0, 0, 0, 0, '');
end;
end else begin
if (m_PneumaObject <> nil) then begin
m_WAbil.dwMaxHP := _MIN(MAXHUMHP, m_WAbil.dwMaxHP + TPlayObject(m_PneumaObject).m_Dan.SoulBaby.Abil.btHP);
m_WAbil.DC := MakeLong(loword(m_WAbil.DC) + (TPlayObject(m_PneumaObject).m_Dan.SoulBaby.Abil.btPneuma shr 4),
hiword(m_WAbil.DC) + (TPlayObject(m_PneumaObject).m_Dan.SoulBaby.Abil.btPneuma and $0F));
m_WAbil.MC := MakeLong(loword(m_WAbil.MC) + (TPlayObject(m_PneumaObject).m_Dan.SoulBaby.Abil.btPneuma shr 4),
hiword(m_WAbil.MC) + (TPlayObject(m_PneumaObject).m_Dan.SoulBaby.Abil.btPneuma and $0F));
m_WAbil.SC := MakeLong(loword(m_WAbil.SC) + (TPlayObject(m_PneumaObject).m_Dan.SoulBaby.Abil.btPneuma shr 4),
hiword(m_WAbil.SC) + (TPlayObject(m_PneumaObject).m_Dan.SoulBaby.Abil.btPneuma and $0F));
end;
end;
end;
//重新计算校正点数
procedure TPlayObject.RecalcAdjusBonus();
procedure AdjustAb(Abil: word; Val: word; var lov, hiv: word);
var
Lo, Hi : byte;
i : Integer;
begin
Lo := LoByte(Abil);
Hi := HiByte(Abil);
lov := 0;
hiv := 0;
for i := 1 to Val do begin
if Lo + 1 < Hi then begin
Inc(Lo);
Inc(lov);
end else begin
Inc(Hi);
Inc(hiv);
end;
end;
end;
var
BonusTick : pTNakedAbility;
NakedAbil : pTNakedAbility;
adc, amc, asc, aac, amac : Integer;
ldc, lmc, lsc, lac, lmac, hdc, hmc, hsc, hac, hmac: word;
begin
BonusTick := nil;
NakedAbil := nil;
case m_btJob of
0: begin
BonusTick := @g_Config.BonusAbilofWarr;
NakedAbil := @g_Config.NakedAbilofWarr;
end;
1: begin
BonusTick := @g_Config.BonusAbilofWizard;
NakedAbil := @g_Config.NakedAbilofWizard;
end;
2: begin
BonusTick := @g_Config.BonusAbilofTaos;
NakedAbil := @g_Config.NakedAbilofTaos;
end;
3: begin
BonusTick := @g_Config.BonusAbilofGoblin;
NakedAbil := @g_Config.NakedAbilofGoblin;
end;
end;
adc := m_BonusAbil.DC div BonusTick.DC;
amc := m_BonusAbil.MC div BonusTick.MC;
asc := m_BonusAbil.SC div BonusTick.SC;
aac := m_BonusAbil.AC div BonusTick.AC;
amac := m_BonusAbil.MAC div BonusTick.MAC;
AdjustAb(NakedAbil.DC, adc, ldc, hdc);
AdjustAb(NakedAbil.MC, amc, lmc, hmc);
AdjustAb(NakedAbil.SC, asc, lsc, hsc);
AdjustAb(NakedAbil.AC, aac, lac, hac);
AdjustAb(NakedAbil.MAC, amac, lmac, hmac);
if (m_btJob = 3) then
m_WAbil.GC := MakeLong(loword(m_WAbil.GC) + ldc, hiword(m_WAbil.GC) + hdc)
else
m_WAbil.DC := MakeLong(loword(m_WAbil.DC) + ldc, hiword(m_WAbil.DC) + hdc);
m_WAbil.MC := MakeLong(loword(m_WAbil.MC) + lmc, hiword(m_WAbil.MC) + hmc);
m_WAbil.SC := MakeLong(loword(m_WAbil.SC) + lsc, hiword(m_WAbil.SC) + hsc);
m_WAbil.AC := MakeLong(loword(m_WAbil.AC) + lac, hiword(m_WAbil.AC) + hac);
m_WAbil.MAC := MakeLong(loword(m_WAbil.MAC) + lmac, hiword(m_WAbil.MAC) + hmac);
m_WAbil.dwMaxHP := _MIN(MAXHUMHP, m_WAbil.dwMaxHP + m_BonusAbil.HP div BonusTick.HP);
m_WAbil.dwMaxMP := _MIN(MAXHUMMP, m_WAbil.dwMaxMP + m_BonusAbil.MP div BonusTick.MP);
m_dwSpeedPoint := m_dwSpeedPoint + m_BonusAbil.Speed div BonusTick.Speed;
m_dwHitPoint := m_dwHitPoint + m_BonusAbil.Hit div BonusTick.Hit;
end;
procedure TPlayObject.RecalcTigerLevelAbilitys;
var
TigerAbility : pTAbilityOfTiger;
begin
if m_boPneuma then Exit;
if m_btJob = 3 then Exit; //妖士是没有虎王
if (m_TorDDM.Tiger.DB.level >= 0) then begin
TigerAbility := UserEngine.GetTigerAbilByLevel(m_TorDDM.Tiger.DB.level, m_TorDDM.Tiger.DB.Dragon);
if TigerAbility <> nil then begin
//读取的数据库属性
m_TorDDM.Tiger.Abil.MaxExp := TigerAbility.MaxExp;
m_TorDDM.Tiger.Abil.MaxHP := TigerAbility.MaxHP;
m_TorDDM.Tiger.AddAbil.HP := TigerAbility.MaxHP;
m_TorDDM.Tiger.Abil.DC := TigerAbility.DC;
m_TorDDM.Tiger.Abil.DC2 := TigerAbility.DC2;
m_TorDDM.Tiger.Abil.MC := TigerAbility.MC;
m_TorDDM.Tiger.Abil.MC2 := TigerAbility.MC2;
m_TorDDM.Tiger.Abil.AC := TigerAbility.AC;
m_TorDDM.Tiger.Abil.AC2 := TigerAbility.AC2;
m_TorDDM.Tiger.Abil.MAC := TigerAbility.MAC;
m_TorDDM.Tiger.Abil.MAC2 := TigerAbility.MAC2;
m_TorDDM.Tiger.Abil.HitPoint := TigerAbility.HitPoint;
m_TorDDM.Tiger.Abil.MagicNicety := TigerAbility.MagicNicety;
m_TorDDM.Tiger.Abil.SpeedPoint := TigerAbility.SpeedPoint;
m_TorDDM.Tiger.Abil.AntiMagic := TigerAbility.AntiMagic;
m_TorDDM.Tiger.Abil.Felement := TigerAbility.Felement;
end;
end;
end;
procedure TPlayObject.RecalcTigerAbility;
var
i : Integer;
StdItem : pTStdItem;
TigerAbility : pTAbilityOfTiger;
boWeared : Boolean;
procedure GetItemAccessory(Item: TUserItem; var AddAbility: TAddAbilityOfTiger);
var
StdItem : pTStdItem;
StdItemA : TStdItem;
i : Integer;
begin
StdItem := UserEngine.GetStdItem(Item.wIndex);
if StdItem = nil then Exit;
StdItemA := StdItem^;
ItemUnit.GetItemAddValue(@Item, StdItemA);
AddAbility.AC := MakeLong(_MIN(High(word), LoWord(AddAbility.AC) + LoWord(StdItemA.AC)), _MIN(High(word), HiWord(AddAbility.AC) + HiWord(StdItemA.AC)));
AddAbility.MAC := MakeLong(_MIN(High(word), LoWord(AddAbility.MAC) + LoWord(StdItemA.MAC)), _MIN(High(word), HiWord(AddAbility.MAC) + HiWord(StdItemA.MAC)));
AddAbility.DC := MakeLong(_MIN(High(word), LoWord(AddAbility.DC) + LoWord(StdItemA.DC)), _MIN(High(word), HiWord(AddAbility.DC) + HiWord(StdItemA.DC)));
AddAbility.MC := MakeLong(_MIN(High(word), LoWord(AddAbility.MC) + LoWord(StdItemA.MC)), _MIN(High(word), HiWord(AddAbility.MC) + HiWord(StdItemA.MC)));
AddAbility.HitPoint := _MIN(High(byte), AddAbility.HitPoint + LoWord(StdItemA.MC));
AddAbility.SpeedPoint := _MIN(High(byte), AddAbility.SpeedPoint + HiWord(StdItemA.MC));
AddAbility.AntiMagic := _MIN(High(byte), AddAbility.AntiMagic + LoWord(StdItemA.SC));
AddAbility.FelementDC := _MIN(High(word), AddAbility.FelementDC + HiWord(StdItemA.SC));
AddAbility.FelementAC := _MIN(High(word), AddAbility.FelementAC + HiWord(StdItemA.SC));
AddAbility.HP := _MIN(MAXHUMHP, AddAbility.HP + StdItemA.NeedAmbit);
end;
begin
if m_boPneuma then Exit;
if m_btJob = 3 then Exit; //妖士是没有虎王
FillChar(m_TorDDM.Tiger.AddAbil, SizeOf(TAddAbilityOfTiger), #0);
//计算基本属性
m_TorDDM.Tiger.AddAbil.AC := MakeLong(m_TorDDM.Tiger.Abil.AC, m_TorDDM.Tiger.Abil.AC2);
m_TorDDM.Tiger.AddAbil.MAC := MakeLong(m_TorDDM.Tiger.Abil.MAC, m_TorDDM.Tiger.Abil.MAC2);
m_TorDDM.Tiger.AddAbil.DC := MakeLong(m_TorDDM.Tiger.Abil.DC, m_TorDDM.Tiger.Abil.DC2);
m_TorDDM.Tiger.AddAbil.MC := MakeLong(m_TorDDM.Tiger.Abil.MC, m_TorDDM.Tiger.Abil.MC2);
m_TorDDM.Tiger.AddAbil.HitPoint := m_TorDDM.Tiger.Abil.HitPoint;
m_TorDDM.Tiger.AddAbil.MagicNicety := m_TorDDM.Tiger.Abil.MagicNicety;
m_TorDDM.Tiger.AddAbil.SpeedPoint := m_TorDDM.Tiger.Abil.SpeedPoint;
m_TorDDM.Tiger.AddAbil.AntiMagic := m_TorDDM.Tiger.Abil.AntiMagic;
m_TorDDM.Tiger.AddAbil.HP := _MIN(MAXHUMHP, m_TorDDM.Tiger.Abil.MaxHP + m_TorDDM.Tiger.ProAbil.HP);
m_TorDDM.Tiger.AddAbil.FelementDC := _MIN(High(word), m_TorDDM.Tiger.Abil.Felement + m_TorDDM.Tiger.ProAbil.Felement);
m_TorDDM.Tiger.AddAbil.FelementAC := _MIN(High(word), m_TorDDM.Tiger.Abil.Felement + m_TorDDM.Tiger.ProAbil.Felement);
//计算虎王装备属性
boWeared := True;
for i := 0 to MAX_TIGER_ITEM_COUNT - 1 do begin
if (m_TorDDM.Tiger.Items[i].wIndex <= 0) or (m_TorDDM.Tiger.Items[i].Dura <= 0) then begin
boWeared := False;
Continue;
end;
//物品不存在或物品已损坏
StdItem := UserEngine.GetStdItem(m_TorDDM.Tiger.Items[i].wIndex);
if StdItem = nil then Continue;
GetItemAccessory(m_TorDDM.Tiger.Items[i], m_TorDDM.Tiger.AddAbil);
end;
SendMsg(Self, RM_TIGERADDABIL, 0, 0, 0, 0, '');
if (m_Tiger <> nil) then begin
SendTigerInfo;
m_Tiger.RecalcAbilitys;
if m_TorDDM.Tiger.DB.Dragon = 0 then begin
if (m_TorDDM.Tiger.DB.level >= 50) then begin
m_Tiger.m_wAppr := 349;
m_Tiger.m_sCharName := '啸天虎王';
end else begin
m_Tiger.m_wAppr := 350;
m_Tiger.m_sCharName := '啸天虎';
end;
if boWeared then m_Tiger.m_wAppr := 384;
m_Tiger.RefShowName;
m_Tiger.FeatureChanged;
end;
end;
end;
//根据通灵塔等级和官职获得属性点加成
procedure TPlayObject.RecalcTowerAbility();
var
i, nTowerGrade, nRank : Integer;
nMinValue, nMaxValue : Integer;
btPrOffer : byte;
begin
btPrOffer := m_GuildTowerInfo.btPrOffer;
FillChar(m_GuildTowerInfo, SizeOf(TGuildTowerInfo), #0);
if m_MyGuild = nil then Exit;
nTowerGrade := _MIN(10, TGuild(m_MyGuild).btTowerGrade);
nRank := _MIN(11, m_nGuildRankNo);
if (nTowerGrade > 0) then begin
m_GuildTowerInfo.wX := TGuild(m_MyGuild).wTowerX;
m_GuildTowerInfo.wY := TGuild(m_MyGuild).wTowerY;
m_GuildTowerInfo.btResFull := byte(TGuild(m_MyGuild).boTowerStatus);
m_GuildTowerInfo.btPrOffer := btPrOffer;
//以下为本体DC\MC\SC计算公式
case m_btJob of
0: begin
nMinValue := byte(LoByte(g_Config.GuildTowerAbility.wDC) > 0) * (LoByte(g_Config.GuildTowerAbility.wDC) - ((nRank + 7) div 9) + nTowerGrade - 1);
nMaxValue := byte(HiByte(g_Config.GuildTowerAbility.wDC) > 0) * (HiByte(g_Config.GuildTowerAbility.wDC) - ((nRank + 7) div 9) + nTowerGrade - 1);
m_GuildTowerInfo.Ability.wDC := MakeWord(_MIN(High(byte), nMinValue * g_Config.nGuildTowerAbilityRate div 10), _MIN(High(byte), nMaxValue * g_Config.nGuildTowerAbilityRate div 10));
end;
1: begin
nMinValue := byte(LoByte(g_Config.GuildTowerAbility.wMC) > 0) * (LoByte(g_Config.GuildTowerAbility.wMC) - ((nRank + 7) div 9) + nTowerGrade - 1);
nMaxValue := byte(HiByte(g_Config.GuildTowerAbility.wMC) > 0) * (HiByte(g_Config.GuildTowerAbility.wMC) - ((nRank + 7) div 9) + nTowerGrade - 1);
m_GuildTowerInfo.Ability.wMC := MakeWord(_MIN(High(byte), nMinValue * g_Config.nGuildTowerAbilityRate div 10), _MIN(High(byte), nMaxValue * g_Config.nGuildTowerAbilityRate div 10));
end;
2: begin
nMinValue := byte(LoByte(g_Config.GuildTowerAbility.wSC) > 0) * (LoByte(g_Config.GuildTowerAbility.wSC) - ((nRank + 7) div 9) + nTowerGrade - 1);
nMaxValue := byte(HiByte(g_Config.GuildTowerAbility.wSC) > 0) * (HiByte(g_Config.GuildTowerAbility.wSC) - ((nRank + 7) div 9) + nTowerGrade - 1);
m_GuildTowerInfo.Ability.wSC := MakeWord(_MIN(High(byte), nMinValue * g_Config.nGuildTowerAbilityRate div 10), _MIN(High(byte), nMaxValue * g_Config.nGuildTowerAbilityRate div 10));
end;
3: begin //妖
end;
end;
//以下为计算AC、MAC公式
if nRank < 3 then begin
nMinValue := byte(LoByte(g_Config.GuildTowerAbility.wAC) > 0) * (nTowerGrade + LoByte(g_Config.GuildTowerAbility.wAC) - m_nGuildRankNo);
nMaxValue := byte(HiByte(g_Config.GuildTowerAbility.wAC) > 0) * (nTowerGrade + HiByte(g_Config.GuildTowerAbility.wAC) - m_nGuildRankNo);
m_GuildTowerInfo.Ability.wAC := MakeWord(_MIN(High(byte), nMinValue * g_Config.nGuildTowerAbilityRate div 10), _MIN(High(byte), nMaxValue * g_Config.nGuildTowerAbilityRate div 10));
nMinValue := byte(LoByte(g_Config.GuildTowerAbility.wMAC) > 0) * (nTowerGrade + LoByte(g_Config.GuildTowerAbility.wMAC) - m_nGuildRankNo);
nMaxValue := byte(HiByte(g_Config.GuildTowerAbility.wMAC) > 0) * (nTowerGrade + HiByte(g_Config.GuildTowerAbility.wMAC) - m_nGuildRankNo);
m_GuildTowerInfo.Ability.wMAC := MakeWord(_MIN(High(byte), nMinValue * g_Config.nGuildTowerAbilityRate div 10), _MIN(High(byte), nMaxValue * g_Config.nGuildTowerAbilityRate div 10));
end else begin
nMinValue := byte(LoByte(g_Config.GuildTowerAbility.wAC) > 0) * (nTowerGrade + LoByte(g_Config.GuildTowerAbility.wAC) - ((nRank + 3) div 2));
nMaxValue := byte(HiByte(g_Config.GuildTowerAbility.wAC) > 0) * (nTowerGrade + HiByte(g_Config.GuildTowerAbility.wAC) - ((nRank + 3) div 2));
m_GuildTowerInfo.Ability.wAC := MakeWord(_MIN(High(byte), nMinValue * g_Config.nGuildTowerAbilityRate div 10), _MIN(High(byte), nMaxValue * g_Config.nGuildTowerAbilityRate div 10));
nMinValue := byte(LoByte(g_Config.GuildTowerAbility.wMAC) > 0) * (nTowerGrade + LoByte(g_Config.GuildTowerAbility.wMAC) - ((nRank + 3) div 2));
nMaxValue := byte(HiByte(g_Config.GuildTowerAbility.wMAC) > 0) * (nTowerGrade + HiByte(g_Config.GuildTowerAbility.wMAC) - ((nRank + 3) div 2));
m_GuildTowerInfo.Ability.wMAC := MakeWord(_MIN(High(byte), nMinValue * g_Config.nGuildTowerAbilityRate div 10), _MIN(High(byte), nMaxValue * g_Config.nGuildTowerAbilityRate div 10));
end;
//以下为命中、魔法躲避等属性计算
if nTowerGrade >= 5 then begin
m_GuildTowerInfo.Ability.btMagicNicety := byte(g_Config.GuildTowerAbility.btMagicNicety > 0) * (nTowerGrade + g_Config.GuildTowerAbility.btMagicNicety - 5);
m_GuildTowerInfo.Ability.btHitPoint := byte(g_Config.GuildTowerAbility.btHitPoint > 0) * (nTowerGrade + g_Config.GuildTowerAbility.btHitPoint - 5);
m_GuildTowerInfo.Ability.btAntiMagic := byte(g_Config.GuildTowerAbility.btAntiMagic > 0) * (nTowerGrade + g_Config.GuildTowerAbility.btAntiMagic - 5);
m_GuildTowerInfo.Ability.btSpeedPoint := byte(g_Config.GuildTowerAbility.btSpeedPoint > 0) * (nTowerGrade + g_Config.GuildTowerAbility.btSpeedPoint - 5);
end;
//元神属性与本体一样
Move(m_GuildTowerInfo.Ability, m_GuildTowerInfo.u_Ability, SizeOf(TGuildTowerAbility));
end;
end;
function TPlayObject.RecallHuman(sHumName: string; wRecallType: word): Boolean;
var
PlayObject : TPlayObject;
nX, nY, n18, n1C, nMapIndex : Integer;
begin
Result := False;
PlayObject := UserEngine.GetPlayObject(sHumName);
if PlayObject <> nil then begin
if PlayObject.m_wShopItemCount > 0 then begin
SysMsg('对方在摆摊,无法被召唤。', c_Red, t_Hint);
PlayObject.SysMsg(m_sCharName + ' 正在召唤你,只有结束摆摊才能被召唤。', c_Red, t_Hint);
Exit;
end;
if PlayObject.m_boArrow then begin
SysMsg('对方正在执行任务,无法被召唤。', c_Red, t_Hint);
PlayObject.SysMsg(m_sCharName + ' 正在召唤你,只有结束当前任务才能被召唤。', c_Red, t_Hint);
Exit;
end;
if GetFrontPosition(nX, nY) then begin
if GetCanMovePosition(nX, nY, 3, n18, n1C) then begin
PlayObject.SendRefMsg(RM_SPACEMOVE_FIRE, 0, 0, 0, 0, '');
nMapIndex := m_PEnvir.Index;
PlayObject.SpaceMove(m_sMapName, n18, n1C, 0, @nMapIndex);
if wRecallType <> 0 then
PlayObject.SendRefMsg(RM_510, 1, 0, wRecallType, 0, '');
end;
Result := True;
end else begin
SysMsg('召唤失败!!!', c_Red, t_Hint);
end;
end else begin
SysMsg(Format(g_sNowNotOnLineOrOnOtherServer, [sHumName]), c_Red, t_Hint);
end;
end;
procedure TPlayObject.RecordHomeXY(nParam1: Integer; nMapIdx: Integer);
begin
if (nParam1 < 0) or (nMapIdx < 0) then Exit;
if Assigned(m_VersionManage) then
try
m_VersionManage.OnRecordHomeXY(Self, nParam1, nMapIdx);
except
MainOutMessage(Format('TPlayObject::RecordHomeXY SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
end;
procedure TPlayObject.RecordHomeXY(nParam1: Integer; sMsg: string);
var
sMapName : string;
begin
if (sMsg <> '') then begin
sMapName := DeCodeString(sMsg);
if g_Config.boClassicServer then begin
if (sMapName = '0') then
RecordHomeXY(nParam1, 2)
else if (sMapName = '2') then
RecordHomeXY(nParam1, 3)
else if (sMapName = '7') then
RecordHomeXY(nParam1, 6)
else if (sMapName = '5') then
RecordHomeXY(nParam1, 5)
else if (sMapName = '4') then
RecordHomeXY(nParam1, 4)
else if (sMapName = 'haidi') then
RecordHomeXY(nParam1, 9)
else if (sMapName = '1') then
RecordHomeXY(nParam1, 1)
else if (sMapName = 'zqd') then
RecordHomeXY(nParam1, 0);
end else begin
if (sMapName = '0') then
RecordHomeXY(nParam1, 1)
else if (sMapName = '1') then
RecordHomeXY(nParam1, 0)
else if (sMapName = '2') then
RecordHomeXY(nParam1, 2)
else if (sMapName = '4') then
RecordHomeXY(nParam1, 3)
else if (sMapName = '5') then
RecordHomeXY(nParam1, 4)
else if (sMapName = '7') then
RecordHomeXY(nParam1, 5)
end;
end;
end;
//我的状态
procedure TPlayObject.RefMyStatus();
begin
RecalcAbilitys();
SendMsg(Self, RM_MYSTATUS, 0, 0, 0, 0, '');
end;
procedure TPlayObject.RefRankInfo(nRankNo: Integer; sRankName: string);
begin
m_nGuildRankNo := nRankNo;
m_sGuildRankName := sRankName;
SendMsg(Self, RM_CHANGEGUILDNAME, 0, 0, 0, 0, '');
end;
//地区状态(只发送给自己)
procedure TPlayObject.RefUserState(); //004D6870
var
N8 : Integer;
begin
N8 := 0;
if m_PEnvir.m_MapFlag.boFight then N8 := N8 or 1;
if m_PEnvir.m_MapFlag.boSAFE then N8 := N8 or 2;
if m_boInFreePKArea then N8 := N8 or 4;
SendDefMessage(SM_AREASTATE, N8, 0, 0, 0, '');
end;
{释放附魔属性}
procedure TPlayObject.ReleaseEvil(nMakeIndex: Integer);
var
UserItem : pTUserItem;
pStdItem : pTStdItem;
begin
GetUserItemByMakeIndex(nMakeIndex, UserItem);
if (UserItem <> nil) then begin
pStdItem := UserEngine.GetStdItem(UserItem.wIndex);
if (pStdItem <> nil) then begin
if (UserItem.Evil.sName = '') or (UserItem.Evil.MakeIndex = 0) then begin
SysMsg(Format('没有从%s中感应到心魔气息。', [pStdItem.FilterName]), c_Red, t_Hint);
Exit;
end;
FillChar(UserItem.Evil, SizeOf(TEvil), #0); //删除心魔数据
SendUpdateItem(UserItem, false);
SendDefMessage(SM_ITEMEVIL, Integer(Self), LoWord(nMakeIndex), HiWord(nMakeIndex), 0, '');
SendRefMsg(RM_510, 1, 0, 60, 0, '');
end;
end;
end;
function TPlayObject.RepairWeapon: Boolean;
var
nDura : Integer;
UserItem : pTUserItem;
StdItem : pTStdItem;
begin
Result := False;
UserItem := @m_UseItems[U_WEAPON];
if (UserItem.wIndex <= 0) or (UserItem.DuraMax <= UserItem.Dura) then Exit;
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem = nil then Exit;
{物品控制-禁止修理}
if CheckSPCode(StdItem.SPCode, SP_DISABLEREPAIR) then begin
SysMsg('此物品禁止修理', c_Red, t_Hint);
Exit;
end;
Dec(UserItem.DuraMax, (UserItem.DuraMax - UserItem.Dura) div
g_Config.nRepairItemDecDura {30});
nDura := _MIN(5000, UserItem.DuraMax - UserItem.Dura);
if nDura > 0 then begin
Inc(UserItem.Dura, nDura);
SendMsg(Self, RM_DURACHANGE, 1, UserItem.Dura, UserItem.DuraMax, 0, '');
SysMsg(g_sWeaponRepairSuccess {'武器修复成功...'}, c_Green, t_Hint);
Result := True;
end;
end;
procedure TPlayObject.ReQuestGuildWar(sGuildName: string; WarTime: Integer = 0);
var
Guild : TGuild;
WarGuild : pTWarGuild;
boReQuestOK : Boolean;
begin
if not IsGuildMaster then begin
SysMsg('只有行会掌门人才能申请!!!', c_Red, t_Hint);
Exit;
end;
if g_Config.nServerNumber <> 0 then begin
SysMsg('这个命令不能在本服务器上使用!!!', c_Red,
t_Hint);
Exit;
end;
Guild := g_GuildManager.FindGuild(sGuildName);
if Guild = nil then begin
SysMsg('行会不存在!!!', c_Red, t_Hint);
Exit;
end;
boReQuestOK := False;
WarGuild := TGuild(m_MyGuild).AddWarGuild(Guild);
if WarGuild <> nil then begin
if Guild.AddWarGuild(TGuild(m_MyGuild)) = nil then begin
WarGuild.dwWarTick := 0;
end else begin
boReQuestOK := True;
end;
end;
if boReQuestOK then begin
UserEngine.SendServerGroupMsg(SS_207, g_Config.nServerNumber,
TGuild(m_MyGuild).sGuildName);
UserEngine.SendServerGroupMsg(SS_207, g_Config.nServerNumber, Guild.sGuildName);
end;
end;
procedure TPlayObject.ClientCheckVerifyCode(sVerifyCode: string; boOutTime: Boolean = False);
var
NPC : TNormNpc;
boNo : Boolean;
begin
if m_VerifyCodeInfo.pNextNpc <> nil then begin
try
NPC := UserEngine.FindMerchant(m_VerifyCodeInfo.pNextNpc);
if NPC = nil then NPC := UserEngine.FindNPC(m_VerifyCodeInfo.pNextNpc);
finally
m_VerifyCodeInfo.pNextNpc := nil;
m_VerifyCodeInfo.nBeginTick := GetTickCount();
end;
if NPC <> nil then begin
if m_VerifyCodeInfo.sNextLabel <> '' then begin
try
if sVerifyCode <> '' then
sVerifyCode := UpperCase(DeCodeString(sVerifyCode));
boNo := sVerifyCode <> m_VerifyCodeInfo.sVerifyCode;
if boNo then
Inc(m_VerifyCodeInfo.nCurErrorOrd)
else
m_VerifyCodeInfo.nCurErrorOrd := 0;
m_sScriptParam[0] := IntToStr(m_VerifyCodeInfo.nCurErrorOrd);
m_sScriptParam[1] := BoolToIntStr(boOutTime);
NPC.GotoLable(Self, m_VerifyCodeInfo.sNextLabel, False);
m_VerifyCodeInfo.nCurErrorOrd := StrToInt(m_sScriptParam[0]);
except
end;
end;
end;
end;
end;
procedure TPlayObject.Run();
var
tObjCount : Integer;
nInteger : Integer;
ProcessMsg : TProcessMessage;
boInSafeArea : Boolean;
boNeedRecalc : Boolean;
i : Integer;
nCount : Integer;
boOldHasbox : Boolean;
StdItem : pTStdItem;
UserItem : pTUserItem;
PlayObject : TPlayObject;
boTakeItem : Boolean;
Castle : TUserCastle;
sTmpLabel : string;
TmpNpc : TNormNpc;
NowTick : DWORD;
DelayCall : pTDelayCall;
ArrowRec : pTArrowRec;
nc, nX, nY : Integer;
nCheckCode : Integer;
tm : DWORD;
resourcestring
sPayMentExpire = '您的帐户充值时间已到期!!!';
sDisConnectMsg = '游戏被强行中断!!!';
sExceptionMsg1 = '[Exception] TPlayObject::Run -> Operate 1 Code=%d';
sExceptionMsg2 = '[Exception] TPlayObject::Run -> Operate 2 Code=%d # Map:%s(%d,%d)%s Ident:%d Sender:%d wP:%d nP1:%d nP2:%d np3:%d Msg:%s DeMsg:%s';
sExceptionMsg3 = '[Exception] TPlayObject::Run -> GetHighHuman';
sExceptionMsg4 = '[Exception] TPlayObject::Run -> ClearObj';
sExceptionMsg5 = '[Exception] TPlayObject::Run -> AutoGetExpPoint';
sArrowExcept = 'TPlayObject::Run 执行SetArrow列表出错:';
sCheckItemExcept = 'TPlayObject::Run 非法物品检测出错';
sExceptionMsg6 = '[Exception] TPlayObject::Run -> 天关幻镜 ';
sExceptionMsg7 = '[Exception] TPlayObject::Run -> 减少镇魔值';
sExpRateNorm = '经验倍数恢复正常...';
sExpLoitRateNorm = '功勋倍数恢复正常...';
sPowerRateNorm = '攻击力倍数恢复正常...';
sDefenceRateNorm = '防御力倍数恢复正常...';
sBurstRateNorm = '杀怪爆率恢复正常...';
sExpRepressDemonRateNorm = '镇魔珠经验倍数回叙正常...';
begin
if g_boExitServer then begin
m_boOfflineGetGamePoint := False;
m_boReconnection := False;
m_boEmergencyClose := True;
end;
boNeedRecalc := False;
NowTick := GetTickCount;
try
if m_boDealing then begin //正在交易
if (m_DealCreat = Self) or (m_DealCreat = nil) or (m_btAttatckMode <> HAM_PEACE) or (m_boOfflineGetGamePoint) then
DealCancel();
end;
if (not m_boDeath) then begin
//召唤烈火结束
if m_boFireHitSkill and ((NowTick - m_dwLatestFireHitTick) > 20 * 1000) then begin
m_boFireHitSkill := False;
SysMsg(sSpiritsGone, c_Red, t_Hint);
SendSocket(nil, '+UFIR');
end;
//召唤雷电结束
if m_bo44Skill and ((NowTick - m_dwLatest44HitTick) > 20 * 1000) then begin
m_bo44Skill := False;
SysMsg(sThunderGone, c_Red, t_Hint);
SendSocket(nil, '+UTHU');
end;
//清空元气
if (m_wVitaLity >= 1000) and ((NowTick - m_dwClearVitaLityTick) > g_Config.nClearVitaLityTime * 1000) then begin
DamageVitaLity(1000);
m_dwClearVitaLityTick := NowTick;
end;
if m_boTimeRecall and (NowTick > m_dwTimeRecallTick) then begin
m_boTimeRecall := False;
SpaceMove(m_sMoveMap, m_nMoveX, m_nMoveY, 0, nil);
end;
//检查是否有重叠人物,有的话要走开
if ((NowTick - m_dwCheckDupObjTick) > 3000) and (not m_boGodCallBoss) then begin //如果在神之召唤状态则不检测重叠
m_dwCheckDupObjTick := NowTick;
GetStartPoint(); //重新计算回城点
tObjCount := m_PEnvir.GetXYObjCount(m_nCurrX, m_nCurrY);
if tObjCount >= 2 then begin
if not m_boDupObj then begin
m_boDupObj := True;
m_dwDupObjTick := NowTick;
end;
end else begin
m_boDupObj := False;
end;
if m_boDupObj and ((NowTick - m_dwDupObjTick) > 1000) then begin
m_dwDupObjTick := NowTick;
if (m_wShopItemCount = 0) and (not m_boOfflineGetGamePoint) then
CharPushed(Random(8), 1, False);
end;
end;
//元神移动到玩家身边去
if (m_PneumaObject <> nil) and m_boPneuma then begin
if (m_TargetCret = nil) or (m_TargetCret.m_boGhost) then begin
m_PneumaObject.GetRightPosition(nX, nY);
if (abs(m_nTargetX - nX) > 1) or (abs(m_nTargetY - nY) > 1) then begin
m_nTargetX := nX;
m_nTargetY := nY;
end;
if ((m_PEnvir <> m_PneumaObject.m_PEnvir) or
(abs(m_nCurrX - m_PneumaObject.m_nCurrX) > 20) or
(abs(m_nCurrY - m_PneumaObject.m_nCurrY) > 20)) then begin
SpaceMove(m_PneumaObject.m_PEnvir.m_sMapName, m_nTargetX, m_nTargetY, 0, nil);
SendRefMsg(RM_TURN,
m_btDirection,
m_nCurrX,
m_nCurrY,
CalcCent(m_WAbil.dwHP, m_WAbil.dwMaxHP),
GetShowName);
end;
end;
end;
Castle := g_CastleManager.InCastleWarArea(Self); //当前所在的城堡
if (Castle <> nil) and Castle.m_boUnderWar then begin //城堡正在战斗
ChangePKStatus(True);
//如果当前在摆摊,则强制收摊
if m_wShopItemCount > 0 then begin
CancelDoShop;
end;
end;
if (NowTick - dwTick578) > 1000 then begin
dwTick578 := NowTick;
//行会战争名字颜色
if (m_MyGuild <> nil) then begin
if TGuild(m_MyGuild).m_GuildWarList.Count > 0 then begin
boInSafeArea := InSafeArea();
if boInSafeArea <> m_boInSafeArea then begin
m_boInSafeArea := boInSafeArea;
RefNameColor();
end;
end;
end;
//进出安全区提示
if (not m_boPneuma) then begin
if g_Config.boSafeAreaHint and (GetTickCount - m_dwCheckSafeArea > 2000) then begin
m_dwCheckSafeArea := GetTickCount;
boInSafeArea := InSafeZone;
if boInSafeArea <> m_boInSafezone then begin
m_boInSafezone := boInSafeArea;
if m_boInSafezone then
SysMsg('您已经进入安全区...', c_Red, t_Hint)
else
SysMsg('您已经离开安全区...', c_Red, t_Hint);
end;
end;
end;
if (Castle <> nil) and Castle.m_boUnderWar then begin //攻城战
if (m_PEnvir = Castle.m_MapPalace) and (m_MyGuild <> nil) then begin //在皇宫
if not Castle.IsMember(Self) then begin //不是当前城堡的人
if Castle.IsAttackGuild(TGuild(m_MyGuild)) then begin //攻城方
if Castle.CanGetCastle(TGuild(m_MyGuild)) then begin //是否攻下
Castle.GetCastle(TGuild(m_MyGuild));
UserEngine.SendServerGroupMsg(SS_211, g_Config.nServerNumber,
TGuild(m_MyGuild).sGuildName);
if Castle.InPalaceGuildCount <= 1 then Castle.StopWallconquestWar();
//如果攻城行会只有一个,则结束战斗
end;
end;
end;
end;
end else begin
ChangePKStatus(False);
end;
if m_boNameColorChanged then begin
m_boNameColorChanged := False;
RefUserState();
RefShowName();
end;
end;
//人物死亡移到消息处理上面执行
if (m_WAbil.dwHP = 0) then begin
if (m_UseItems[U_DRESS].wIndex > 0) and
m_UseItems[U_DRESS].IsGod() and
(m_UseItems[U_DRESS].btValue[15] >= 100) then begin
m_UseItems[U_DRESS].btValue[15] := 0;
SendMsg(Self, RM_SENDGODUSEVAL, 1, m_UseItems[U_DRESS].btValue[15], 0, 0, '');
m_WAbil.dwHP := m_WAbil.dwMaxHP;
boNeedRecalc := True;
SysMsg('重塑金身生效,满状态复活', c_Green, t_Hint);
end else begin
if (m_boRevivalEx or ((m_LastHiter = nil) or not m_LastHiter.m_boUnRevival) and m_boRevival) and
(GetTickCount - m_dwRevivalTick > g_Config.dwRevivalTime {60 * 1000}) then begin
m_dwRevivalTick := NowTick;
ItemDamageRevivalRing;
m_WAbil.dwHP := Round(m_WAbil.dwMaxHP * m_nRevivalRate / 100);
boNeedRecalc := True;
SendDefMessage(1639, Integer(Self), Round(g_Config.dwRevivalTime / 1000), 0, 0, '');
SysMsg(g_sRevivalRecoverMsg {'复活戒指生效,体力恢复'}, c_Green, t_Hint);
end;
end;
if m_WAbil.dwHP = 0 then Die;
end;
end;
except
MainOutMessage(Format(sExceptionMsg1, [0]));
end;
//清除摆摊的指针
if (m_PackPet <> nil) then begin
if m_PackPet.m_boDeath or m_PackPet.m_boGhost then begin
m_PackPet := nil;
m_PetInfo[1].nMakeIndex := 0;
m_PetInfo[1].wLevel := 0;
m_PetInfo[1].btType := 0;
m_PetInfo[1].btReLive := 0;
end;
end;
try //处理人物消息
nCheckCode := 0;
m_dwGetMsgTick := GetTickCount;
while (GetTickCount - m_dwGetMsgTick < g_Config.dwHumanGetMsgTime) and GetMessage(@ProcessMsg) do begin
nCheckCode := 1;
if not Operate(@ProcessMsg) then Break;
end;
nCheckCode := 2;
//检查验证码是否超时
if m_VerifyCodeInfo.pNextNpc <> nil then begin
if (GetTickCount - m_VerifyCodeInfo.nBeginTick) > m_VerifyCodeInfo.nOutTime then begin
ClientCheckVerifyCode('', True);
end;
end;
nCheckCode := 3;
//断线
if (m_boEmergencyClose or m_boKickFlag or m_boSoftClose) then begin
if m_boPneuma and (m_PneumaObject <> nil) then begin
nCheckCode := 4;
SendRefMsg(RM_510, 1, 0, 42, 0, '');
//SendDefMessage(SM_OUTOFCONNECTION, 0, 0, 0, 0, '');
TPlayObject(m_PneumaObject).m_dwCallPneumaTick := GetTickCount;
TPlayObject(m_PneumaObject).m_PneumaObject := nil;
if m_boInosculatePneuma then begin
m_PneumaObject.SendMsg(m_PneumaObject, RM_CTRLMENTAL, 0, Integer(m_PneumaObject), 259, 0, '');
//当融合状态下!元神有血是备份到这里的
TPlayObject(m_PneumaObject).m_InosculatePneumaHP := m_WAbil.dwHP;
TPlayObject(m_PneumaObject).m_InosculatePneumaMP := m_WAbil.dwMP;
end;
//清除元神骑站数据
TPlayObject(m_PneumaObject).m_PetInfo[3].nMakeIndex := 0;
TPlayObject(m_PneumaObject).m_PetInfo[3].wLevel := 0;
TPlayObject(m_PneumaObject).m_PetInfo[3].btType := 0;
TPlayObject(m_PneumaObject).m_PetInfo[3].btReLive := 0;
TPlayObject(m_PneumaObject).m_PetInfo[3].btRideFightSpeed := 0;
end else if m_PneumaObject <> nil then begin //人物下线,元神也下线
nCheckCode := 5;
TPlayObject(m_PneumaObject).m_boSoftClose := True;
TPlayObject(m_PneumaObject).SendRefMsg(RM_510, 1, 0, 42, 0, '');
TPlayObject(m_PneumaObject).SendDefMessage(SM_OUTOFCONNECTION, 0, 0, 0, 0, '');
if TPlayObject(m_PneumaObject).m_boInosculatePneuma then begin
//当融合状态下!元神有血是备份到这里的
m_InosculatePneumaHP := TPlayObject(m_PneumaObject).m_WAbil.dwHP;
m_InosculatePneumaMP := TPlayObject(m_PneumaObject).m_WAbil.dwMP;
end;
m_PneumaObject := nil;
end;
nCheckCode := 6;
if m_boSwitchData then begin
m_sMapName := m_sSwitchMapName;
m_nCurrX := m_nSwitchMapX;
m_nCurrY := m_nSwitchMapY;
end;
nCheckCode := 7;
//触发下线脚本
if (m_sOffLineLabel <> '') then begin
ExecuteScript(g_ManageNPC, m_sOffLineLabel);
end;
nCheckCode := 8;
if (not m_boPneuma) and (not g_boExitServer) and (not m_boReconnection) then begin
ExecuteScript(g_ManageNPC, '@PlayOffLine'); //人物下线触发
end;
nCheckCode := 9;
if (not m_boOfflineGetGamePoint) and (not m_boPneuma) and (not g_boExitServer) and (m_boReconnection) then begin
ExecuteScript(g_ManageNPC, '@PlayReconnection'); //人物小退触发
end;
nCheckCode := 10;
if not m_boOfflineGetGamePoint then begin
MakeGhost();
end;
nCheckCode := 11;
if m_boKickFlag and not m_boPneuma then begin
SendDefMessage(SM_OUTOFCONNECTION, 0, 0, 0, 0, '');
end;
nCheckCode := 12;
if not m_boReconnection and m_boSoftClose and not m_boPneuma then begin
if not m_boKickUserSessInfo then begin
m_boKickUserSessInfo := True;
FrmIDSoc.SendHumanLogOutMsg(m_sUserID, m_nSessionID);
end;
end;
end;
nCheckCode := 13;
except
on E: Exception do begin
if ProcessMsg.wIdent = 0 then
MakeGhost();
// 11.22 加上,用于处理 人物异常退出,但人物还在游戏中问题 提示 Ident0 错误
if m_PEnvir = nil then
MainOutMessage(Format(sExceptionMsg2, [nCheckCode, '无效地图', m_nCurrX,
m_nCurrY, m_sCharName,
ProcessMsg.wIdent,
Integer(ProcessMsg.BaseObject),
ProcessMsg.wParam,
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.nParam3,
ProcessMsg.sMsg,
DeCodeString(ProcessMsg.sMsg)
]))
else
MainOutMessage(Format(sExceptionMsg2, [nCheckCode, m_PEnvir.m_sMapName, m_nCurrX,
m_nCurrY, m_sCharName,
ProcessMsg.wIdent,
Integer(ProcessMsg.BaseObject),
ProcessMsg.wParam,
ProcessMsg.nParam1,
ProcessMsg.nParam2,
ProcessMsg.nParam3,
ProcessMsg.sMsg,
DeCodeString(ProcessMsg.sMsg)
]));
MainOutMessage(E.Message);
end;
end;
{夺宝系统}
try
nCheckCode := 100;
i := 0;
nCount := m_ArrowList.Count;
while i < m_ArrowList.Count do begin
nCheckCode := 101;
ArrowRec := pTArrowRec(m_ArrowList.Objects[i]);
nCheckCode := 102;
//检查是否到了最后时间
if ArrowRec.dwEndCheckTime <= GetTickCount then begin
nCheckCode := 103;
ExecuteScript(g_FunctionNPC, ArrowRec.sEndLabel);
nCheckCode := 104;
if nCount = m_ArrowList.Count then begin //防止脚本删除任务
nCheckCode := 105;
m_ArrowList.Delete(i);
nCheckCode := 106;
Dispose(ArrowRec);
end else
Break;
end else if ArrowRec.dwCheckTime <= GetTickCount then begin
nCheckCode := 107;
ExecuteScript(g_FunctionNPC, ArrowRec.sCheckLabel);
if nCount <> m_ArrowList.Count then Break; //防止脚本删除任务
nCheckCode := 108;
ArrowRec.dwCheckTime := ArrowRec.dwCheckTime + ArrowRec.dwCheckInterval;
end;
Inc(i);
end;
boOldHasbox := m_boArrow;
if (nCount > 0) and (m_ArrowList.Count = 0) then begin //取消了所有标签
m_boArrow := False;
for i := m_ItemList.Count - 1 downto 0 do begin //检测包裹中是否有宝盒
UserItem := pTUserItem(m_ItemList[i]);
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem = nil then Continue;
if CheckSPCode(StdItem.Reserved, RE_TREASURE) then begin
m_boArrow := True;
Break;
end;
end;
end else
m_boArrow := m_ArrowList.Count > 0;
if boOldHasbox <> m_boArrow then begin
m_nCharStatus := GetCharStatus();
StatusChanged();
end;
except
on E: Exception do
MainOutMessage(sArrowExcept + IntToStr(nCheckCode) + ' ' + E.Message);
end;
try
//检查身上的装备有没不符合
if (not m_boDeath) then begin
for i := Low(THumItems) to High(THumItems) do begin
if m_UseItems[i].wIndex > 0 then begin
StdItem := UserEngine.GetStdItem(m_UseItems[i].wIndex);
if StdItem <> nil then begin
if not CheckItemsNeed(StdItem) then begin
boTakeItem := False; //0419
New(UserItem);
UserItem^ := m_UseItems[i];
if AddItemToBag(UserItem) then begin
SendAddItem(UserItem);
WeightChanged();
SysMsg('物品 ' + StdItem.Name + ' 已经自动取下。', c_Red, t_Hint);
boTakeItem := True;
end else begin
Dispose(UserItem);
if DropItemDown(@m_UseItems[i], 2, False, nil, Self) then begin
SysMsg('物品 ' + StdItem.Name + ' 自动取下失败,已丢弃。', c_Red, t_Hint);
boTakeItem := True;
end;
end;
if boTakeItem then begin
SendDelItems(@m_UseItems[i]);
m_UseItems[i].wIndex := 0;
RecalcAbilitys(True);
end;
end;
end else begin
SendDelItems(@m_UseItems[i]);
m_UseItems[i].wIndex := 0;
RecalcAbilitys(True);
end;
end;
end;
end;
except
on E: Exception do
MainOutMessage(sCheckItemExcept + E.Message);
end;
if (m_DealCreat <> nil) and (m_DealCreat.m_boGhost) then m_DealCreat := nil; //交易方死亡
if (m_dwEatTalismanTick > 0) and (NowTick > m_dwEatTalismanTick) then begin
m_dwEatTalismanTick := 0;
SysMsg('辟邪丹效果已经消失,你将无法抵御魔气侵袭', c_Red, t_Hint);
ExecuteScript(g_FunctionNPC, '@辟邪丹失效');
end;
if (not m_boDeath) then begin
tObjCount := m_nGameGold;
//自动减元宝
if m_boDecGameGold and (NowTick - m_dwDecGameGoldTick > m_dwDecGameGoldTime) then begin
m_dwDecGameGoldTick := NowTick;
if m_nGameGold >= m_nDecGameGold then begin
Dec(m_nGameGold, m_nDecGameGold);
nInteger := m_nDecGameGold;
end else begin
nInteger := m_nGameGold;
m_nGameGold := 0;
m_boDecGameGold := False;
MoveToHome(); //没有元宝可减了,就让他回城
end;
if g_boGameLogGameGold then begin
AddGameDataLog(Format(g_sGameLogMsg, [LOG_GAMEGOLD, m_sMapName, m_nCurrX,
m_nCurrY, m_sCharName, g_Config.sGameGoldName, nInteger, '-', 'Auto']));
end;
end;
//自动加元宝
if m_boIncGameGold and (NowTick - m_dwIncGameGoldTick > m_dwIncGameGoldTime) then begin
m_dwIncGameGoldTick := NowTick;
if m_nGameGold + m_nIncGameGold < g_Config.nHumanMaxGameGold {2000000} then begin
Inc(m_nGameGold, m_nIncGameGold);
nInteger := m_nIncGameGold;
end else begin
m_nGameGold := g_Config.nHumanMaxGameGold;
nInteger := g_Config.nHumanMaxGameGold - m_nGameGold;
m_boIncGameGold := False;
end;
if g_boGameLogGameGold then begin
AddGameDataLog(Format(g_sGameLogMsg, [LOG_GAMEGOLD, m_sMapName, m_nCurrX,
m_nCurrY, m_sCharName, g_Config.sGameGoldName, nInteger, '+', 'Auto']));
end;
end;
//当前环境自动减元宝
if not m_boDecGameGold and m_PEnvir.m_MapFlag.boDecGameGold then begin
if NowTick - m_dwDecGameGoldTick > LongWord(m_PEnvir.m_MapFlag.nDECGAMEGOLDTIME * 1000) then begin
m_dwDecGameGoldTick := NowTick;
if m_nGameGold >= m_PEnvir.m_MapFlag.nDecGameGold then begin
Dec(m_nGameGold, m_PEnvir.m_MapFlag.nDecGameGold);
nInteger := m_PEnvir.m_MapFlag.nDecGameGold;
end else begin
nInteger := m_nGameGold;
m_nGameGold := 0;
m_boDecGameGold := False;
MoveToHome();
end;
if g_boGameLogGameGold then begin
AddGameDataLog(Format(g_sGameLogMsg, [LOG_GAMEGOLD, m_sMapName,
m_nCurrX, m_nCurrY, m_sCharName, g_Config.sGameGoldName, nInteger, '-', 'Map']));
end;
end;
end;
//当前环境自动加元宝
if not m_boIncGameGold and m_PEnvir.m_MapFlag.boIncGameGold then begin
if NowTick - m_dwIncGameGoldTick > LongWord(m_PEnvir.m_MapFlag.nINCGAMEGOLDTIME * 1000) then begin
m_dwIncGameGoldTick := NowTick;
if m_nGameGold + m_PEnvir.m_MapFlag.nIncGameGold <= g_Config.nHumanMaxGameGold then begin
Inc(m_nGameGold, m_PEnvir.m_MapFlag.nIncGameGold);
nInteger := m_PEnvir.m_MapFlag.nIncGameGold;
end else begin
nInteger := g_Config.nHumanMaxGameGold - m_nGameGold;
m_nGameGold := g_Config.nHumanMaxGameGold;
end;
if g_boGameLogGameGold then begin
AddGameDataLog(Format(g_sGameLogMsg, [LOG_GAMEGOLD, m_sMapName,
m_nCurrX, m_nCurrY, m_sCharName, g_Config.sGameGoldName, nInteger, '+', 'Map']));
end;
end;
end;
//发送元宝增加消息
if tObjCount <> m_nGameGold then GameGoldChanged();
//当前环境自动加游戏点
if m_PEnvir.m_MapFlag.boINCGAMEPOINT then begin
if (NowTick - m_dwIncGamePointTick > LongWord(m_PEnvir.m_MapFlag.nINCGAMEPOINTTIME * 1000)) then begin
m_dwIncGamePointTick := NowTick;
if m_nGamePoint + m_PEnvir.m_MapFlag.nINCGAMEPOINT <= 2000000 then begin
Inc(m_nGamePoint, m_PEnvir.m_MapFlag.nINCGAMEPOINT);
nInteger := m_PEnvir.m_MapFlag.nINCGAMEPOINT;
end else begin
m_nGamePoint := 2000000;
nInteger := 2000000 - m_nGamePoint;
end;
if g_boGameLogGamePoint then begin
AddGameDataLog(Format(g_sGameLogMsg, [LOG_GAMEPOINT, m_sMapName,
m_nCurrX, m_nCurrY, m_sCharName, g_Config.sGamePointName, nInteger, '+', 'Map']));
end;
end;
end;
//减血
if m_PEnvir.m_MapFlag.boDECHP and (m_dwEatTalismanTick = 0) and (NowTick - m_dwDecHPTick > LongWord(m_PEnvir.m_MapFlag.nDECHPTIME * 1000)) then begin
m_dwDecHPTick := NowTick;
if m_WAbil.dwHP > m_PEnvir.m_MapFlag.nDECHPPOINT then begin
Dec(m_WAbil.dwHP, m_PEnvir.m_MapFlag.nDECHPPOINT);
end else begin
m_WAbil.dwHP := 0;
end;
boNeedRecalc := True;
end;
//加血
if m_PEnvir.m_MapFlag.boINCHP and (NowTick - m_dwIncHPTick > LongWord(m_PEnvir.m_MapFlag.nINCHPTIME * 1000)) then begin
m_dwIncHPTick := NowTick;
if m_WAbil.dwHP + m_PEnvir.m_MapFlag.nDECHPPOINT < m_WAbil.dwMaxHP then begin
Inc(m_WAbil.dwHP, m_PEnvir.m_MapFlag.nDECHPPOINT);
end else begin
m_WAbil.dwHP := m_WAbil.dwMaxHP;
end;
boNeedRecalc := True;
end;
end;
//地图延迟跳转
if m_PEnvir.m_MapFlag.boDelayGoto and (GetTickCount - m_dwDelayGotoTick > LongWord(m_PEnvir.m_MapFlag.nDelayGotoTime * 1000)) then begin
m_dwDelayGotoTick := NowTick;
if m_PEnvir.m_MapFlag.sDelayGotoLable <> '' then ExecuteScript(g_ManageNPC, m_PEnvir.m_MapFlag.sDelayGotoLable);
end;
//降饥饿点
if (not m_boDeath) and g_Config.boHungerSystem and ((NowTick - m_dwDecHungerPointTick) > 1000) then begin
m_dwDecHungerPointTick := NowTick;
if m_nHungerStatus > 0 then begin
tObjCount := GetMyStatus();
Dec(m_nHungerStatus);
if tObjCount <> GetMyStatus() then
RefMyStatus();
end else if g_Config.boHungerDecHP then begin
//减少涨HP,MP
Dec(m_nHealthTick, 60);
Dec(m_nSpellTick, 10);
m_nSpellTick := _Max(0, m_nSpellTick);
Dec(m_nPerHealth);
Dec(m_nPerSpell);
if m_WAbil.dwHP > m_WAbil.dwHP div 100 then begin
Dec(m_WAbil.dwHP, _Max(1, m_WAbil.dwHP div 100));
end else begin
if m_WAbil.dwHP <= 2 then m_WAbil.dwHP := 0;
end;
boNeedRecalc := True;
end;
end;
if boNeedRecalc then HealthSpellChanged();
try
if (not m_boDeath) and (m_nHuanjingIdx <> 0) and (m_dwHuanjingTick + g_Config.nHuanjingDecLingli < NowTick) then begin
m_dwHuanjingTick := NowTick;
for i := m_ItemList.Count - 1 downto 0 do begin
UserItem := pTUserItem(m_ItemList[i]);
if UserItem.MakeIndex = m_nHuanjingIdx then begin
if UserItem.Dura > 0 then Dec(UserItem.Dura);
if UserItem.Dura = 2 then
SysMsg('幻镜中的灵力即将消耗殆尽,如不及时补充幻镜就将碎裂', c_Red, t_Hint);
if (UserItem.Dura = 0) then begin
UserItem.btValue[1] := 1;
tm := MakeLong(MakeWord(UserItem.btValue[2], UserItem.btValue[3]),
MakeWord(UserItem.btValue[4], UserItem.btValue[5]));
if tm = 0 then
m_sScriptParam[0] := '1' //领取次数
else
m_sScriptParam[0] := IntToStr((DateTimeToWolTIme(Now) - tm + 1) div g_Config.nHuanjingGetGift);
m_sScriptParam[1] := IntToStr(UserItem.Dura); //幻境灵力
m_sScriptParam[2] := IntToStr(UserItem.btValue[1]);
//幻境状态 0正常 1破碎
m_sScriptParam[3] := m_PEnvir.m_sMapName; //地图名
m_sScriptParam[4] := IntToStr(UserItem.btValue[0]);
//幻境镶嵌宝石类型 1 2 3 表示 0普通幻境
m_sScriptParam[5] := IntToStr(UserItem.MakeIndex); //幻境ID
ExecuteScript(g_FunctionNPC, '@天关幻镜奖励');
SendDefMessage(34980, 0, 769, 300, 3000, '');
m_nHuanjingIdx := 0;
end;
SendUpdateItem(UserItem);
SendDefMessage(34980, UserItem.MakeIndex, 769, 300, 3000, '');
Break;
end;
end;
end;
except
on E: Exception do
MainOutMessage(sExceptionMsg6 + E.Message);
end;
if (not m_boDeath) and (NowTick - m_dwDecAntvPowerTick > 60 * 1000) then begin
m_dwDecAntvPowerTick := NowTick;
try
for i := Low(THumItems) to High(THumItems) do begin
if (m_UseItems[i].wIndex > 0) then begin
if (m_UseItems[i].Evil.MakeIndex <> 0) and (m_UseItems[i].Evil.sName <> '') then begin
if (m_UseItems[i].Evil.wPower - g_Config.nAntiEvilPowerDecSpeed) < 0 then
m_UseItems[i].Evil.wPower := 0
else
Dec(m_UseItems[i].Evil.wPower, g_Config.nAntiEvilPowerDecSpeed);
if m_UseItems[i].Evil.wPower < 10 then begin
if m_UseItems[i].Evil.wPower <= 0 then begin
FillChar(m_UseItems[i].Evil, SizeOf(TEvil), #0);
SendUpdateItem(@m_UseItems[i]);
SendDefMessage(SM_ITEMEVIL, Integer(Self), LoWord(m_UseItems[i].MakeIndex), HiWord(m_UseItems[i].MakeIndex), 0, '');
StdItem := UserEngine.GetStdItem(m_UseItems[i].wIndex);
if (StdItem <> nil) then
SysMsg(Format('你的%s镇魔值随着时间渐渐变弱,%s上的心魔已经逃逸。', [StdItem.FilterName, StdItem.FilterName]), c_Red, t_Hint);
// RecalcLevelAbilitys();
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
end else
SysMsg('你装备中的心魔' + m_UseItems[i].Evil.sName + '即将逃逸,请使用镇魔符增加镇魔值', c_Red, t_Hint);
end;
SendDefMessage(SM_ANTIEVILPOWER, m_UseItems[i].MakeIndex, m_UseItems[i].Evil.wPower, i, 0, '');
end;
//神兵宝甲神力值增加//////
if m_UseItems[i].IsGod and
(((m_UseItems[i].btItemExt[20] < 100) and (i = U_WEAPON)) or
((m_UseItems[i].btValue[15] < 100) and (i = U_DRESS))) then begin
Inc(m_UseItems[i].btValue[17]);
if (m_UseItems[i].btValue[17] >= m_UseItems[i].btValue[18]) then begin
m_UseItems[i].btValue[17] := 0;
if (i = U_DRESS) then begin
m_UseItems[i].btValue[15] := _MIN(m_UseItems[i].btValue[15] + m_UseItems[i].God_UseVal, 100);
SendGodUseVal(1, m_UseItems[i].btValue[15]);
end else if (i = U_WEAPON) and (m_UseItems[i].btValue[15] = 0) then begin
m_UseItems[i].btItemExt[20] := _MIN(m_UseItems[i].btItemExt[20] + m_UseItems[i].btValue[19], 100);
SendGodUseVal(0, m_UseItems[i].btItemExt[20]);
if m_UseItems[i].btItemExt[20] >= 100 then begin
m_UseItems[i].btValue[15] := 1;
SysMsg('您处于暴走模式,接下来的攻击将会暴击', c_Red, t_Hint);
end;
end;
end;
end; //if m_UseItems[i].IsGod and (m_UseItems[i].btItemExt[20] < 100) then begin
end;
end;
except
on E: Exception do
MainOutMessage(sExceptionMsg7 + E.Message);
end;
end;
if (not m_boDeath) and (NowTick - m_dwRateTick > 1000) then begin
m_dwRateTick := NowTick;
//检测元神和自己是否处于同一个地图
if m_boPneuma and (m_PneumaObject <> nil) and not (m_PneumaObject.m_boDeath or m_PneumaObject.m_boGhost) and
((m_PneumaObject.m_PEnvir <> m_PEnvir) or
(abs(m_nCurrX - m_PneumaObject.m_nCurrX) > 15) or
(abs(m_nCurrY - m_PneumaObject.m_nCurrY) > 15)) then begin
SendMsg(Self, CM_3079, 0, 0, 0, 0, '');
end;
if m_dwButchItemTime > 0 then begin
Dec(m_dwButchItemTime);
if (m_dwButchItemTime = 0) and (m_ButchItem.BaseObject > 0) and (m_ButchItem.PlayObject > 0) then begin
g_PacketManage3.Init;
g_PacketManage3.WriteInteger(m_ButchItem.PlayObject);
g_PacketManage3.WriteInteger(m_ButchItem.BaseObject);
g_PacketManage3.WriteInteger(0);
g_PacketManage3.WriteInteger($05);
g_PacketManage3.WriteByte(1);
g_PacketManage3.WriteByte(m_btDirection);
g_PacketManage3.FillWrite(5, 0);
g_PacketManage3.WriteByte(1);
SendDefMessage(2161, Integer(self), 0, 0, 0, g_PacketManage3.GetMsg, True);
m_sScriptParam[0] := TBaseObject(m_ButchItem.BaseObject).m_sCharName;
ExecuteScript(g_FunctionNPC, '@采集结束_' + IntToStr(m_ButchItem.nID));
if TBaseObject(m_ButchItem.BaseObject).m_Abil.MAC > 0 then
TBaseObject(m_ButchItem.BaseObject).Die;
end;
end;
if m_dwKillMonExpRateTime > 0 then begin
Dec(m_dwKillMonExpRateTime);
if m_dwKillMonExpRateTime = 0 then begin
m_nKillMonExpRate := 100;
SysMsg(sExpRateNorm, c_Red, t_Hint);
end;
end;
if m_dwKillMonExpLoitRateTime > 0 then begin
Dec(m_dwKillMonExpLoitRateTime);
if m_dwKillMonExpLoitRateTime = 0 then begin
m_nKillMonExpLoitRate := 100;
SysMsg(sExpLoitRateNorm, c_Red, t_Hint);
end;
end;
if m_dwKillMonRepressDemonRateTime > 0 then begin
Dec(m_dwKillMonRepressDemonRateTime);
if m_dwKillMonRepressDemonRateTime = 0 then begin
m_nKillMonRepressDemonRate := 100;
SysMsg(sExpRepressDemonRateNorm, c_Red, t_Hint);
end;
end;
if m_dwKillMonBurstRateTime > 0 then begin
Dec(m_dwKillMonBurstRateTime);
if m_dwKillMonBurstRateTime = 0 then begin
m_nKillMonBurstRate := 100;
SysMsg(sBurstRateNorm, c_Red, t_Hint);
end;
end;
if m_dwPowerRateTime > 0 then begin
Dec(m_dwPowerRateTime);
if m_dwPowerRateTime = 0 then begin
m_nPowerRate := 100;
SysMsg(sPowerRateNorm, c_Red, t_Hint);
end;
end;
if m_dwDefenceRateTime > 0 then begin
Dec(m_dwDefenceRateTime);
if m_dwDefenceRateTime = 0 then begin
m_nDefenceRate := 100;
SysMsg(sDefenceRateNorm, c_Red, t_Hint);
end;
end;
end;
//新增BUFF计时处理效果
if m_btRaceServer = RC_PLAYOBJECT then
begin
for i := Low(m_btBuffArr) to High(m_btBuffArr) do begin
if m_btBuffArr[i] > 0 then begin
if NowTick > (m_dwBuffArrTick[i]) then begin
m_btBuffArr[i] := 0;
m_sScriptParam[30] := IntToStr(i);
ExecuteScript(g_FunctionNPC, '@_结束_CHANGEMODE');
case i of //
1: begin
m_boAdminMode := False; //管理员模式
if g_Config.boShowScriptActionMsg then begin
if m_boAdminMode then
SysMsg(sGameMasterMode, c_Green, t_Hint)
else
SysMsg(sReleaseGameMasterMode, c_Green, t_Hint);
end;
end;
2: begin
m_boSuperMan := False; //无敌模式
if g_Config.boShowScriptActionMsg then begin
if m_boSuperMan then
SysMsg(sSupermanMode, c_Green, t_Hint)
else
SysMsg(sReleaseSupermanMode, c_Green, t_Hint);
end;
end;
3: begin
m_boObMode := False; //隐身模式
if g_Config.boShowScriptActionMsg then begin
if m_boObMode then
SysMsg(sObserverMode, c_Green, t_Hint)
else
SysMsg(g_sReleaseObserverMode, c_Green, t_Hint);
end;
end;
4: begin
m_boNoAttackMode := False; //禁止攻击模式
if g_Config.boShowScriptActionMsg then begin
if m_boNoAttackMode then
SysMsg(sNoAttackMode, c_Green, t_Hint)
else
SysMsg(sCanAttackMode, c_Green, t_Hint);
end;
end;
5: begin
m_boParalysisMode := False;
if g_Config.boShowScriptActionMsg then begin
if m_boParalysisMode then
SysMsg('进入麻痹状态', c_Red, t_Hint)
else
SysMsg('退出麻痹状态', c_Red, t_Hint);
end;
end;
6: begin
m_boUnParalysisMode := False;
if g_Config.boShowScriptActionMsg then begin
if m_boUnParalysisMode then
SysMsg('进入防麻痹状态', c_Red, t_Hint)
else
SysMsg('退出防麻痹状态', c_Red, t_Hint);
end;
end;
7: begin
m_boMagicShieldMode := False;
if g_Config.boShowScriptActionMsg then begin
if m_boMagicShieldMode then
SysMsg('进入护体状态', c_Red, t_Hint)
else
SysMsg('退出护体状态', c_Red, t_Hint);
end;
end;
8: begin
m_boUnMagicShieldMode := False;
if g_Config.boShowScriptActionMsg then begin
if m_boUnMagicShieldMode then
SysMsg('进入防护体状态', c_Red, t_Hint)
else
SysMsg('退出防护体状态', c_Red, t_Hint);
end;
end;
9: begin
m_boRevivalMode := False;
if g_Config.boShowScriptActionMsg then begin
if m_boRevivalMode then
SysMsg('进入重生状态', c_Red, t_Hint)
else
SysMsg('退出重生状态', c_Red, t_Hint);
end;
end;
10: begin
m_boUnRevivalMode := False;
if g_Config.boShowScriptActionMsg then begin
if m_boUnRevivalMode then
SysMsg('进入防重生状态', c_Red, t_Hint)
else
SysMsg('退出防重生状态', c_Red, t_Hint);
end;
end;
11: begin
m_boParalysisModeEx := False;
if g_Config.boShowScriptActionMsg then begin
if m_boParalysisModeEx then
SysMsg('进入超级麻痹状态', c_Red, t_Hint)
else
SysMsg('退出超级麻痹状态', c_Red, t_Hint);
end;
end;
12: begin
m_boMagicShieldModeEx := False;
if g_Config.boShowScriptActionMsg then begin
if m_boMagicShieldModeEx then
SysMsg('进入超级护体状态', c_Red, t_Hint)
else
SysMsg('退出超级护体状态', c_Red, t_Hint);
end;
end;
13: begin
m_boRevivalModeEx := False;
if g_Config.boShowScriptActionMsg then begin
if m_boRevivalModeEx then
SysMsg('进入超级重生状态', c_Red, t_Hint)
else
SysMsg('退出超级重生状态', c_Red, t_Hint);
end;
end;
14: begin //隐身模式
m_boHideModeEx := False;
m_wStatusTimeArr[STATE_TRANSPARENT] := 1;
m_nCharStatus := GetCharStatus();
StatusChanged();
end;
15: begin
m_wStatusTimeArr[POISON_DONTMOVE] := 1;
m_nMagicStatus := GetMagicStatus();
Status2Changed();
end;
16: begin //被麻痹
m_wStatusTimeArr[POISON_STONE] := 1;
m_nCharStatus := GetCharStatus();
StatusChanged();
end;
17: begin
m_boMcParalysisMode := False;
if g_Config.boShowScriptActionMsg then begin
if m_boMcParalysisMode then
SysMsg('进入魔道麻痹状态', c_Red, t_Hint)
else
SysMsg('退出魔道麻痹状态', c_Red, t_Hint);
end;
end;
18: begin
m_boNeedKneel := False;
SendRefMsg(RM_TURNTO, 0, 0, 0, 0, '');
end;
19: begin
m_btRulerLevel := 0;
FeatureChanged;
SendRefMsg(RM_TURN,
m_btDirection,
m_nCurrX,
m_nCurrY,
CalcCent(m_WAbil.dwHP, m_WAbil.dwMaxHP),
GetShowName);
end;
20: begin
m_boUnWater := False;
if m_boRideOn then begin
if not CheckMapRideOn(m_PEnvir) then ClientRideOff;
end;
end;
21: begin
m_boHasBaGua := False;
FeatureChanged;
end;
22: m_boStickMode := False;
23: m_boRideDragonMode := False;
24: m_boCanGetBackItem := True;
25: m_boCanRun := True;
26: m_boCanWalk := True;
27: m_boCanDeal := True;
28: m_boCanDrop := True;
29: m_boCanUseItem := True;
30: m_boCanHit := True;
31: m_boCanSpell := True;
32: begin
m_boOfficerGodWings := False;
FeatureChanged;
end;
33: begin
m_btWalkLotus := 0;
StatusChanged();
end;
34: begin
m_boVehicleMaterial := False;
StatusChanged();
end;
35: m_boRideOrthrusMode := False;
36: begin
m_btLoverTitle := 0;
FeatureChanged;
end;
37: begin
m_boSoaring := False;
FeatureChanged;
end;
38: begin
m_boGameManage := False;
FeatureChanged;
end;
39: begin
m_boFirstCarpenter := False;
FeatureChanged;
end;
40: begin
m_btColorSkill := 0;
FeatureChanged;
end;
41: begin
m_btKingTitle := 0;
FeatureChanged;
end;
42: begin
m_btLoverEvents := 0;
StatusChanged();
end;
43: begin
m_boBianShen := False;
m_wBianshenImg := 0;
m_wBianshenAppr := 0;
m_boAttackMode := False;
StatusChanged();
end;
44: begin
m_HumanDisarm.boDisarm := False;
m_HumanDisarm.nTime := 0;
m_HumanDisarm.btRate := 0;
end;
45: begin
m_boUnMcParalysis := false;
end;
46: begin
m_boUnSafeZone := false;
end;
47: begin
m_boRulerhalo := false;
StatusChanged();
end;
end;
if i > 4 then RecalcAbilitys;
end;
end;
end;
end;
try //取得在线最高等级、PK、攻击力、魔法、道术 的人物
if (g_HighLevelHuman = Self) and (m_boDeath or m_boGhost) then g_HighLevelHuman := nil;
if (g_HighPKPointHuman = Self) and (m_boDeath or m_boGhost) then g_HighPKPointHuman := nil;
if (g_HighDCHuman = Self) and (m_boDeath or m_boGhost) then g_HighDCHuman := nil;
if (g_HighMCHuman = Self) and (m_boDeath or m_boGhost) then g_HighMCHuman := nil;
if (g_HighSCHuman = Self) and (m_boDeath or m_boGhost) then g_HighSCHuman := nil;
if (g_HighOnlineHuman = Self) and (m_boDeath or m_boGhost) then g_HighOnlineHuman := nil;
if (m_btPermissionGM < 6) and not m_boDeath and not m_boGhost then begin
//最高等级
if (g_HighLevelHuman = nil) or (TPlayObject(g_HighLevelHuman).m_boGhost) then
g_HighLevelHuman := Self
else if m_Abil.level > TPlayObject(g_HighLevelHuman).m_Abil.level then
g_HighLevelHuman := Self;
//最高PK
if (g_HighPKPointHuman = nil) or (TPlayObject(g_HighPKPointHuman).m_boGhost) then begin
if m_nPkPoint > 0 then g_HighPKPointHuman := Self;
end else if m_nPkPoint > TPlayObject(g_HighPKPointHuman).m_nPkPoint then
g_HighPKPointHuman := Self;
//最高攻击力
if (g_HighDCHuman = nil) or (TPlayObject(g_HighDCHuman).m_boGhost)
or (hiword(m_WAbil.DC) > hiword(TPlayObject(g_HighDCHuman).m_WAbil.DC)) then
g_HighDCHuman := Self;
//最高魔法
if (g_HighMCHuman = nil) or (TPlayObject(g_HighMCHuman).m_boGhost)
or (hiword(m_WAbil.MC) > HiWord(TPlayObject(g_HighMCHuman).m_WAbil.MC)) then
g_HighMCHuman := Self;
//最高道术
if (g_HighSCHuman = nil) or (TPlayObject(g_HighSCHuman).m_boGhost)
or (hiword(m_WAbil.SC) > HiWord(TPlayObject(g_HighSCHuman).m_WAbil.SC)) then
g_HighSCHuman := Self;
//最长在线时间
if (g_HighOnlineHuman = nil) or (TPlayObject(g_HighOnlineHuman).m_boGhost)
or (m_dwLogonTick < TPlayObject(g_HighOnlineHuman).m_dwLogonTick) then
g_HighOnlineHuman := Self;
end;
except
on E: Exception do begin
MainOutMessage(sExceptionMsg3);
end;
end;
try
if ((g_Config.boReNewChangeColor and (m_btReLevel > 0)) or m_boColorName)
and (NowTick - m_dwReColorTick > g_Config.dwReNewNameColorTime) then begin
m_dwReColorTick := NowTick;
Inc(m_btReColorIdx);
if m_btReColorIdx > High(g_Config.ReNewNameColor) then
m_btReColorIdx := 0;
m_btNameColor := g_Config.ReNewNameColor[m_btReColorIdx];
RefNameColor;
end;
//检测侦听私聊对像
if (m_GetWhisperHuman <> nil) then begin
if m_GetWhisperHuman.m_boDeath or (m_GetWhisperHuman.m_boGhost) then
m_GetWhisperHuman := nil;
end;
ProcessSpiritSuite();
except
end;
try //清除夫妻、师徒
if NowTick - m_dwClearObjTick > 10000 then begin
m_dwClearObjTick := NowTick;
if (m_DearHuman <> nil) and (m_DearHuman.m_boDeath or
m_DearHuman.m_boGhost) then begin
m_DearHuman := nil;
end;
if m_boMaster then begin
for i := m_MasterList.Count - 1 downto 0 do begin
PlayObject := TPlayObject(m_MasterList.Items[i]);
if (PlayObject <> nil) and (PlayObject.m_boDeath or PlayObject.m_boGhost) then begin
m_MasterList.Delete(i);
end;
end;
end else begin
if (m_MasterHuman <> nil) and (m_MasterHuman.m_boDeath or
m_MasterHuman.m_boGhost) then begin
m_MasterHuman := nil;
end;
end;
{减少心魔宝宝镇魔值}
if (m_nEvilFollowerPower > 0) and (g_Config.nEvilCtrl10SecDecPower {3} > 0) then begin
if m_nEvilFollowerPower > g_Config.nEvilCtrl10SecDecPower * 1000 then begin
Dec(m_nEvilFollowerPower, g_Config.nEvilCtrl10SecDecPower * 1000);
SendDefMessage(CM_RECALLEVIL, Integer(Self), 3,
LoWord(m_nEvilFollowerPower), HiWord(m_nEvilFollowerPower), '');
ClearEvilFollower(5);
if (m_nEvilFollowerPower <= 1000 * 2) and (m_nEvilFollowerPower >= 1000) then begin
ClearEvilFollower(1);
SysMsg('你所操控的心魔即将背叛,请立刻使用镇魔符震慑', c_Red, t_Hint);
end;
if m_nEvilFollowerPower <= 1000 * 1 then begin
ClearEvilFollower(2);
end;
end else begin
m_nEvilFollowerPower := 0;
ClearEvilFollower(3);
end;
end;
end;
except
on E: Exception do begin
MainOutMessage(sExceptionMsg4);
MainOutMessage(E.Message);
end;
end;
try
if (m_nAutoGetExpPoint > 0) and ((m_AutoGetExpEnvir = nil) or
(m_AutoGetExpEnvir = m_PEnvir)) and (NowTick - m_dwAutoGetExpTick > m_nAutoGetExpTime) then begin
m_dwAutoGetExpTick := NowTick;
if not m_boAutoGetExpInSafeZone or (m_boAutoGetExpInSafeZone and InSafeZone) then
if m_boPneuma and (m_boPneumaEffMode) then
//元神在灵珠状态不能获得经验
else
GetExp(m_nAutoGetExpPoint, 0, 0, False);
end;
except
MainOutMessage(sExceptionMsg5);
end;
//延时脚本命令DelayCall的处理
if m_DelayCall.Count > 0 then begin
for i := m_DelayCall.Count - 1 downto 0 do begin
DelayCall := pTDelayCall(m_DelayCall.Items[i]);
if DelayCall.dwCallTime > 0 then begin
if (NowTick >= DelayCall.dwCallTick) then begin
DelayCall.dwCallTick := DelayCall.dwCallTick + DelayCall.dwDelayTime;
Dec(DelayCall.dwCallTime);
if DelayCall.dwCallTime = 0 then DelayCall.dwReleaseTick := NowTick;
TmpNpc := UserEngine.FindMerchant(DelayCall.NPC);
if TmpNpc = nil then
TmpNpc := UserEngine.FindNPC(DelayCall.NPC);
if TmpNpc <> nil then begin
m_nScriptGotoCount := 0;
TmpNpc.GotoLable(Self, DelayCall.sLabel, False);
end;
Break;
end;
end else begin
if (DelayCall.dwReleaseTick > 0) and (GetTickCount - DelayCall.dwReleaseTick > 60 * 1000) then begin
Dispose(pTDelayCall(m_DelayCall.Items[i]));
m_DelayCall.Delete(i);
Break;
end;
end;
end;
end;
//延时脚本命令(一柱香)SetTimer的处理
if (m_dwTimerLong > 0) then begin
if (NowTick - m_dwTimerTick >= m_dwTimerLong * 1000) then begin
m_dwTimerLong := 0;
SendDefMessage(1833, 0, 0, 0, 0, '');
if (m_sTimerLabel <> '') then
ExecuteScript(g_ManageNPC, m_sTimerLabel);
end;
end;
//延时脚本命令DelayGoto的处理
if (m_dwDelayLong > 0) and (NowTick - m_dwDelayTick >= m_dwDelayLong) then begin
m_dwDelayLong := 0;
if (m_sTimeGotoLable <> '') then begin
if (m_TimeDelayNpc <> nil) then try
m_nScriptGotoCount := 0;
TNormNpc(m_TimeDelayNpc).GotoLable(Self, m_sTimeGotoLable, False);
finally
end;
end;
end;
//脱机泡点的人物执行任意走动
//GetFrontPosition(nX, nY);
if m_boOfflineGetGamePoint and (m_nautologintype=0) and (not m_boPneuma) and g_Config.boOfflineMove and (m_wShopItemCount = 0) and (GetTickCount - m_dwMoveTick > 3200) then begin
if Random(8) > 0 then begin
//获取安全内一个任意坐标
if Random(6) = 0 then m_btDirection := Random(8);
if GetFrontPosition(nX, nY) then begin
if m_PEnvir.CanWalk(nX, nY, False) and InSafeZone(m_PEnvir, nX, nY) then begin //可以移动,检查是否在安全区
if Random(3) = 0 then
Runto(m_btDirection, False)
else
WalkTo(m_btDirection, False);
end else begin
TurnTo(Random(8));
end;
end;
{ //随机喊话
if (m_sAutoSayMsg <> '') and (Random(200) = 0) and (m_sAutoSayMsg[1] <> '@') then
ProcessSayMsg(m_sAutoSayMsg, 1);
}
end;
m_dwMoveTick := GetTickCount;
end;
if m_boOfflineGetGamePoint and (m_nautologintype<>0) and (not m_boPneuma) and g_Config.boOfflineMove and (m_wShopItemCount = 0) {and (GetTickCount - m_dwMoveTick >100)} then begin
if Think then begin
inherited;
Exit;
end;
// MainOutMessage('不-: ' + inttostr(GetTickCount));
if (m_TargetCret <> nil) then begin
if getAInoa(m_TargetCret.m_sCharName) then begin
DelTargetCreat();
// MainOutMessage('不--攻击: ' + m_TargetCret.m_sCharName);
end;
end;
if (m_TargetCret = nil) and ((GetTickCount - m_dwSearchEnemyTick) > 2000) then begin
m_dwSearchEnemyTick := GetTickCount();
SearchTarget();
end;
if m_boWalkWaitLocked then begin
if (GetTickCount - m_dwWalkWaitTick) > m_dwWalkWait then begin
m_boWalkWaitLocked := False;
end;
end;
m_dwMoveTick := GetTickCount;
end;
//恐惧
if (m_wStatusTimeArr[STATE_FEAR] > 0) and (GetTickCount - m_dwMoveTick > 450) and (m_wShopItemCount = 0) and (not m_boCatapultAttackMode) then begin
case Random(80) of //变换方向
0..10: GetBackPosition(nX, nY);
20..30: GetLeftPosition(nX, nY);
50..60: GetRightPosition(nX, nY);
else
GetFrontPosition(nX, nY);
end;
m_btDirection := GetNextDirection(m_nCurrX, m_nCurrY, nX, nY);
if m_PEnvir.MoveToMovingObject(m_nCurrX, m_nCurrY, Self, nX, nY, False) > 0 then begin
m_nCurrX := nX;
m_nCurrY := nY;
SendRefMsg(RM_RUSH, MakeWord(m_btDirection, 5), m_nCurrX, m_nCurrY, CalcCent(m_WAbil.dwHP, m_WAbil.dwMaxHP), '')
end else
m_btDirection := Random(8);
m_dwMoveTick := GetTickCount;
end;
try
MagFieryDragonRun(); //火龙附体
except
MainOutMessage('[Exception] TPlayObject::Run -> 战争旋风');
end;
inherited Run;
end;
//发送进入游戏公告
function TPlayObject.gotopoint(smapName: string;nx,ny:integer): Boolean;
var
nC:integer;
begin
if not m_boWalkWaitLocked and (Integer(GetTickCount - m_dwWalkTick) > 600) then begin
m_dwWalkTick := GetTickCount();
Inc(m_nWalkCount);
if m_nWalkCount > m_nWalkStep then begin
m_nWalkCount := 0;
m_boWalkWaitLocked := True;
m_dwWalkWaitTick := GetTickCount();
end;
m_boMission:=true;
m_nMissionX:= nx ;
m_nMissionY:=ny ;
if not m_boRunAwayMode then begin
if not m_boNoAttackMode then begin
if m_TargetCret <> nil then begin
if actAttackTarget then begin
inherited;
Exit;
end;
end else begin
m_nTargetX := -1;
if m_boMission then begin
m_nTargetX := m_nMissionX;
m_nTargetY := m_nMissionY;
end;
end;
end;
end else begin
if (m_dwRunAwayTime > 0) and ((GetTickCount - m_dwRunAwayStart) > m_dwRunAwayTime) then begin
m_boRunAwayMode := False;
m_dwRunAwayTime := 0;
end;
end;
if (m_nTargetX <> -1) then begin
if (m_TargetCret <> nil) then begin
nC := abs(m_nCurrX - m_TargetCret.m_nCurrX) + abs(m_nCurrY - m_TargetCret.m_nCurrY);
if not m_boCanRemoteHit or (nC < 4) or (nC > 7) then
GotoTargetXY();
end else
GotoTargetXY();
end else begin
if (m_TargetCret = nil) and (m_Master = nil) then
Wondering()
else if (m_Master <> nil) and (m_Master.m_TargetCret <> nil) then
SetTargetCreat(m_Master.m_TargetCret); //设置攻击目标为主人的攻击目标
end;
end;
end;
function TPlayObject.GetBagItemCount(sItemName: string): Integer;
var
i : Integer;
UserItem : pTUserItem;
StdItem : pTStdItem;
nIndex : Integer;
begin
Result := 0;
if sItemName = '' then Exit;
nIndex := UserEngine.GetStdItemIdx(sItemName);
if nIndex > 0 then begin
StdItem := UserEngine.GetStdItem(nIndex);
if StdItem = nil then Exit;
for i := m_ItemList.Count - 1 downto 0 do begin
UserItem := pTUserItem(m_ItemList.Items[i]);
if UserItem = nil then Exit;
if UserItem.wIndex = nIndex then begin
if CheckSPCode(StdItem.Reserved, RE_ALLOWPILE) then begin
Inc(Result, UserItem.Dura);
end else begin
Inc(Result, 1);
end;
end;
end;
end;
end;
function TPlayObject.Think(): Boolean;
var
nOldX, nOldY : Integer;
nIdx : Integer;
nX, nY : Integer;
nAmuletAC : Integer;
tCode : Integer;
resourcestring
sExceptionMsg = 'function TAIPlayer.Think:: => Code = %d';
begin
Result := False;
tCode := 0;
if (GetTickCount - m_dwThinkTick) > 1 * 1000 then begin
try
tCode := 1;
m_dwThinkTick := GetTickCount();
if m_PEnvir.GetXYObjCount(m_nCurrX, m_nCurrY) >= 2 then m_boDupMode := True;
{设置攻击目标}
if (m_TargetCret = nil) and (m_LastHiter <> nil) and IsProperTarget(m_LastHiter) then
SetTargetCreat(m_LastHiter);
tCode := 2;
{跟随主人攻击}
tCode := 3;
if not IsProperTarget(m_TargetCret) then m_TargetCret := nil;
if m_boDupMode then begin
nOldX := m_nCurrX;
nOldY := m_nCurrY;
WalkTo(Random(8), False);
if (nOldX <> m_nCurrX) or (nOldY <> m_nCurrY) then begin
m_boDupMode := False;
Result := True;
SendRefMsg(SM_204, 0, 0, 0, 0, '');
Exit;
end;
end;
{心魔逃跑、使用非攻击性技能}
if m_boHolySeize then Exit;
tCode := 4;
{金刚护体}
if not Result and (m_MagicSkills[61] <> nil) and (m_nHushenDura = 0) then
Result := DoSpell(m_MagicSkills[61], m_nCurrX, m_nCurrY, Self);
{护身真气}
{if not Result and (m_MagicSkills[42] <> nil) and (m_nHushenDura = 0) then
Result := DoSpell(m_MagicSkills[42], m_nCurrX, m_nCurrY, Self); }
{魔法盾}
if not Result and (m_MagicSkills[31] <> nil) and (m_wStatusTimeArr[STATE_BUBBLEDEFENCEUP] = 0) then
Result := DoSpell(m_MagicSkills[31], m_nCurrX, m_nCurrY, Self);
{风影盾}
if not Result and (m_MagicSkills[70] <> nil) and (m_wStatusTimeArr[STATE_FENGYINGDUN] = 0) then
Result := DoSpell(m_MagicSkills[70], m_nCurrX, m_nCurrY, Self);
tCode := 5;
{风火轮-攻击性技能}
if not Result and (m_TargetCret <> nil) and (m_MagicSkills[50] <> nil) and (m_wStatusTimeArr[STATE_FENGHUOLUN] = 0) then
Result := DoSpell(m_MagicSkills[50], m_nCurrX, m_nCurrY, Self);
tCode := 6;
{幽灵盾}
if not Result and (m_MagicSkills[14] <> nil) then begin
if (m_wStatusTimeArr[STATE_MAGDEFENCEUP] = 0) then
Result := DoSpell(m_MagicSkills[14], m_nCurrX, m_nCurrY, Self)
else if (m_Master <> nil) and not m_Master.m_boGhost and (m_Master.m_wStatusTimeArr[STATE_MAGDEFENCEUP] = 0) then
Result := DoSpell(m_MagicSkills[14], m_Master.m_nCurrX, m_Master.m_nCurrY, m_Master);
end;
tCode := 7;
{神圣战甲术}
if not Result and (m_MagicSkills[15] <> nil) and (GetBagItemCount('道符')>0) then begin
if (m_wStatusTimeArr[STATE_DEFENCEUP] = 0) then
Result := DoSpell(m_MagicSkills[15], m_nCurrX, m_nCurrY, Self)
else if (m_Master <> nil) and not m_Master.m_boGhost and (m_Master.m_wStatusTimeArr[STATE_DEFENCEUP] = 0) then
Result := DoSpell(m_MagicSkills[15], m_Master.m_nCurrX, m_Master.m_nCurrY, m_Master);
end;
tCode := 8;
{解毒术}
if not Result and (m_MagicSkills[65] <> nil) then begin
if m_wStatusTimeArr[POISON_DECHEALTH] <> 0 then
Result := DoSpell(m_MagicSkills[65], m_nCurrX, m_nCurrY, Self)
else if (m_Master <> nil) and not m_Master.m_boGhost and (m_Master.m_wStatusTimeArr[POISON_DECHEALTH] <> 0) then
Result := DoSpell(m_MagicSkills[65], m_Master.m_nCurrX, m_Master.m_nCurrY, m_Master);
end;
tCode := 9;
{神光术}
if not Result and (m_MagicSkills[64] <> nil) then begin
if (m_wStatusTimeArr[POISON_LOCKSPELL] <> 0) or (m_wStatusTimeArr[POISON_STONE] <> 0) then
Result := DoSpell(m_MagicSkills[64], m_nCurrX, m_nCurrY, Self)
else if (m_Master <> nil) and not m_Master.m_boGhost and ((m_Master.m_wStatusTimeArr[POISON_LOCKSPELL] <> 0) or (m_Master.m_wStatusTimeArr[POISON_STONE] <> 0)) then
Result := DoSpell(m_MagicSkills[64], m_Master.m_nCurrX, m_Master.m_nCurrY, m_Master);
end;
tCode := 10;
{强化骷髅术}
if not Result and (m_MagicSkills[SKILL_66] <> nil) and (m_SlaveList.Count < 2) then begin
Result := DoSpell(m_MagicSkills[SKILL_66], m_nCurrX, m_nCurrY, Self);
end;
{召唤神兽}
if not Result and (m_MagicSkills[SKILL_SINSU] <> nil) and (m_SlaveList.Count < 1) then begin
Result := DoSpell(m_MagicSkills[SKILL_SINSU], m_nCurrX, m_nCurrY, Self);
end;
{骷髅召唤术}
if not Result and (m_MagicSkills[SKILL_SKELLETON] <> nil) and (m_SlaveList.Count < 1) then begin
Result := DoSpell(m_MagicSkills[SKILL_SKELLETON], m_nCurrX, m_nCurrY, Self);
end;
tCode := 11;
{心魔逃跑}
if not Result and (Random(g_Config.nEvilEsCapeRate {10}) = 0) and
(m_LastHiter <> nil) and (m_WAbil.dwHP / m_WAbil.dwMaxHP < Round(g_Config.nEvilEsCapeHP / 100)) and (GetTickCount - dwLastEscapeTick > 5000) then begin
if (abs(m_nCurrX - m_LastHiter.m_nCurrX) <= 2) and (abs(m_nCurrY - m_LastHiter.m_nCurrY) <= 2) then begin
if m_Master <> nil then
m_Master.GetRightPosition(nX, nY)
else begin
nX := m_nCurrX + Random(g_Config.nEvilEsCapeRange {30}) + Random(3);
nY := m_nCurrY + Random(g_Config.nEvilEsCapeRange {30}) + Random(3);
if m_PEnvir.CanWalk(nX, nY, False) then begin
SpaceMove(m_PEnvir.m_sMapName, nX, nY, 0, nil);
end;
if Result then begin
DelTargetCreat;
m_LastHiter := nil;
dwLastEscapeTick := GetTickCount; //防止连续逃跑导致显示错误
end;
end;
if Result and (g_Config.nEvilEsCapeHP / 100 > m_WAbil.dwHP / m_WAbil.dwMaxHP) then begin //逃跑后,血量恢复百分比
m_WAbil.dwHP := Round(m_WAbil.dwMaxHP * g_Config.nEvilEsCapeHP / 100);
HealthSpellChanged;
end;
end;
end;
if not Result and (m_TargetCret = nil) then begin //非攻击状态自动使用技能加血
if GetTickCount - m_dwMagicAttackTick > m_dwMagicAttackInterval then begin
{群体治疗术}
if (m_MagicSkills[29] <> nil) and (m_btJob = 2) then begin
if (m_Master <> nil) and not m_Master.m_boGhost and (m_Master.m_WAbil.dwHP / m_Master.m_WAbil.dwMaxHP < 0.95) then begin
if DoSpell(m_MagicSkills[29], m_Master.m_nCurrX, m_Master.m_nCurrY, m_Master) then begin
Result := True;
end;
end else if (m_WAbil.dwHP / m_WAbil.dwMaxHP < 0.95) then begin
if DoSpell(m_MagicSkills[29], m_nCurrX, m_nCurrY, nil) then begin
Result := True;
end;
end;
end;
{治疗术}
if not Result and (m_MagicSkills[2] <> nil) and (m_btJob = 2) then begin
if (m_Master <> nil) and not m_Master.m_boGhost and (m_Master.m_WAbil.dwHP / m_Master.m_WAbil.dwMaxHP < 0.95) then begin
if DoSpell(m_MagicSkills[2], m_Master.m_nCurrX, m_Master.m_nCurrY, m_Master) then begin
Result := True;
end;
end else if (m_WAbil.dwHP / m_WAbil.dwMaxHP < 0.95) then begin
if DoSpell(m_MagicSkills[2], m_nCurrX, m_nCurrY, nil) then begin
Result := True;
end;
end;
end;
end;
end;
if Result then begin
m_dwMagicAttackTick := GetTickCount;
m_dwHitTick := GetTickCount();
m_boCanRemoteHit := True;
end;
except
on E: Exception do begin
MainOutMessage(Format(sExceptionMsg, [tCode]));
MainOutMessage(E.Message);
end;
end;
end;
end;
procedure TPlayObject.SetTargetXY(nX, nY: Integer);
begin
m_nTargetX := nX;
m_nTargetY := nY;
end;
//获得魔法的Spell
function TPlayObject.GetMagicSpell(UserMagic: pTUserMagic): Integer;
begin
Result := Round(UserMagic.MagicInfo.wSpell / (UserMagic.MagicInfo.btTrainLv + 1) * (UserMagic.btLevel + 1)) + UserMagic.MagicInfo.btDefSpell;
end;
//物理攻击
procedure TPlayObject.Attack(TargeTBaseObject: TBaseObject; nDir: Integer);
function IsEnoughMP(UserMagic: pTUserMagic): Boolean;
begin
if g_Config.boEvilNotDecMP then
Result := True
else
Result := m_WAbil.dwMP >= UserMagic.MagicInfo.btDefSpell + GetMagicSpell(UserMagic);
end;
var
wIdent : Word;
nMagicID : Integer;
pMagic : pTUserMagic;
begin
{找一个攻击模式}
wIdent := 0;
nMagicID := 0;
pMagic := nil;
m_btDirection := nDir;
if TargeTBaseObject <> nil then begin
if (GetPoseCreate = TargeTBaseObject) then begin
if (Random(5) = 0) then begin
{狮子吼}
if (m_MagicSkills[37] <> nil) and IsEnoughMP(m_MagicSkills[37]) then begin
pMagic := m_MagicSkills[37];
DoSpell(pMagic, m_nCurrX, m_nCurrY, TargeTBaseObject);
Exit;
end
{突斩}
else if (m_MagicSkills[62] <> nil) and IsEnoughMP(m_MagicSkills[62]) then
pMagic := m_MagicSkills[62]
{野蛮}
else if (m_MagicSkills[27] <> nil) and IsEnoughMP(m_MagicSkills[27]) then
pMagic := m_MagicSkills[27];
{野蛮、突斩}
if pMagic <> nil then begin
if (GetTickCount - m_dwDoMotaeboTick) > 3 * 1000 then begin
m_dwDoMotaeboTick := GetTickCount();
DamageSpell(GetSpellPoint(pMagic));
// HealthSpellChanged(); //心魔不需要发送MP消息
DoMotaebo(m_btDirection, pMagic.btLevel, pMagic.GetMagIdx);
end;
Exit;
end;
end;
if (pMagic = nil) then begin
nDir := m_btDirection;
if (m_MagicSkills[60] <> nil) and IsEnoughMP(m_MagicSkills[60]) then //破盾
AttackDir(nil, 13, nDir)
else if (m_MagicSkills[59] <> nil) and IsEnoughMP(m_MagicSkills[59]) then //破击
AttackDir(nil, 12, nDir)
else if (m_MagicSkills[SKILL_88] <> nil) and IsEnoughMP(m_MagicSkills[SKILL_88]) then //强化攻杀剑法
AttackDir(nil, 18, nDir)
else if (m_MagicSkills[44] <> nil) and IsEnoughMP(m_MagicSkills[44]) then //雷霆剑
AttackDir(nil, 15, nDir)
else if (m_MagicSkills[43] <> nil) and IsEnoughMP(m_MagicSkills[43]) then //抱月刀
AttackDir(nil, 14, nDir)
else if (m_MagicSkills[41] <> nil) and (Random(8) < m_MagicSkills[41].btLevel + 1) then //血影刀法
AttackDir(nil, 17, nDir)
else if (m_MagicSkills[40] <> nil) and (Random(8) < m_MagicSkills[40].btLevel + 1) then //残影刀法
AttackDir(nil, 16, nDir)
else if (m_MagicSkills[26] <> nil) and (Random(10) < m_MagicSkills[26].btLevel + 1) then //烈火剑法
AttackDir(nil, 7, nDir)
else if (m_MagicSkills[25] <> nil) and (Random(8) < m_MagicSkills[25].btLevel + 1) then //半月弯刀
AttackDir(nil, 5, nDir)
else if (m_MagicSkills[12] <> nil) and (Random(10) < m_MagicSkills[12].btLevel + 1) then //刺杀剑术
AttackDir(nil, 4, nDir)
else if (m_MagicSkills[7] <> nil) and (Random(10) < m_MagicSkills[7].btLevel + 1) then //攻杀剑法
AttackDir(nil, 3, nDir)
else
AttackDir(nil, Random(3), nDir); //普通攻击
if (m_MagicSkills[7] <> nil) and (m_UseItems[U_WEAPON].Dura > 0) then begin
Dec(m_btAttackSkillCount);
if m_btAttackSkillPointCount = m_btAttackSkillCount then begin
m_boPowerHit := True;
end;
if m_btAttackSkillCount <= 0 then begin
m_btAttackSkillCount := 7 - m_MagicSkills[7].btLevel;
m_btAttackSkillPointCount := Random(m_btAttackSkillCount);
end;
end else if (m_MagicSkills[40] <> nil) and (m_UseItems[U_WEAPON].Dura > 0) then begin
Dec(m_btAttackSkillCount);
if m_btAttackSkillPointCount = m_btAttackSkillCount then begin
m_boPowerHit := True;
end;
if m_btAttackSkillCount <= 0 then begin
m_btAttackSkillCount := 7 - m_MagicSkills[40].btLevel;
m_btAttackSkillPointCount := Random(m_btAttackSkillCount);
end;
end else if (m_MagicSkills[41] <> nil) and (m_UseItems[U_WEAPON].Dura > 0) then begin
Dec(m_btAttackSkillCount);
if m_btAttackSkillPointCount = m_btAttackSkillCount then begin
m_boPowerHit := True;
end;
if m_btAttackSkillCount <= 0 then begin
m_btAttackSkillCount := 7 - m_MagicSkills[41].btLevel;
m_btAttackSkillPointCount := Random(m_btAttackSkillCount);
end;
end;
Dec(m_nHealthTick, 30);
Dec(m_nSpellTick, 100);
m_nSpellTick := _MAX(0, m_nSpellTick);
Dec(m_nPerHealth, 2);
Dec(m_nPerSpell, 2);
end;
m_dwHitTick := GetTickCount();
end;
end;
end;
function TPlayObject.actAttackTarget(): Boolean;
var
bt06, nCount : Byte;
begin
Result := False;
if m_TargetCret = nil then Exit;
if m_boHolySeize then Exit;
{检查有没有HP恢复的技能,若有且可以使用,则使用该技能}
if GetTickCount - m_dwMagicAttackTick > m_dwMagicAttackInterval then begin
if (m_MagicSkills[2] <> nil) and (m_btJob = 2) then begin
if (m_Master <> nil) and not m_Master.m_boGhost and (m_Master.m_WAbil.dwHP / m_Master.m_WAbil.dwMaxHP < 0.5) then begin
if DoSpell(m_MagicSkills[2], m_Master.m_nCurrX, m_Master.m_nCurrY, m_Master) then begin
Result := True;
end;
end else if (m_WAbil.dwHP / m_WAbil.dwMaxHP < 0.5) then begin
if DoSpell(m_MagicSkills[2], m_nCurrX, m_nCurrY, nil) then begin
Result := True;
end;
end;
end;
// MainOutMessage('物品名字重复: ' + m_TargetCret.m_sCharName);
{检查在是否在攻击范围内,使用远程攻击的技能}
if not Result and (abs(m_nCurrX - m_TargetCret.m_nCurrX) < 8) and (abs(m_nCurrY - m_TargetCret.m_nCurrY) < 8) then begin
{强化施毒术}
if not Result and (m_MagicSkills[89] <> nil) and ((m_TargetCret.m_wStatusTimeArr[POISON_DECHEALTH] = 0) or (m_TargetCret.m_wStatusTimeArr[POISON_DAMAGEARMOR] = 0)) then
Result := DoSpell(m_MagicSkills[89], m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, m_TargetCret);
{施毒术}
if not Result and (m_MagicSkills[SKILL_AMYOUNSUL] <> nil) and ((m_TargetCret.m_wStatusTimeArr[POISON_DECHEALTH] = 0) or (m_TargetCret.m_wStatusTimeArr[POISON_DAMAGEARMOR] = 0)) then
Result := DoSpell(m_MagicSkills[SKILL_AMYOUNSUL], m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, m_TargetCret);
{强化诅咒术}
if not Result and (m_MagicSkills[SKILL_90] <> nil) and (Random(12) = 0) and ((m_TargetCret.m_wStatusTimeArr[POISON_DECDEFENCE] = 0) or (m_TargetCret.m_wStatusTimeArr[POISON_DECMANA] = 0)) then
Result := DoSpell(m_MagicSkills[SKILL_90], m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, m_TargetCret);
{诅咒术}
if not Result and (m_MagicSkills[SKILL_45] <> nil) and (Random(12) = 0) and ((m_TargetCret.m_wStatusTimeArr[POISON_DECDEFENCE] = 0) or (m_TargetCret.m_wStatusTimeArr[POISON_DECMANA] = 0)) then
Result := DoSpell(m_MagicSkills[SKILL_45], m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, m_TargetCret);
{狂龙紫电}
if not Result and (m_MagicSkills[71] <> nil) and ((GetTickCount - m_MagicSkills[71].dwSkillTimeTick)>900) then begin
Result := DoSpell(m_MagicSkills[71], m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, m_TargetCret);
m_MagicSkills[71].dwSkillTimeTick:=GetTickCount;
end;
{流星火雨}
if not Result and (m_MagicSkills[73] <> nil) then
Result := DoSpell(m_MagicSkills[73], m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, m_TargetCret);
{雷电术}
if not Result and (m_MagicSkills[SKILL_LIGHTENING] <> nil) and ((GetTickCount - m_MagicSkills[SKILL_LIGHTENING].dwSkillTimeTick)>m_MagicSkills[SKILL_LIGHTENING].MagicInfo.dwDelayTime) then begin
Result := DoSpell(m_MagicSkills[SKILL_LIGHTENING], m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, m_TargetCret);
m_MagicSkills[SKILL_LIGHTENING].dwSkillTimeTick:=GetTickCount;
end;
{幽冥火咒}
if not Result and (m_MagicSkills[67] <> nil) and ((GetTickCount - m_MagicSkills[67].dwSkillTimeTick)>m_MagicSkills[67].MagicInfo.dwDelayTime) then begin
Result := DoSpell(m_MagicSkills[67], m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, m_TargetCret);
m_MagicSkills[67].dwSkillTimeTick:=GetTickCount;
end;
{灵魂火符}
if not Result and (m_MagicSkills[13] <> nil) and ((GetTickCount - m_MagicSkills[13].dwSkillTimeTick)>m_MagicSkills[13].MagicInfo.dwDelayTime) then begin
Result := DoSpell(m_MagicSkills[13], m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, m_TargetCret);
m_MagicSkills[13].dwSkillTimeTick:=GetTickCount;
end;
{冰旋风}
if not Result and (m_MagicSkills[54] <> nil) then
Result := DoSpell(m_MagicSkills[54], m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, m_TargetCret);
{五雷轰}
if not Result and (m_MagicSkills[53] <> nil) then
Result := DoSpell(m_MagicSkills[53], m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, m_TargetCret);
{冰龙破}
if not Result and (m_MagicSkills[51] <> nil) then
Result := DoSpell(m_MagicSkills[51], m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, m_TargetCret);
{冰箭术}
if not Result and (m_MagicSkills[49] <> nil) then
Result := DoSpell(m_MagicSkills[49], m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, m_TargetCret);
{冰咆哮}
if not Result and (m_MagicSkills[33] <> nil) then
Result := DoSpell(m_MagicSkills[33], m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, m_TargetCret);
{地狱雷光}
if not Result and (m_MagicSkills[24] <> nil) then
Result := DoSpell(m_MagicSkills[24], m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, m_TargetCret);
{爆裂火焰}
if not Result and (m_MagicSkills[23] <> nil) then
Result := DoSpell(m_MagicSkills[23], m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, m_TargetCret);
{火墙}
if not Result and (m_MagicSkills[22] <> nil) then
Result := DoSpell(m_MagicSkills[22], m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, m_TargetCret);
{强化火球}
if not Result and (m_MagicSkills[87] <> nil) then
Result := DoSpell(m_MagicSkills[87], m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, m_TargetCret);
{小火球}
if not Result and (m_MagicSkills[1] <> nil) then
Result := DoSpell(m_MagicSkills[1], m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY, m_TargetCret);
end;
end;
//如果可以使用远程攻击
if Result then begin
// MainOutMessage('自动躲避: 1' );
m_boCanRemoteHit := True;
m_dwMagicAttackTick := GetTickCount;
m_dwHitTick := GetTickCount();
if m_Master <> nil then begin //重新设置目标坐标
m_nTargetX := -1;
end;
// Exit;
end else begin
m_boCanRemoteHit := False;
// MainOutMessage('自动躲避: 2' );
end;
//法师不近身攻击
// MainOutMessage('自动躲避: '+inttostr(abs(m_nCurrX - m_TargetCret.m_nCurrX))+ inttostr(abs(m_nCurrY - m_TargetCret.m_nCurrY)));
if (m_TargetCret <> nil) and
((m_btJob = 1) or (m_btJob = 2)) and
(abs(m_nCurrX - m_TargetCret.m_nCurrX) < 4) and (abs(m_nCurrY - m_TargetCret.m_nCurrY) < 4) then
begin
AutoAvoid(); //自动躲避
if (m_TargetCret.m_PEnvir <> m_PEnvir) then DelTargetCreat();
Exit;
end;
if not Result and GetAttackDir(m_TargetCret, bt06) then begin //物理攻击
if (GetTickCount - m_dwHitTick) > m_nNextHitTime then begin
m_dwHitTick := GetTickCount();
m_dwTargetFocusTick := GetTickCount();
m_dwMagicAttackTick := GetTickCount;
if not Result then
Attack(m_TargetCret, bt06);
BreakHolySeizeMode();
end;
Result := True;
end else begin
if (m_TargetCret.m_PEnvir = m_PEnvir) then begin //法师远程攻击
SetTargetXY(m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY);
end else begin
DelTargetCreat();
end;
end;
end;
{行走到目标}
procedure TPlayObject.GotoTargetXY;
var
i : Integer;
nDir : Integer;
n10 : Integer;
n14 : Integer;
n20 : Integer;
nOldX : Integer;
nOldY : Integer;
nX, nY : Integer;
boRun : Boolean;
begin
boRun := False;
MainOutMessage('走到目标: '+inttostr(m_nCurrY)+'- '+inttostr(m_nTargetY) );
if ((m_nCurrX <> m_nTargetX) or (m_nCurrY <> m_nTargetY)) then begin
n10 := m_nTargetX;
n14 := m_nTargetY;
dwTick3F4 := GetTickCount();
nDir := DR_DOWN;
if n10 > m_nCurrX then begin
nDir := DR_RIGHT;
if n14 > m_nCurrY then nDir := DR_DOWNRIGHT;
if n14 < m_nCurrY then nDir := DR_UPRIGHT;
end else begin
if n10 < m_nCurrX then begin
nDir := DR_LEFT;
if n14 > m_nCurrY then nDir := DR_DOWNLEFT;
if n14 < m_nCurrY then nDir := DR_UPLEFT;
end else begin
if n14 > m_nCurrY then nDir := DR_DOWN
else if n14 < m_nCurrY then nDir := DR_UP;
end;
end;
nOldX := m_nCurrX;
nOldY := m_nCurrY;
if (abs(m_nCurrX - m_nTargetX) > 3) or (abs(m_nCurrY - m_nTargetY) > 3) then begin
if m_PEnvir.GetNextPosition(m_nCurrX, m_nCurrY, nDir, 2, nX, nY) then boRun := True;
end;
if boRun then boRun := runto(nDir, False);
if not boRun then WalkTo(nDir, False);
n20 := Random(3);
for i := DR_UP to DR_UPLEFT do begin
if (nOldX = m_nCurrX) and (nOldY = m_nCurrY) then begin
if n20 <> 0 then Inc(nDir)
else if nDir > 0 then Dec(nDir)
else nDir := DR_UPLEFT;
if (nDir > DR_UPLEFT) then nDir := DR_UP;
WalkTo(nDir, False);
end;
end;
if ((nOldX = m_nCurrX) and (nOldY = m_nCurrY)) then begin
if m_boWalking then begin
SendRefMsg(SM_204, 0, 0, 0, 0, '');
m_boWalking := False;
end;
end else
m_boWalking := True;
end else begin
m_nTargetX := -1;
if m_boWalking then begin
SendRefMsg(SM_204, 0, 0, 0, 0, '');
m_boWalking := False;
end;
end;
end;
{检测指定方向和范围内坐标的怪物数量}
function TPlayObject.CheckTargetXYCount(nX, nY, nRange: Integer): Integer;
var
BaseObject : TBaseObject;
i, nC, n10 : Integer;
begin
Result := 0;
n10 := nRange;
for i := 0 to m_VisibleActors.Count - 1 do begin
BaseObject := TBaseObject(pTVisibleBaseObject(m_VisibleActors.Items[i]).BaseObject);
if BaseObject <> nil then begin
if not BaseObject.m_boDeath then begin
if IsProperTarget(BaseObject) then begin
if ((BaseObject.m_boHideMode = False) or (m_boCoolEye = True)) and (BaseObject.m_boHideModeEx = False) then begin
nC := abs(nX - BaseObject.m_nCurrX) + abs(nY - BaseObject.m_nCurrY);
if nC <= n10 then begin
Inc(Result);
if Result > 2 then Break;
end;
end;
end;
end;
end;
end;
end;
function TPlayObject.CheckTargetXYCountOfDirection(nX, nY, nDir, nRange: Integer): Integer;
var
BaseObject : TBaseObject;
i, nC, n10 : Integer;
begin
Result := 0;
n10 := 2;
for i := 0 to m_VisibleActors.Count - 1 do begin
BaseObject := TBaseObject(pTVisibleBaseObject(m_VisibleActors.Items[i]).BaseObject);
if BaseObject <> nil then begin
if not BaseObject.m_boDeath then begin
if IsProperTarget(BaseObject) and (not BaseObject.m_boHideMode) then begin
case nDir of
DR_UP: begin
if (abs(nX - BaseObject.m_nCurrX) <= nRange) and ((BaseObject.m_nCurrY - nY) in [0, nRange]) then Inc(Result);
end;
DR_UPRIGHT: begin
if ((BaseObject.m_nCurrX - nX) in [0, nRange]) and ((BaseObject.m_nCurrY - nY) in [0, nRange]) then Inc(Result);
end;
DR_RIGHT: begin
if ((BaseObject.m_nCurrX - nX) in [0, nRange]) and (abs(nY - BaseObject.m_nCurrY) <= nRange) then Inc(Result);
end;
DR_DOWNRIGHT: begin
if ((BaseObject.m_nCurrX - nX) in [0, nRange]) and ((nY - BaseObject.m_nCurrY) in [0, nRange]) then Inc(Result);
end;
DR_DOWN: begin
if (abs(nX - BaseObject.m_nCurrX) <= nRange) and ((nY - BaseObject.m_nCurrY) in [0, nRange]) then Inc(Result);
end;
DR_DOWNLEFT: begin
if ((nX - BaseObject.m_nCurrX) in [0, nRange]) and ((nY - BaseObject.m_nCurrY) in [0, nRange]) then Inc(Result);
end;
DR_LEFT: begin
if ((nX - BaseObject.m_nCurrX) in [0, nRange]) and (abs(nY - BaseObject.m_nCurrY) <= nRange) then Inc(Result);
end;
DR_UPLEFT: begin
if ((nX - BaseObject.m_nCurrX) in [0, nRange]) and ((BaseObject.m_nCurrY - nY) in [0, nRange]) then Inc(Result);
end;
end;
if Result > 2 then Break;
end;
end;
end;
end;
end;
procedure TPlayObject.GotoTargetXYRange();
var
n10 : Integer;
n14 : Integer;
begin
if CheckTargetXYCount(m_nCurrX, m_nCurrY, 10) < 1 then begin
n10 := abs(m_TargetCret.m_nCurrX - m_nCurrX);
n14 := abs(m_TargetCret.m_nCurrY - m_nCurrY);
if n10 > 4 then Dec(n10, 5) else n10 := 0;
if n14 > 4 then Dec(n14, 5) else n14 := 0;
if m_TargetCret.m_nCurrX > m_nCurrX then m_nTargetX := m_nCurrX + n10;
if m_TargetCret.m_nCurrX < m_nCurrX then m_nTargetX := m_nCurrX - n10;
if m_TargetCret.m_nCurrY > m_nCurrY then m_nTargetY := m_nCurrY + n14;
if m_TargetCret.m_nCurrY < m_nCurrY then m_nTargetY := m_nCurrY - n14;
m_boRunAwayMode := True;
m_dwRunAwayStart := GetTickCount();
m_dwRunAwayTime := 2 * 1000;
// GotoTargetXY();
end;
end;
{自动躲避}
function TPlayObject.AutoAvoid(): Boolean;
function GetAvoidDir(): Integer;
var
n10 : Integer;
n14 : Integer;
begin
n10 := m_TargetCret.m_nCurrX;
n14 := m_TargetCret.m_nCurrY;
Result := DR_DOWN;
if n10 > m_nCurrX then begin
Result := DR_LEFT;
if (n14 > m_nCurrY) then
Result := DR_DOWNLEFT
else if Random(5) = 0 then
Result := DR_UPLEFT;
end else begin
if n10 < m_nCurrX then begin
Result := DR_RIGHT;
if n14 > m_nCurrY then Result := DR_DOWNRIGHT
else if Random(5) = 0 then Result := DR_UPRIGHT;
//if n14 < m_nCurrY then Result := DR_UPRIGHT;
end else begin
if n14 > m_nCurrY then Result := DR_UP
else
if n14 < m_nCurrY then Result := DR_DOWN;
end;
end;
end;
function SearchNextDir(var nTargetX, nTargetY: Integer): Boolean;
var
i : Integer;
nDir : Integer;
n01 : Integer;
n02 : Integer;
n03 : Integer;
n04 : Integer;
n05 : Integer;
n06 : Integer;
n07 : Integer;
n08 : Integer;
n10 : Integer;
boGotoL2 : Boolean;
label
L001;
label
L002;
label
L003;
begin
Result := False;
if not Result then begin
nDir := GetAvoidDir;
boGotoL2 := False;
goto L001;
end;
L002:
if not Result then begin
n10 := 0;
while True do begin
Inc(n10);
nDir := Random(8);
if nDir in [0..7] then Break;
if n10 > 8 then Break;
end;
goto L001;
end;
L001:
n01 := 0;
n02 := 0;
n03 := 0;
n04 := 0;
n05 := 0;
n06 := 0;
n07 := 0;
n08 := 0;
while True do begin
if nDir > DR_UPLEFT then Break;
case nDir of
DR_UP: begin
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 5) = 0) then begin
Inc(nTargetY, 10 - n01);
Result := True;
Break;
end else begin
if n01 >= 10 then begin
nTargetX := m_nCurrX;
nTargetY := m_nCurrY;
Inc(nDir);
Continue;
end;
Inc(nTargetY);
Inc(n01);
Continue;
end;
end;
DR_UPRIGHT: begin
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 5) = 0) then begin
Inc(nTargetX, 10 - n02);
Inc(nTargetY, 10 - n02);
Result := True;
Break;
end else begin
if n02 >= 10 then begin
nTargetX := m_nCurrX;
nTargetY := m_nCurrY;
Inc(nDir);
Continue;
end;
Inc(nTargetX);
Inc(nTargetY);
Inc(n02);
Continue;
end;
end;
DR_RIGHT: begin
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 5) = 0) then begin
Inc(nTargetX, 10 - n03);
Result := True;
Break;
end else begin
if n03 >= 10 then begin
nTargetX := m_nCurrX;
nTargetY := m_nCurrY;
Inc(nDir);
Continue;
end;
Inc(nTargetX);
Inc(n03);
Continue;
end;
end;
DR_DOWNRIGHT: begin
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 5) = 0) then begin
Inc(nTargetX, 10 - n04);
Dec(nTargetY, 10 - n04);
Result := True;
Break;
end else begin
if n04 >= 10 then begin
nTargetX := m_nCurrX;
nTargetY := m_nCurrY;
Inc(nDir);
Continue;
end;
Inc(nTargetX);
Dec(nTargetY);
Inc(n04);
Continue;
end;
end;
DR_DOWN: begin
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 5) = 0) then begin
Dec(nTargetY, 10 - n05);
Result := True;
Break;
end else begin
if n05 >= 10 then begin
nTargetX := m_nCurrX;
nTargetY := m_nCurrY;
Inc(nDir);
Continue;
end;
Dec(nTargetY);
Inc(n05);
Continue;
end;
end;
DR_DOWNLEFT: begin
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 5) = 0) then begin
Dec(nTargetX, 10 - n06);
Dec(nTargetY, 10 - n06);
Result := True;
Break;
end else begin
if n06 >= 10 then begin
nTargetX := m_nCurrX;
nTargetY := m_nCurrY;
Inc(nDir);
Continue;
end;
Dec(nTargetX);
Dec(nTargetY);
Inc(n06);
Continue;
end;
end;
DR_LEFT: begin
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 5) = 0) then begin
Dec(nTargetX, 10 - n07);
Result := True;
Break;
end else begin
if n07 >= 10 then begin
nTargetX := m_nCurrX;
nTargetY := m_nCurrY;
Inc(nDir);
Continue;
end;
Dec(nTargetX);
Inc(n07);
Continue;
end;
end;
DR_UPLEFT: begin
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 5) = 0) then begin
Dec(nTargetX, 10 - n08);
Inc(nTargetY, 10 - n08);
Result := True;
Break;
end else begin
if n08 >= 10 then begin
nTargetX := m_nCurrX;
nTargetY := m_nCurrY;
Inc(nDir);
Continue;
end;
Dec(nTargetX);
Inc(nTargetY);
Inc(n08);
Continue;
end;
end;
end;
end;
if (not boGotoL2) and (not Result) then begin
boGotoL2 := True;
goto L002;
end;
end;
var
n10 : Integer;
n14 : Integer;
n20 : Integer;
nOldX : Integer;
nOldY : Integer;
n16 : Integer;
nLoopCount : Integer;
begin
if not m_boCanRemoteHit then Exit;
MainOutMessage('自动躲避: ' );
if (GetTickCount - m_dwAutoAvoidTick > 3 * 1000) then begin
m_dwAutoAvoidTick := GetTickCount();
if m_TargetCret <> nil then begin
n10 := 0;
if CheckTargetXYCount(m_nCurrX, m_nCurrY, 5) > 0 then begin
while True do begin
Inc(n10);
m_nTargetX := m_nCurrX;
m_nTargetY := m_nCurrY;
if SearchNextDir(m_nTargetX, m_nTargetY) then begin
m_boRunAwayMode := True;
m_dwRunAwayStart := GetTickCount();
m_dwRunAwayTime := 2 * 1000;
end;
//GotoTargetXY();
if CheckTargetXYCount(m_nCurrX, m_nCurrY, 5) = 0 then Break;
if n10 >= 1 then Break;
end;
end;
GotoTargetXYRange();
end;
end;
end;
{无行为目标}
procedure TPlayObject.UpdatenoatcktActors(BaseObject: TBaseObject); //004B939C
var
I : Integer;
boIsVisible : Boolean;
VisibleBaseObject : pTVisibleBaseObject;
begin
boIsVisible := False;
// if (BaseObject.m_btRaceServer = RC_PLAYOBJECT) or (BaseObject.m_Master <> nil) then
// m_boIsVisibleActive:=True;//如果是人物或宝宝则置TRUE
for I := 0 to m_noatcktActors.Count - 1 do
begin
VisibleBaseObject := m_noatcktActors.Items[I];
if VisibleBaseObject.BaseObject = BaseObject then
begin
VisibleBaseObject.nVisibleFlag := 1;
boIsVisible := True;
break;
end;
end;
if boIsVisible then
exit;
New(VisibleBaseObject);
VisibleBaseObject.nVisibleFlag := 2;
VisibleBaseObject.BaseObject := BaseObject;
m_noatcktActors.Add(VisibleBaseObject);
end;
function TPlayObject.canatackTarget(BaseObject:TBaseObject): Boolean;
var
I : Integer;
noatackBaseObject : pTVisibleBaseObject;
begin
Result := true;
for I := 0 to m_noatcktActors.Count - 1 do
begin
noatackBaseObject := m_noatcktActors.Items[I];
if (TBaseObject(noatackBaseObject.BaseObject)=BaseObject) then
begin
Result := false;
break;
end;
end;
end;
procedure TPlayObject.Wondering();
var
nX, nY,ncode,nDir,bx,by: Integer;
begin
m_boAIStart:=true;
m_nround:=20;
if m_boAIStart and
(m_TargetCret = nil) and
(not m_boGhost) and
(not m_boDeath) and
(not m_boFixedHideMode) and
(not m_boStoneMode) and
(m_wStatusTimeArr[POISON_STONE] = 0) then begin
try
MainOutMessage(Format('%s往回走:(%d / %d)', [m_sCharName,start_x, start_y]));
if (abs(m_nCurrX - start_x) + abs(m_nCurry - start_y) >m_nround) then begin
if m_nMoveFailCount> 10 then begin
MapRandomMove(m_PEnvir.m_sMapName, 0,nil);
m_nMoveFailCount:=0;
end;
bx:= start_x+4-random(8) ;
by:= start_y+4-random(8) ;
nDir := GetNextDirection(m_nCurrX, m_nCurrY, bx, by);
m_PEnvir.GetNextPosition(start_x, start_y, nDir, 2, m_nTargetX, m_nTargetY);
if not runto(nDir, false) then GotoTargetXY();
Inc(m_nMoveFailCount);
// MainOutMessage(Format('%s往回:(%d / %d/ %d)', [m_sCharName,start_x, start_y,m_nround]));
exit;
// MainOutMessage(Format('%s往回走:(%d / %d)', [m_sCharName,start_x, start_y]));
end;
//if not m_PointManager.Finish then begin
nX := m_nCurrX;
nY := m_nCurrY;
// MainOutMessage(Format('TAIObject.Wondering0:(%d / %d)', [nX, nY]));
//m_PointManager.SetThroughPoint(m_nCurrX, m_nCurrY);
if (Length(m_Path) > 0) and (m_nPostion < Length(m_Path)) then begin
if not GotoNextOne(m_Path[m_nPostion].X, m_Path[m_nPostion].Y, True) then begin
m_Path := nil;
m_nPostion := -1;
Inc(m_nMoveFailCount);
Inc(m_nPostion);
end else begin
m_nMoveFailCount := 0;
//MainOutMessage(m_sCharName + ' GotoNextOne FindPath:' + IntToStr(Length(m_Path)));
Exit;
end;
end else begin
m_Path := nil;
m_nPostion := -1;
end;
ncode:=0;
if m_PointManager.GetPoint(nX, nY) then begin
if (abs(nX - m_nCurrX) > 2) or (abs(nY - m_nCurrY) > 2) then begin
g_FindPath.BaseObject := Self;
m_Path := g_FindPath.FindPath(m_PEnvir, m_nCurrX, m_nCurrY, nX, nY, True, False);
m_nPostion := 0;
ncode:=2;
//MainOutMessage(m_sCharName + ' FindPath:' + IntToStr(Length(m_Path)));
if (Length(m_Path) > 0) and (m_nPostion < Length(m_Path)) then begin
if not GotoNextOne(m_Path[m_nPostion].X, m_Path[m_nPostion].Y, True) then begin
m_Path := nil;
m_nPostion := -1;
Inc(m_nMoveFailCount);
end else begin
m_nMoveFailCount := 0;
Inc(m_nPostion);
Exit;
end;
ncode:=3;
end else begin
m_Path := nil;
m_nPostion := -1;
Inc(m_nMoveFailCount);
end;
end else begin
if GotoNextOne(nX, nY, True) then begin
m_nMoveFailCount := 0;
end else begin
Inc(m_nMoveFailCount);
end;
end;
//MainOutMessage(Format('%s TAIObject.Wondering1:(%d / %d)', [m_sCharName, nX, nY]));
//if GotoNextOne(nX, nY, True) then MainOutMessage(Format('%s TAIObject.Wondering2:(%d / %d)', [m_sCharName, nX, nY])) else MainOutMessage(Format('%s TAIObject.Wondering3:(%d / %d)', [m_sCharName, nX, nY]));
end else Stop;
//end else Stop;
except
MainOutMessage(Format('Wonderingai:(%d )', [ncode]));
end;
end;
{
begin
if (Random(30) = 0) then begin
if (Random(4) = 1) then TurnTo(Random(8))
else begin
WalkTo(m_btDirection, False);
m_boWalking := True;
end;
end else if m_boWalking then begin
SendRefMsg(SM_204, 0, 0, 0, 0, '');
m_boWalking := False;
end; }
end;
procedure TPlayObject.Stop;
begin
if m_boAIStart then begin
m_boAIStart := False;
m_ManagedEnvir := nil;
m_nMoveFailCount := 0;
m_Path := nil;
m_nPostion := -1;
//MainOutMessage(m_sCharName + ' TAIObject.Stop:' + IntToStr(m_PointManager.Count));
if g_FunctionNPC <> nil then begin
m_nScriptGotoCount := 0;
g_FunctionNPC.GotoLable(Self, '@AIStop', False);
end;
end;
end;
function TPlayObject.RunToNext(nX, nY: Integer): Boolean;
begin
Result := RunTo(GetNextDirection(m_nCurrX, m_nCurrY, nX, nY), False);
end;
function TPlayObject.WalkToNext(nX, nY: Integer): Boolean;
begin
Result := WalkTo(GetNextDirection(m_nCurrX, m_nCurrY, nX, nY), False);
end;
function TPlayObject.GotoNextOne(nX, nY: Integer; boRun: Boolean): Boolean;
var
I, nStep: Integer;
Path: TPath;
begin
Result := False;
if (abs(nX - m_nCurrX) <= 2) and (abs(nY - m_nCurrY) <= 2) then begin
if (abs(nX - m_nCurrX) <= 1) and (abs(nY - m_nCurrY) <= 1) then begin
Result := WalkToNext(nX, nY);
end else begin
Result := RunToNext(nX, nY);
end;
end;
if not Result then begin
g_FindPath.BaseObject := Self;
Path := g_FindPath.FindPath(m_PEnvir, m_nCurrX, m_nCurrY, nX, nY, boRun, False);
if Length(Path) > 0 then begin
for I := 0 to Length(Path) - 1 do begin
if (Path[I].X <> m_nCurrX) or (Path[I].Y <> m_nCurrY) then begin
if (abs(Path[I].X - m_nCurrX) >= 2) or (abs(Path[I].Y - m_nCurrY) >= 2) then begin
Result := RunToNext(Path[I].X, Path[I].Y);
end else begin
Result := WalkToNext(Path[I].X, Path[I].Y);
end;
break;
end;
end;
Path := nil;
end;
end;
m_RunPos.nAttackCount := 0;
end;
procedure TPlayObject.SearchTarget;
var
BaseObject, BaseObject18 : TBaseObject;
i, nC, n10 : Integer;
begin
BaseObject18 := nil;
n10 := 999;
for i := 0 to m_VisibleActors.Count - 1 do begin
BaseObject := TBaseObject(pTVisibleBaseObject(m_VisibleActors.Items[i]).BaseObject);
if BaseObject.m_boDeath then Continue;
if IsProperTarget(BaseObject) and (not BaseObject.m_boHideMode) and (not getAInoa(BaseObject.m_sCharName)) then begin
nC := abs(m_nCurrX - BaseObject.m_nCurrX) + abs(m_nCurrY - BaseObject.m_nCurrY);
if nC < n10 then begin
n10 := nC;
BaseObject18 := BaseObject;
end;
end;
end;
if BaseObject18 <> nil then SetTargetCreat(BaseObject18);
end;
procedure TPlayObject.RunNotice; //004DA588
var
Msg : TProcessMessage;
nCode, nOrd : Integer;
resourcestring
sExceptionMsg = '[Exception] TPlayObject::RunNotice';
begin
nCode := 0;
if m_boEmergencyClose or m_boKickFlag or m_boSoftClose then begin
if m_boKickFlag then SendDefMessage(SM_OUTOFCONNECTION, 0, 0, 0, 0, '');
MakeGhost();
end else begin
try
if not m_boSendNotice then begin
FeatureChanged;
SendNotice();
//m_boSendNotice := True;
m_dwWaitLoginNoticeOKTick := GetTickCount();
end else begin
// if GetTickCount - m_dwWaitLoginNoticeOKTick > 1200 * 1000 then begin
// m_boEmergencyClose := True;
// end;
while GetMessage(@Msg) do begin
if Msg.wIdent = CM_LOGINNOTICEOK then begin
m_boLoginNoticeOK := True;
m_dwRunTick := 0;
m_dwSearchTick := 0;
m_boFixedHideMode := False;
m_boFilterSendMsg := GetDisableSendMsgList(m_sCharName);
m_boCanDeal := True;
m_boCanDrop := True;
m_boCanGetBackItem := True;
m_boCanWalk := True;
m_boCanRun := True;
m_boCanHit := True;
m_boCanSpell := True;
m_boCanUseItem := True;
if g_Config.boPasswordLockSystem then begin //密码保护系统
if m_boPasswordLocked then begin
m_boCanGetBackItem := not g_Config.boLockGetBackItemAction;
end;
if g_Config.boLockHumanLogin and m_boLockLogon and m_boPasswordLocked then begin
m_boCanDeal := not g_Config.boLockDealAction;
m_boCanDrop := not g_Config.boLockDropAction;
m_boCanUseItem := not g_Config.boLockUserItemAction;
m_boCanWalk := not g_Config.boLockWalkAction;
m_boCanRun := not g_Config.boLockRunAction;
m_boCanHit := not g_Config.boLockHitAction;
m_boCanSpell := not g_Config.boLockSpellAction;
m_boCanSendMsg := not g_Config.boLockSendMsgAction;
m_boObMode := g_Config.boLockInObModeAction;
m_boAdminMode := g_Config.boLockInObModeAction;
SysMsg(g_sActionIsLockedMsg + ' 开锁命令: @' + g_GameCommand.UnLock.sCmd, c_Red, t_Hint);
if not ExecuteScript(g_FunctionNPC, '@仓库锁定') then
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0,
g_sActionIsLockedMsg + #13#10#13#10
+ '仓库开锁命令: @' + g_GameCommand.UNLOCKSTORAGE.sCmd +
#13#10
+ '仓库加锁命令: @' + g_GameCommand.Lock.sCmd + #13#10
+ '设置密码命令: @' + g_GameCommand.SETPASSWORD.sCmd + #13#10
+ '修改密码命令: @' + g_GameCommand.CHGPASSWORD.sCmd);
end;
end;
ExecuteScript(g_ManageNPC, '@LoginNotice');
if g_Config.boClassicServer then begin
SendDefMessage(SM_SRVVERSION, Integer(Self), 0, 0, 0, m_VersionManage.ServerVerSion);
end else begin
m_BattleVal.BattleVal := m_BattleVal.nMinVal[0] + m_BattleVal.nMinVal[1] +
m_BattleVal.nMinVal[2] + m_BattleVal.nMinVal[3] + m_BattleVal.nMinVal[4];
SendDefMessage(SM_BATTLEVAL, Integer(Self), m_BattleVal.BattleVal, 0, 0,
EnCodeBuffer(@m_BattleVal, SizeOf(TBattleData)), True);
if g_Config.boTimeBackServer then
SendDefMessage(SM_SRVVERSION, Integer(Self), 256, 2, 0, m_VersionManage.ServerVerSion);
if g_Config.boMagicCityServer then
SendDefMessage(SM_SRVVERSION, Integer(Self), 256, 5, 0, m_VersionManage.ServerVerSion);
{$IF DEMONSERVER = 1}
if g_Config.boNightMareServer then
SendDefMessage(SM_SRVVERSION, Integer(Self), 256, 5, 2, m_VersionManage.ServerVerSion);
{$IFEND}
if g_Config.botimeServer then
SendDefMessage(SM_SRVVERSION, Integer(Self), 256, 7, 0, m_VersionManage.ServerVerSion); //时长区
end;
if m_boPneuma and (m_PneumaObject <> nil) then begin
SendRefMsg(RM_TURN,
m_btDirection,
m_nCurrX,
m_nCurrY,
CalcCent(m_WAbil.dwHP, m_WAbil.dwMaxHP),
GetShowName);
SendRefMsg(RM_510, 1, 0, $16, 0, ''); //元神出现的效果
if m_PneumaObject is TPlayObject then begin
if TPlayObject(m_PneumaObject).m_nPneumaLastX <> -1 then begin
TPlayObject(m_PneumaObject).m_nPneumaLastX := -1;
nOrd := DWORD(Self);
m_PneumaObject.SendRefMsg(RM_510, LoWord(nOrd), HiWord(nOrd), 126, 0, '');
TPlayObject(m_PneumaObject).ExecuteScript(g_FunctionNPC, '@元神切换触发');
end;
end;
end;
end;
Operate(@Msg);
end;
end;
except
MainOutMessage(sExceptionMsg);
end;
end;
end;
procedure TPlayObject.ScatterBagItems(ItemOfCreat: TBaseObject);
var
i, DropWide, nRate : Integer;
DelList : TStringList;
boDropall : Boolean;
UserItem : pTUserItem;
StdItem : pTStdItem;
tm : DWORD;
resourcestring
sExceptionMsg = '[Exception] TPlayObject::ScatterBagItems';
begin
if m_btRaceServer <> RC_PLAYOBJECT then begin
inherited ScatterBagItems(ItemOfCreat);
Exit;
end;
DelList := nil;
if m_boAngryRing or m_boNoDropItem then Exit; //不死戒指
boDropall := False;
DropWide := 5;
if g_Config.boDieRedScatterBagAll and (PKLevel >= 2) then begin
boDropall := True;
end;
try
for i := m_ItemList.Count - 1 downto 0 do begin
UserItem := pTUserItem(m_ItemList[i]);
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
nRate := g_Config.nDieScatterBagRate;
if ItemOfCreat <> nil then begin
if (g_Config.boAttachedSoulAbil) then
nRate := _MAX(0, nRate - m_HumScatterBagAddRate); //附魂
end;
if boDropall or (Random(nRate {3}) = 0) or (CheckSPCode(StdItem.Reserved, RE_SCATTER)) then begin
if DropItemDown(UserItem, DropWide, True, ItemOfCreat, Self) then begin
if m_btRaceServer = RC_PLAYOBJECT then begin
if DelList = nil then DelList := TStringList.Create;
DelList.AddObject(StdItem.Name, TObject(UserItem.MakeIndex));
end;
Dispose(UserItem);
m_ItemList.Delete(i);
end;
end;
end;
end;
if DelList <> nil then begin
SendMsg(Self, RM_SENDDELITEMLIST, 0, Integer(DelList), 0, 0, '');
end;
except
on E: Exception do begin
MainOutMessage(sExceptionMsg);
MainOutMessage(E.Message);
end;
end;
end;
procedure TPlayObject.SearchViewRange;
var
i : Integer;
nStartX : Integer;
nEndX : Integer;
nStartY : Integer;
nEndY : Integer;
n18 : Integer;
n1C : Integer;
nIdx : Integer;
n24 : Integer;
MapCellInfo : pTMapCellinfo;
OSObject : pTOSObject;
BaseObject : TBaseObject;
MapItem : pTMapItem;
MapEvent : TEvent;
VisibleBaseObject : pTVisibleBaseObject;
VisibleMapItem : pTVisibleMapItem;
nCheckCode : Integer;
RidePet : TRidePet;
resourcestring
sExceptionMsg1 = '[Exception] TPlayObject::SearchViewRange Code:%d';
sExceptionMsg2 = '[Exception] TPlayObject::SearchViewRange 1-%d %s %s %d %d %d';
begin
if m_PEnvir = nil then begin
MainOutMessage('SearchViewRange nil PEnvir');
Exit;
end;
// if m_boOfflineGetGamePoint then Exit;
n24 := 0;
try
nCheckCode := 2;
for i := m_VisibleItems.Count - 1 downto 0 do begin
pTVisibleMapItem(m_VisibleItems.Items[i]).nVisibleFlag := 0;
end;
nCheckCode := 3;
for i := m_VisibleEvents.Count - 1 downto 0 do begin
TEvent(m_VisibleEvents.Items[i]).nVisibleFlag := 0;
end;
nCheckCode := 4;
for i := m_VisibleActors.Count - 1 downto 0 do begin
pTVisibleBaseObject(m_VisibleActors.Items[i]).nVisibleFlag := 0;
end;
nCheckCode := 5;
except
MainOutMessage(Format(sExceptionMsg1, [nCheckCode]));
KickException();
end;
nCheckCode := 6;
nStartX := m_nCurrX - m_nViewRange;
nEndX := m_nCurrX + m_nViewRange;
nStartY := m_nCurrY - m_nViewRange;
nEndY := m_nCurrY + m_nViewRange;
try
nCheckCode := 7;
for n18 := nStartX to nEndX do begin
nCheckCode := 8;
for n1C := nStartY to nEndY do begin
nCheckCode := 9;
if m_PEnvir.GetMapCellInfo(n18, n1C, MapCellInfo) and
(MapCellInfo.ObjList <> nil) then begin
nCheckCode := 10;
n24 := 1;
nIdx := 0;
while (True) do begin
nCheckCode := 11;
if MapCellInfo.ObjList.Count <= nIdx then Break;
OSObject := MapCellInfo.ObjList.Items[nIdx];
nCheckCode := 12;
if OSObject = nil then begin //释放对象
MapCellInfo.ObjList.Delete(i);
if MapCellInfo.ObjList.Count > 0 then Continue;
nCheckCode := 121;
MapCellInfo.ObjList.free;
MapCellInfo.ObjList := nil;
Break;
end;
if OSObject <> nil then begin
nCheckCode := 13;
if OSObject.btType = OS_MOVINGOBJECT then begin
nCheckCode := 14;
if (GetTickCount - OSObject.dwAddTime) >= 60 * 1000 then begin
Dispose(OSObject);
MapCellInfo.ObjList.Delete(nIdx);
if MapCellInfo.ObjList.Count > 0 then Continue;
MapCellInfo.ObjList.free;
MapCellInfo.ObjList := nil;
Break;
end;
nCheckCode := 15;
BaseObject := TBaseObject(OSObject.CellObj);
if BaseObject <> nil then begin
nCheckCode := 16;
if not BaseObject.m_boGhost and not
BaseObject.m_boFixedHideMode and not BaseObject.m_boObMode then begin
nCheckCode := 17;
if (m_btRaceServer < RC_ANIMAL) or
(m_Master <> nil) or
m_boCrazyMode or
m_boWantRefMsg or
((BaseObject.m_Master <> nil) and (abs(BaseObject.m_nCurrX - m_nCurrX) <= 3) and (abs(BaseObject.m_nCurrY - m_nCurrY) <= 3)) or
(BaseObject.m_btRaceServer = RC_PLAYOBJECT) then begin
nCheckCode := 18;
UpdateVisibleGay(BaseObject);
nCheckCode := 19;
end;
end;
end;
end;
nCheckCode := 20;
if m_btRaceServer = RC_PLAYOBJECT then begin
if OSObject.btType = OS_ITEMOBJECT then begin
nCheckCode := 21;
if (not pTMapItem(OSObject.CellObj).boForbidClear) and (((m_PEnvir <> nil) and m_PEnvir.m_boClearItem) or ((GetTickCount - OSObject.dwAddTime) > g_Config.dwClearDropOnFloorItemTime)) then begin
nCheckCode := 22;
Dispose(pTMapItem(OSObject.CellObj));
MapCellInfo.ObjList.Delete(nIdx);
Dispose(OSObject); //修正内存错误
nCheckCode := 23;
if MapCellInfo.ObjList.Count > 0 then Continue;
nCheckCode := 24;
MapCellInfo.ObjList.free;
MapCellInfo.ObjList := nil;
Break;
end;
nCheckCode := 25;
MapItem := pTMapItem(OSObject.CellObj);
nCheckCode := 28;
UpdateVisibleItem(n18, n1C, MapItem);
if (MapItem.OfBaseObject <> nil) or (MapItem.DropBaseObject <> nil) then begin
nCheckCode := 29;
if (GetTickCount - MapItem.dwCanPickUpTick) > g_Config.dwFloorItemCanPickUpTime {2 * 60 * 1000} then begin
nCheckCode := 30;
MapItem.OfBaseObject := nil;
MapItem.DropBaseObject := nil;
end else begin
nCheckCode := 31;
if TBaseObject(MapItem.OfBaseObject) <> nil then begin
nCheckCode := 32;
if TBaseObject(MapItem.OfBaseObject).m_boGhost then
MapItem.OfBaseObject := nil;
end;
nCheckCode := 33;
if TBaseObject(MapItem.DropBaseObject) <> nil then begin
nCheckCode := 34;
if TBaseObject(MapItem.DropBaseObject).m_boGhost then
MapItem.DropBaseObject := nil;
end;
nCheckCode := 35;
end;
end;
end;
nCheckCode := 36;
if OSObject.btType = OS_EVENTOBJECT then begin
nCheckCode := 37;
MapEvent := TEvent(OSObject.CellObj);
if MapEvent.m_boVisible then begin
nCheckCode := 38;
UpdateVisibleEvent(n18, n1C, MapEvent);
end;
nCheckCode := 39;
end;
end
end; //004B9B81 if OSObject <> nil then begin
Inc(nIdx);
end; //while (True) do begin
end;
end; //for n1C:= n10 to n14 do begin
end; //for n18:= n8 to nC do begin
except
on E: Exception do begin
MainOutMessage(Format(sExceptionMsg2, [n24, m_sCharName, m_sMapName,
m_nCurrX, m_nCurrY, nCheckCode]));
MainOutMessage(E.Message);
KickException();
end;
end;
nCheckCode := 40;
n24 := 2;
try
n18 := 0;
while (True) do begin
if m_VisibleActors.Count <= n18 then Break;
nCheckCode := 41;
VisibleBaseObject := m_VisibleActors.Items[n18];
nCheckCode := 42;
if VisibleBaseObject.nVisibleFlag = 0 then begin
nCheckCode := 43;
if m_btRaceServer = RC_PLAYOBJECT then begin
nCheckCode := 44;
BaseObject := TBaseObject(VisibleBaseObject.BaseObject);
nCheckCode := 45;
if not BaseObject.m_boFixedHideMode and (not BaseObject.m_boGhost) then begin //01/21 修改防止人物退出时发送重复的消息占用带宽,人物进入隐身模式时人物不消失问题
nCheckCode := 46;
SendMsg(BaseObject, RM_DISAPPEAR, 0, 0, 0, 0, '');
end;
nCheckCode := 47;
end;
m_VisibleActors.Delete(n18);
nCheckCode := 48;
Dispose(VisibleBaseObject);
nCheckCode := 49;
Continue;
end;
nCheckCode := 50;
if (m_btRaceServer = RC_PLAYOBJECT) and (VisibleBaseObject.nVisibleFlag = 2) then begin
nCheckCode := 51;
BaseObject := TBaseObject(VisibleBaseObject.BaseObject);
nCheckCode := 52;
if BaseObject <> Self then begin
nCheckCode := 53;
if BaseObject.m_boDeath then begin
nCheckCode := 54;
if BaseObject.m_boSkeleton then begin
nCheckCode := 55;
SendMsg(BaseObject, RM_SKELETON, BaseObject.m_btDirection,
BaseObject.m_nCurrX, BaseObject.m_nCurrY, 0, '');
nCheckCode := 56;
end else begin
nCheckCode := 57;
SendMsg(BaseObject, RM_DEATH, BaseObject.m_btDirection, BaseObject.m_nCurrX, BaseObject.m_nCurrY, 0, BaseObject.GetShowName);
nCheckCode := 58;
end;
end else begin
nCheckCode := 59;
SendMsg(BaseObject, RM_TURN, BaseObject.m_btDirection, BaseObject.m_nCurrX, BaseObject.m_nCurrY, CalcCent(BaseObject.m_WAbil.dwHP, BaseObject.m_WAbil.dwMaxHP), BaseObject.GetShowName);
nCheckCode := 60;
if (BaseObject.m_btRaceServer = RC_PLAYOBJECT) then begin
nCheckCode := 61;
if TPlayObject(BaseObject).m_boRideOn and
TPlayObject(BaseObject).m_boRideFightOn then begin
nCheckCode := 62;
RidePet.nFeature := BaseObject.GetFeature(Self);
nCheckCode := 63;
if BaseObject.m_boPneuma and (BaseObject.m_PneumaObject <> nil) then begin
RidePet.btState := 1 + TPlayObject(BaseObject.m_PneumaObject).m_PetInfo[3].btRideFightSpeed;
RidePet.btSoul := TPlayObject(BaseObject.m_PneumaObject).m_PetInfo[3].btSoul;
end else begin
RidePet.btState := 1 + TPlayObject(BaseObject).m_PetInfo[2].btRideFightSpeed;
RidePet.btState := 1 + TPlayObject(BaseObject).m_PetInfo[2].btSoul;
end;
nCheckCode := 64;
SendMsg(BaseObject, RM_SITDOWN, BaseObject.m_btDirection,
MakeLong(BaseObject.m_nCurrX, BaseObject.m_nCurrY),
BaseObject.GetFeature(Self), 1, EnCodeBuffer(@RidePet, SizeOf(TRidePet)));
end;
end;
nCheckCode := 65;
end;
end;
end;
Inc(n18);
end;
except
on E: Exception do begin
MainOutMessage(Format(sExceptionMsg2, [n24, m_sCharName, m_sMapName,
m_nCurrX, m_nCurrY, nCheckCode]));
KickException();
end;
end;
try
i := 0;
while (True) do begin
if m_VisibleItems.Count <= i then Break;
VisibleMapItem := m_VisibleItems.Items[i];
if VisibleMapItem.nVisibleFlag = 0 then begin
SendMsg(Self, RM_ITEMHIDE, 0, Integer(VisibleMapItem.MapItem),
VisibleMapItem.nX, VisibleMapItem.nY, '');
m_VisibleItems.Delete(i);
Dispose(VisibleMapItem);
Continue;
end; //004B9F6C
if VisibleMapItem.nVisibleFlag = 2 then begin
SendMsg(Self, RM_ITEMSHOW, VisibleMapItem.wLooks, Integer(VisibleMapItem.MapItem), VisibleMapItem.nX, VisibleMapItem.nY, VisibleMapItem.sName);
end;
Inc(i);
end;
i := 0;
while (True) do begin
if m_VisibleEvents.Count <= i then Break;
MapEvent := m_VisibleEvents.Items[i];
if MapEvent.nVisibleFlag = 0 then begin
SendMsg(Self, RM_HIDEEVENT, 0, Integer(MapEvent), MapEvent.m_nX,
MapEvent.m_nY, '');
m_VisibleEvents.Delete(i);
Continue;
end;
if MapEvent.nVisibleFlag = 2 then begin
SendMsg(Self, RM_SHOWEVENT,
MapEvent.m_nEventType,
Integer(MapEvent),
MakeLong(MapEvent.m_nX, MapEvent.m_nEventParam),
MapEvent.m_nY,
'');
end;
Inc(i);
end;
//清理物品结束
if ((m_PEnvir <> nil) and m_PEnvir.m_boClearItem) then
m_PEnvir.m_boClearItem := False;
except
MainOutMessage(m_sCharName + ',' +
m_sMapName + ',' +
IntToStr(m_nCurrX) + ',' +
IntToStr(m_nCurrY) + ',' +
' SearchViewRange 3');
KickException();
end;
end;
///////兼容客户端/////////Begin////////////////////
{发送添加交易物品}
procedure TPlayObject.SendAddDealItem(UserItem: pTUserItem);
begin
if UserItem = nil then Exit;
SendDefMessage(SM_DEALADDITEM_OK, 0, 0, 0, 0, '');
if (m_DealCreat <> nil) and (m_DealCreat.m_btRaceServer = RC_PLAYOBJECT) then begin
//必须在这里就要保证下面的安全
if Assigned(TPlayObject(m_DealCreat).m_VersionManage) then
try
TPlayObject(m_DealCreat).m_VersionManage.OnSendAddDealItem(Self, UserItem);
except
MainOutMessage(Format('TPlayObject::OnSendAddDealItem SoftVersionDate:%d', [TPlayObject(m_DealCreat).m_VersionManage.SoftVersionDate]));
end;
// if (TPlayObject(m_DealCreat).m_nSoftVersionDateEx = 0) then begin
// VER19990SendAddDealItem(UserItem);
// end else begin
// VER19990SendAddDealItem(UserItem);
// end;
m_DealCreat.m_DealLastTick := GetTickCount();
m_DealLastTick := GetTickCount();
end;
end;
{删除交易框物品}
procedure TPlayObject.SendDelDealItem(UserItem: pTUserItem);
begin
if UserItem = nil then Exit;
SendDefMessage(SM_DEALDELITEM_OK, 0, 0, 0, 0, '');
if (m_DealCreat <> nil) and (m_DealCreat.m_btRaceServer = RC_PLAYOBJECT) then begin
if Assigned(TPlayObject(m_DealCreat).m_VersionManage) then
try
TPlayObject(m_DealCreat).m_VersionManage.OnSendDelDealItem(Self, UserItem);
except
MainOutMessage(Format('TPlayObject::OnSendDelDealItem SoftVersionDate:%d', [TPlayObject(m_DealCreat).m_VersionManage.SoftVersionDate]));
end;
// if (TPlayObject(m_DealCreat).m_nSoftVersionDateEx = 0) then begin
// VER19990SendDelDealItem(UserItem);
// end else begin
// VER19990SendDelDealItem(UserItem);
// end;
m_DealCreat.m_DealLastTick := GetTickCount();
m_DealLastTick := GetTickCount();
end;
end;
{获取玩家包裹物品数据}
procedure TPlayObject.ClientQueryBagItems;
begin
if Assigned(m_VersionManage) then
try
m_VersionManage.OnQueryBagItems(Self);
except
MainOutMessage(Format('TPlayObject::OnQueryBagItems SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
if m_boBagSend then
ClientSendBagOrder(); {包裹顺序}
end;
//处理添加包裹物品命令
procedure TPlayObject.SendAddItem(UserItem: pTUserItem);
begin
{兼容客户端}
if UserItem = nil then Exit;
if Assigned(m_VersionManage) then
try
m_VersionManage.OnSendAddItem(Self, UserItem);
except
MainOutMessage(Format('TPlayObject::OnSendAddItem SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
end;
{发送删除的物品}
procedure TPlayObject.SendDelItems(UserItem: pTUserItem);
begin
if UserItem = nil then Exit;
if Assigned(m_VersionManage) then
try
m_VersionManage.OnSendDelItems(Self, UserItem);
except
MainOutMessage(Format('TPlayObject::OnSendDelItems SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
end;
{更新物品数据}
procedure TPlayObject.SendUpdateItem(UserItem: pTUserItem; boDelay: Boolean = True);
begin
if UserItem = nil then Exit;
if Assigned(m_VersionManage) then
try
m_VersionManage.OnSendUpdateItem(Self, UserItem, boDelay);
except
MainOutMessage(Format('TPlayObject::OnSendUpdateItem SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
end;
//查询玩家装备
procedure TPlayObject.ClientQueryUserState(BaseObject: TBaseObject; nX, nY: Integer);
resourcestring
sExceptionMsg = '[Exception] TPlayObject::ClientQueryUserState Code = %d';
var
UserItem : pTUserItem;
Hum : TPlayObject;
nCheckCode : Integer;
begin
nCheckCode := 0;
try
if BaseObject = nil then Exit;
nCheckCode := 1;
if not (BaseObject is TPlayObject) then Exit;
// {只允许查看玩家和心魔的装备}
// if (BaseObject.m_btRaceServer <> RC_PLAYOBJECT) then Exit;
{只允许查看夺宝心魔的装备}
// if (BaseObject.m_btRaceServer = RC_EVIL) and (BaseObject.m_btRaceImg <> 253) then Exit;
//关灯模式
if (m_PEnvir.m_MapFlag.boSECRET and ((m_PEnvir.m_MapFlag.btSECRETRule and SECRET_RULE_DISABLEQUERY) <> 0)) then
begin
SysMsg('该地图不允许查看对手信息', c_Red, t_Hint);
Exit;
end;
if (BaseObject.m_btRaceServer = RC_PLAYOBJECT) then begin
if (TPlayObject(BaseObject).m_boSecretMode) and (not TPlayObject(BaseObject).m_boCheckItem) then begin
SysMsg('对方处于神秘人模式,不允许查看装备信息', c_Red, t_Hint);
Exit;
end;
end;
nCheckCode := 2;
{查看死亡玩家的装备}
if (nX = 0) and (nY = 0) then begin
if (BaseObject <> nil) and (not BaseObject.m_boGhost) then begin
nX := BaseObject.m_nCurrX;
nY := BaseObject.m_nCurrY;
end;
end;
nCheckCode := 3;
if (not CretInNear10XY(BaseObject, nX, nY)) then Exit;
nCheckCode := 4;
if Assigned(m_VersionManage) then
try
m_VersionManage.OnQueryUserState(Self, BaseObject);
except
MainOutMessage(Format('TPlayObject::OnQueryUserState SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
nCheckCode := 5;
if (BaseObject.m_btRaceServer = RC_PLAYOBJECT) then begin
with TPlayObject(BaseObject) do
begin
//发送骑站数据
nCheckCode := 6;
if m_boRideOn then begin
if m_boPneuma and (m_PneumaObject <> nil) then begin
Hum := TPlayObject(BaseObject.m_PneumaObject); //元神骑乘
Hum.GetUserItemByMakeIndex(Hum.m_PetInfo[3].nMakeIndex, UserItem);
end else begin
GetUserItemByMakeIndex(m_PetInfo[2].nMakeIndex, UserItem); //本体骑乘
end;
Self.SendPetAttribute(TPlayObject(BaseObject), 1, UserItem);
end;
nCheckCode := 7;
//发送魂佑灵兽信息
if m_boBeast then begin
GetUserItemByMakeIndex(m_PetInfo[5].nMakeIndex, UserItem);
Self.SendPetAttribute(TPlayObject(BaseObject), 0, UserItem);
end;
end;
nCheckCode := 8;
nCheckCode := 9;
SendDemonDanInfo(0, BaseObject);
SendConstellationStarLv(BaseObject);
nCheckCode := 10;
{脚本触发}
m_sScriptParam[0] := BaseObject.m_sCharName;
ExecuteScript(g_FunctionNPC, '@查询玩家装备');
end;
except
on E: Exception do begin
MainOutMessage(Format(sExceptionMsg, [nCheckCode]));
MainOutMessage(E.Message);
end;
end;
end;
{发送宠物包裹数据}
procedure TPlayObject.SendPetBagItems;
begin
SendDefMessage(SM_PETBAGSIZE, Integer(Self), 0, m_nPetShopSize, m_nPetBagSize, '');
if Assigned(m_VersionManage) then
try
m_VersionManage.OnSendPetBagItems(Self);
except
MainOutMessage(Format('TPlayObject::OnSendPetBagItems SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
end;
procedure TPlayObject.SendAddPetItem(UserItem: pTUserItem);
begin
if Assigned(m_VersionManage) then
try
m_VersionManage.OnSendAddPetItem(Self, UserItem);
except
MainOutMessage(Format('TPlayObject::OnSendAddPetItem SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
end;
{发送仓库物品列表}
procedure TPlayObject.SendSaveItemList(nBaseObject: Integer; boFast: Boolean);
begin
if Assigned(m_VersionManage) then
try
m_VersionManage.OnSendSaveItemList(Self, nBaseObject, boFast);
except
MainOutMessage(Format('TPlayObject::OnSendSaveItemList SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
end;
//发送身上物品
procedure TPlayObject.SendUseitems;
begin
if Assigned(m_VersionManage) then
try
m_VersionManage.OnSendUseitems(Self);
except
MainOutMessage(Format('TPlayObject::OnSendUseitems SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
end;
//发送内视装备物品
procedure TPlayObject.SendEntopticItems;
begin
if Assigned(m_VersionManage) then
try
m_VersionManage.OnSendEntopticItems(Self);
except
MainOutMessage(Format('TPlayObject::OnSendEntopticItems SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
end;
//发送我的摊位物品列表给某个玩家
procedure TPlayObject.SendShopItems(BaseObject: TBaseObject; opcode: word);
var
PlayObject : TPlayObject;
begin
if not (BaseObject is TPlayObject) then Exit;
PlayObject := BaseObject as TPlayObject;
if Assigned(PlayObject.m_VersionManage) then
try
PlayObject.m_VersionManage.OnSendShopItems(Self, PlayObject, opcode);
except
MainOutMessage(Format('TPlayObject::OnSendShopItems SoftVersionDate:%d', [PlayObject.m_VersionManage.SoftVersionDate]));
end;
// if (PlayObject.m_nSoftVersionDateEx = 0) then begin
// VER19990SendShopItems(PlayObject,opcode);
// end else begin
// VER19990SendShopItems(PlayObject,opcode);
// end;
end;
procedure TPlayObject.SendTigerItem();
begin
if m_boPneuma and not m_boInosculatePneuma then Exit;
if Assigned(m_VersionManage) then
try
m_VersionManage.OnSendTigerItem(Self);
except
MainOutMessage(Format('TPlayObject::OnSendTigerItem SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
end;
///////兼容客户端////////END/////////////////////
procedure TPlayObject.SendAddMagic(UserMagic: pTUserMagic); //004D12F4
var
ClientMagic : TClientMagic;
pMagicOrder : string;
begin
UserMagic.GetClientMagic(@ClientMagic);
m_defMsg := MakeDefaultMsg(SM_ADDMAGIC, 0, 0, 0, 1);
SendSocket(@m_defMsg, EnCodeBuffer(@ClientMagic, SizeOf(TClientMagic)));
//处理铁血神技技能顺序
{ if UserMagic.GetMagIdx in [SKILL_220..SKILL_235] then begin
pMagicOrder := ReverseString(m_MagicOrder);
if UserMagic.GetMagIdx in [SKILL_220, SKILL_224, SKILL_228, SKILL_232] then
pMagicOrder := pMagicOrder + '1';
if UserMagic.GetMagIdx in [SKILL_221, SKILL_225, SKILL_229, SKILL_233] then
pMagicOrder := pMagicOrder + '2';
if UserMagic.GetMagIdx in [SKILL_222, SKILL_226, SKILL_230, SKILL_234] then
pMagicOrder := pMagicOrder + '3';
if UserMagic.GetMagIdx in [SKILL_223, SKILL_227, SKILL_231, SKILL_235] then
pMagicOrder := pMagicOrder + '4';
m_MagicOrder := ReverseString(pMagicOrder);
SendDefMessage(1650, 0, HexToInt('$' + m_MagicOrder), 220, 0, '');
end;
}
end;
//发送给客户端调整点数值
procedure TPlayObject.SendAdjustBonus;
var
sSENDMSG : string;
begin
m_defMsg := MakeDefaultMsg(SM_ADJUST_BONUS, m_nBonusPoint, 0, 0, 0);
sSENDMSG := '';
case m_btJob of
0: sSENDMSG := EnCodeBuffer(@g_Config.BonusAbilofWarr, SizeOf(TNakedAbility))
+ '/' +
EnCodeBuffer(@m_BonusAbil, SizeOf(TNakedAbility)) + '/' +
EnCodeBuffer(@g_Config.NakedAbilofWarr, SizeOf(TNakedAbility));
1: sSENDMSG := EnCodeBuffer(@g_Config.BonusAbilofWizard,
SizeOf(TNakedAbility)) + '/' +
EnCodeBuffer(@m_BonusAbil, SizeOf(TNakedAbility)) + '/' +
EnCodeBuffer(@g_Config.NakedAbilofWizard, SizeOf(TNakedAbility));
2: sSENDMSG := EnCodeBuffer(@g_Config.BonusAbilofTaos, SizeOf(TNakedAbility))
+ '/' +
EnCodeBuffer(@m_BonusAbil, SizeOf(TNakedAbility)) + '/' +
EnCodeBuffer(@g_Config.NakedAbilofTaos, SizeOf(TNakedAbility));
end;
SendSocket(@m_defMsg, sSENDMSG);
end;
procedure TPlayObject.SendChangeGuildName;
begin
if m_MyGuild <> nil then begin
SendDefMessage(SM_CHANGEGUILDNAME, 0, TGuild(m_MyGuild).btGuildFlag, 0, 0, TGuild(m_MyGuild).sGuildName + '/' + m_sGuildRankName);
end else begin
SendDefMessage(SM_CHANGEGUILDNAME, 0, 0, 0, 0, '');
end;
end;
//直接发送消息(消息已经处理完毕)
procedure TPlayObject.SendDefMessage(wIdent: word; nRecog: Integer; nParam,
nTag, nSeries: word; sMsg: string; boEn: Boolean); //004CAD6C
begin
m_defMsg := MakeDefaultMsg(wIdent, nRecog, nParam, nTag, nSeries);
if sMsg <> '' then
begin
if boEn then
SendSocket(@m_defMsg, sMsg)
else
SendSocket(@m_defMsg, EnCodeString(sMsg));
end
else
SendSocket(@m_defMsg, '');
end;
procedure TPlayObject.SendDelItemList(ItemList: TStringList);
var
i : Integer;
s10 : string;
begin
s10 := '';
for i := 0 to ItemList.Count - 1 do begin
s10 := s10 + ItemList.Strings[i] + '/' +
IntToStr(Integer(ItemList.Objects[i])) + '/';
end;
m_defMsg := MakeDefaultMsg(SM_DELITEMS, 0, 0, 0, ItemList.Count);
SendSocket(@m_defMsg, EnCodeString(s10));
SendDelayMsg(Self, CM_QUERYBAGITEMS, 0, 0, 0, 0, '', 300);
end;
procedure TPlayObject.SendDelMagic(UserMagic: pTUserMagic);
var
pMagicOrder : string;
i, nMaxLen : Integer;
MyMagic : pTUserMagic;
begin
//处理铁血神技技能顺序
m_defMsg := MakeDefaultMsg(SM_DELMAGIC, UserMagic.GetMagIdx, 0, 0, 1);
SendSocket(@m_defMsg, '')
end;
//装载并发送好友列表
procedure TPlayObject.SendFiendList(const b: ShortInt = -1);
var
i : Integer;
sMsg, sAmbit : string;
ClanAmbit : pTClanAmbit;
begin
//发送好友名单
if (b = -1) or (b = 0) then begin
sMsg := '';
for i := 0 to m_FriendsList.Count - 1 do begin
sMsg := sMsg + m_FriendsList[i] + '/';
end;
if Length(sMsg) > 0 then
SendDefMessage(SM_SENDFRIENDS, 0, 0, 0, 0, sMsg);
end;
//发送师傅名单
if (b = -1) or (b = 1) then begin
if (Length(m_sMasterName[1]) > 0) and (not m_boMaster) then
SendDefMessage(SM_SENDFRIENDS, 0, 1, 0, 0, m_sMasterName[1]);
end;
//发送徒弟名单
if (b = -1) or (b = 2) then begin
sMsg := '';
if m_boMaster then begin
for i := 1 to 3 do begin
if m_sMasterName[i] <> '' then
sMsg := sMsg + m_sMasterName[i] + '/';
end;
SendDefMessage(SM_SENDFRIENDS, 0, 2, 0, 0, sMsg);
end;
end;
//发送配偶名单
if (b = -1) or (b = 3) then begin
if (Length(m_sDearName) > 0) then
SendDefMessage(SM_SENDFRIENDS, 0, 3, 0, 0, m_sDearName);
end;
//发送宗族名单
if (b = -1) or (b = 4) then begin
sMsg := '';
if (m_MyClan <> nil) then begin
with TClan(m_MyClan) do begin
sMsg := Format('%s/%s/%d,%d,%d,%d/', [m_sClanName, ChiefName, btClanKind, nMaxMember, nActivity, btTaskDifficuty]);
for i := 0 to m_MemberList.Count - 1 do begin
ClanAmbit := pTClanAmbit(m_MemberList.GetValues(m_MemberList.Keys[i]));
if (ClanAmbit.Ambit > 2) then begin
if (ClanAmbit.Ambit mod 2) = 0 then
sAmbit := '2'
else
sAmbit := '1';
end else
sAmbit := '0';
sMsg := Format('%s%s,%d,%d/%s/', [sMsg, sAmbit, m_nHiContribution, m_nCurContribution, m_MemberList.Keys[i]])
end;
end;
SendDefMessage(SM_SENDFRIENDS, 0, 4, 0, 0, sMsg);
end;
end;
end;
procedure TPlayObject.SendGroupMembers;
var
i : Integer;
PlayObject : TPlayObject;
sSENDMSG : string;
begin
sSENDMSG := '';
for i := 0 to m_GroupMembers.Count - 1 do begin
PlayObject := TPlayObject(m_GroupMembers.Objects[i]);
sSENDMSG := sSENDMSG + PlayObject.m_sCharName + '/';
end;
for i := 0 to m_GroupMembers.Count - 1 do begin
PlayObject := TPlayObject(m_GroupMembers.Objects[i]);
PlayObject.SendDefMessage(SM_GROUPMEMBERS, 0, 0, 0, 0, sSENDMSG);
end;
end;
procedure TPlayObject.SendGuildTowerInfo();
var
sGuildJobMsg : string;
i, ii, j, nTowerGrade : Integer;
nPermission : Integer;
resourcestring
sOfficialMsg = '%d/%d/%d/%d/%d/%s/';
begin
if m_MyGuild = nil then Exit;
try
nTowerGrade := _MIN(10, TGuild(m_MyGuild).btTowerGrade);
if nTowerGrade > 0 then begin
sGuildJobMsg := TGuild(m_MyGuild).GetChiefName + '/';
for i := 1 to 10 do begin
sGuildJobMsg := sGuildJobMsg + Format(sOfficialMsg, [i, nGuildOfficialCount[nTowerGrade][i], nGuildOfficialCountMax[i], btGuildOfficialCrony[i], nGuildOfficialPrice[i], sGuildOfficial[i]]);
end;
if (m_nGuildRankNo in [1..10]) then nPermission := nGuildOfficialPermission[m_nGuildRankNo] else nPermission := 1024;
g_LargePacketManage.Init;
g_LargePacketManage.WriteBuffer(m_GuildTowerInfo, SizeOf(TGuildTowerInfo));
g_LargePacketManage.WriteString(sGuildJobMsg);
m_defMsg := MakeDefaultMsg(SM_GUILDOFFICIAL, m_nGuildGold, nTowerGrade, nPermission, 0);
SendSocket(@m_defMsg, g_LargePacketManage.GetMsg);
end;
except
on E: Exception do begin
MainOutMessage('procedure TPlayObject.SendGuildTowerInfo');
MainOutMessage(E.Message);
end;
end;
end;
procedure TPlayObject.SendGuildTowerRes();
var
Guild : TGuild;
TowerRes : TGuildTowerRes;
begin
if m_MyGuild = nil then Exit;
Guild := TGuild(m_MyGuild);
TowerRes := Guild.GuildTowerRes;
TowerRes.nOreMax := 3000;
TowerRes.nGemMax := 3000;
TowerRes.nWoodMax := 3000;
TowerRes.nBarMax := 3000;
TowerRes.nRockMax := 3000;
m_defMsg := MakeDefaultMsg(SM_GUILDTOWER, Guild.dwGuildGold, 1, 0, 0);
SendSocket(@m_defMsg, EnCodeBuffer(@TowerRes, SizeOf(TGuildTowerRes)));
end;
procedure TPlayObject.SendLogon;
var
MessageBodyL : TMessageBodyL;
nRecog, nMaxDamage : Integer;
begin
m_defMsg := MakeDefaultMsg(SM_NEWMAP, Integer(Self), m_nCurrX, m_nCurrY, 10240);
SendSocket(@m_defMsg, EnCodeString(m_PEnvir.m_MapFlag.sClientMapName));
MessageBodyL.nFeature := GetFeatureToLong(Self);
MessageBodyL.nCharStatus := m_nCharStatus;
if m_boAllowGroup then
MessageBodyL.nFlag := MakeLong(MakeWord(1, 0), GetGender)
else
MessageBodyL.nFlag := MakeLong(0, GetGender);
MessageBodyL.nDressShape := m_nDressShape;
m_defMsg := MakeDefaultMsg(SM_LOGON, Integer(Self), m_nCurrX, m_nCurrY, MakeWord(m_btDirection, m_btGender));
SendSocket(@m_defMsg, EnCodeBuffer(@MessageBodyL, SizeOf(TMessageBodyL)));
end;
procedure TPlayObject.SendMagic_LvExp_Msg(const UserMagic: pTUserMagic; dwDelay: LongWord);
begin
Assert(UserMagic <> nil, 'TPlayObject::SendMagic_LvExp_Msg');
if UserMagic.GetMagIdx = 184 then begin
//终极连击 需要发送添加的技能的消息来更新最高连击点...
SendAddMagic(UserMagic);
Exit;
end;
SendDelayMsg(Self, RM_MAGIC_LVEXP,
0,
UserMagic.GetMagIdx,
UserMagic.btLevel,
UserMagic.nTranPoint,
'',
dwDelay);
end;
//地图描述命令的处理
procedure TPlayObject.SendMapDescription;
var
nMUSICID : Integer;
sMapDesc : string;
begin
nMUSICID := 0;
if m_PEnvir.m_MapFlag.boMUSIC then nMUSICID := m_PEnvir.m_MapFlag.nMUSICID;
if m_sMapNewDesc <> '' then
sMapDesc := m_sMapNewDesc
else
sMapDesc := m_PEnvir.m_sMapDesc;
if m_boFlyer then
SendDefMessage(SM_MAPDESCRIPTION, nMUSICID, 0, 0, 0, sMapDesc + '上空')
else
SendDefMessage(SM_MAPDESCRIPTION, nMUSICID, 0, 0, 0, sMapDesc)
end;
//上线时,发送我的好友到客户端,同时向在线好友发送我的状态
//state=0 表示下线或隐身
procedure TPlayObject.SendMeOnlineState(State: byte; b: ShortInt = -1);
var
i : Integer;
sOtherName : string;
Hum : TPlayObject;
begin
if (b = -1) or (b = 0) then begin
for i := 0 to m_FriendsList.Count - 1 do begin
//检查对方的状态
sOtherName := m_FriendsList[i];
Hum := UserEngine.GetPlayObject(sOtherName);
//对方在线
if (Hum <> nil) and (not Hum.m_boDeath) and (not Hum.m_boGhost) then begin
if (Hum.m_MyGuild <> nil) then
sOtherName := sOtherName + Chr($00) + TGuild(Hum.m_MyGuild).sGuildName;
if State <> 0 then
SendDefMessage(SM_PLAYERONLINE, State, 0, MakeWord(Hum.m_btAmbitLevel, Hum.m_btAmbitKind), MakeWord(Hum.m_WAbil.level, Hum.m_btJob), sOtherName);
//向对方发送好友上/下线消息
sOtherName := m_sCharName;
if (m_MyGuild <> nil) then
sOtherName := sOtherName + Chr($00) + TGuild(m_MyGuild).sGuildName;
Hum.SendDefMessage(SM_PLAYERONLINE, State, 0, MakeWord(m_btAmbitLevel, m_btAmbitKind), MakeWord(m_WAbil.level, m_btJob), sOtherName);
end;
end;
end;
//发送师傅上线通知
if (b = -1) or (b = 1) then begin
if m_boMaster then begin
for i := 1 to 3 do begin
if m_sMasterName[i] = '' then Continue;
sOtherName := m_sMasterName[i];
Hum := UserEngine.GetPlayObject(sOtherName);
if (Hum <> nil) and (not Hum.m_boDeath) and (not Hum.m_boGhost) then begin
if (Hum.m_MyGuild <> nil) then
sOtherName := sOtherName + Chr($00) + TGuild(Hum.m_MyGuild).sGuildName;
if State <> 0 then //发送给自己 师傅在线
SendDefMessage(SM_PLAYERONLINE, State, 2, MakeWord(Hum.m_btAmbitLevel, Hum.m_btAmbitKind), MakeWord(Hum.m_WAbil.level, Hum.m_btJob), sOtherName);
//向对方发送上线消息 //发送给师傅,徒弟上线
sOtherName := m_sCharName;
if (m_MyGuild <> nil) then
sOtherName := sOtherName + Chr($00) + TGuild(m_MyGuild).sGuildName;
Hum.SendDefMessage(SM_PLAYERONLINE, State, 1, MakeWord(m_btAmbitLevel, m_btAmbitKind), MakeWord(m_WAbil.level, m_btJob), sOtherName);
end;
end;
end;
end;
//发送徒弟上线通知
if (b = -1) or (b = 2) then begin
if not m_boMaster and (m_sMasterName[1] <> '') then begin
sOtherName := m_sMasterName[1];
Hum := UserEngine.GetPlayObject(sOtherName);
if (Hum <> nil) and (not Hum.m_boDeath) and (not Hum.m_boGhost) then begin
if (Hum.m_MyGuild <> nil) then
sOtherName := sOtherName + Chr($00) + TGuild(Hum.m_MyGuild).sGuildName;
if State <> 0 then //发送给自己 师傅在线
SendDefMessage(SM_PLAYERONLINE, State, 1, MakeWord(Hum.m_btAmbitLevel, Hum.m_btAmbitKind), MakeWord(Hum.m_WAbil.level, Hum.m_btJob), sOtherName);
//向对方发送上线消息 //发送给师傅,徒弟上线
sOtherName := m_sCharName;
if (m_MyGuild <> nil) then
sOtherName := sOtherName + Chr($00) + TGuild(m_MyGuild).sGuildName;
Hum.SendDefMessage(SM_PLAYERONLINE, State, 2, MakeWord(m_btAmbitLevel, m_btAmbitKind), MakeWord(m_WAbil.level, m_btJob), sOtherName);
end;
end;
end;
//发送夫妻上线通知
if (b = -1) or (b = 3) then begin
if (m_DearHuman <> nil) and (not m_DearHuman.m_boDeath) and (not m_DearHuman.m_boGhost) then begin
sOtherName := m_sDearName;
if (m_DearHuman.m_MyGuild <> nil) then
sOtherName := sOtherName + Chr($00) + TGuild(m_DearHuman.m_MyGuild).sGuildName;
if State <> 0 then
SendDefMessage(SM_PLAYERONLINE, State, 3, MakeWord(m_DearHuman.m_btAmbitLevel, m_DearHuman.m_btAmbitKind), MakeWord(m_DearHuman.m_WAbil.level, m_DearHuman.m_btJob), sOtherName);
//向对方发送上线消息
sOtherName := m_sCharName;
if (m_MyGuild <> nil) then
sOtherName := sOtherName + Chr($00) + TGuild(m_MyGuild).sGuildName;
m_DearHuman.SendDefMessage(SM_PLAYERONLINE, State, 3, MakeWord(m_btAmbitLevel, m_btAmbitKind), MakeWord(m_WAbil.level, m_btJob), sOtherName);
end;
end;
//宗族消息
if (b = -1) or (b = 4) then begin
if (m_MyClan <> nil) then begin
for i := 0 to TClan(m_MyClan).m_MemberList.Count - 1 do begin
sOtherName := TClan(m_MyClan).m_MemberList.Keys[i];
Hum := UserEngine.GetPlayObject(sOtherName);
//对方在线
if (Hum <> nil) and (not Hum.m_boDeath) and (not Hum.m_boGhost) then begin
if (Hum.m_MyGuild <> nil) then
sOtherName := sOtherName + Chr($00) + TGuild(Hum.m_MyGuild).sGuildName;
if State <> 0 then
SendDefMessage(SM_PLAYERONLINE, State, 4, MakeWord(Hum.m_btAmbitLevel, Hum.m_btAmbitKind), MakeWord(Hum.m_WAbil.level, Hum.m_btJob), sOtherName);
//向对方发送好友上/下线消息
sOtherName := m_sCharName;
if (m_MyGuild <> nil) then
sOtherName := sOtherName + Chr($00) + TGuild(m_MyGuild).sGuildName;
Hum.SendDefMessage(SM_PLAYERONLINE, State, 4, MakeWord(m_btAmbitLevel, m_btAmbitKind), MakeWord(m_WAbil.level, m_btJob), sOtherName);
end;
end;
end;
end;
end;
procedure TPlayObject.SendNearbyGuildMemberList;
var
i : Integer;
Str : string;
BaseObjectList : TList;
BaseObject : TBaseObject;
begin
Str := '';
BaseObjectList := TList.Create;
m_PEnvir.GetRangeBaseObject(m_nCurrX, m_nCurrY, 10, True, BaseObjectList);
for i := 0 to BaseObjectList.Count - 1 do begin
BaseObject := TBaseObject(BaseObjectList.Items[i]);
if (BaseObject.m_btRaceServer <> RC_PLAYOBJECT) then Continue;
if (BaseObject.m_boPneuma) or (BaseObject = Self) or (BaseObject.m_MyGuild <> m_MyGuild) then Continue;
Str := Str + BaseObject.m_sCharName + '/' + IntToStr(BaseObject.m_nGuildGold) + '/';
end;
BaseObjectList.free;
if Str <> '' then begin
SendDefMessage(SM_GUILDOFFICIALPLAYER, 0, 0, 0, 0, Str);
end;
end;
//极品阁
procedure TPlayObject.SendNonSuchPavilion(nSerial: Integer);
var
G : TGuild;
i, nCount : Integer;
UserItem : pTUserItem;
boView : Boolean;
begin
if m_MyGuild = nil then Exit;
G := TGuild(m_MyGuild);
if not G.boTowerStatus then begin
SendDefMessage(SM_TREASUREPAVILION, 0, 4, 0, 0, '通灵塔资源不足被封闭,无法进入极品阁。');
Exit;
end;
try
boView := False;
nCount := Length(G.m_TreasurePavilion);
for i := 0 to nCount - 1 do begin
if G.m_TreasurePavilion[i].btPos = nSerial then begin
boView := (G.m_TreasurePavilion[i].btState = 4);
Break;
end;
end;
m_boInNonSuchPavilion := False;
if not boView then begin
GetUserItemByName('灵皓石', UserItem);
if UserItem = nil then begin
SendDefMessage(SM_TREASUREPAVILION, 0, 4, 0, 0, '您包裹内没有灵皓石,请到商城购买。');
Exit;
end else begin
m_boInNonSuchPavilion := True;
SendDelItems(UserItem);
DelBagItem(UserItem.MakeIndex, '灵皓石');
WeightChanged;
m_sScriptParam[0] := IntToStr(nSerial);
ExecuteScript(g_GuildTowerNPC, '@进入极品阁');
end;
end;
if Assigned(m_VersionManage) then
try
m_VersionManage.OnSendNonSuchPavilion(Self, G);
except
MainOutMessage(Format('TPlayObject::OnSendNonSuchPavilion SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
except
on E: Exception do begin
MainOutMessage('procedure TPlayObject.SendTreasurePavilion');
MainOutMessage(E.Message);
end;
end;
end;
//发送公告
procedure TPlayObject.SendNotice; //004DA490
resourcestring
sExceptionMsg = '[Exception] TPlayObject::SendNotice Code=%d';
type
TREC = packed record
n: byte;
m: word;
end;
var
LoadList : TStringList;
sNoticesg : string;
Rec : array[0..5] of TREC;
i, nCode, nType : Integer;
nCheckCode : Integer;
MessageBodyW : TMessageBodyW;
begin
{$IF COUNTRYSYSTEM = 1}
//根据官职等级获得官职名称
if m_boPneuma and (m_PneumaObject <> nil) then begin
m_btCountry := m_PneumaObject.m_btCountry;
end;
if (m_btCountry > 0) and (g_OffPosList.Count > 0) then begin
if m_btOfficialPos >= g_OffPosList.Count then
m_sOffName := g_OffPosList[g_OffPosList.Count - 1]
else
m_sOffName := g_OffPosList[m_btOfficialPos];
end;
{$IFEND}
nCheckCode := 0;
try
SendDefMessage(1667, -1, 0, 0, 0, ''); //未知
{未知}
QuerySubAbility();
if g_Config.boClassicServer then begin
SendDefMessage(SM_SRVVERSION, Integer(Self), 0, 0, 0, m_VersionManage.ServerVerSion);
end else begin
if g_Config.boTimeBackServer then
SendDefMessage(SM_SRVVERSION, Integer(Self), 256, 2, 0, m_VersionManage.ServerVerSion);
if g_Config.boMagicCityServer then
SendDefMessage(SM_SRVVERSION, Integer(Self), 256, 5, 0, m_VersionManage.ServerVerSion);
{$IF DEMONSERVER = 1}
if g_Config.boNightMareServer then
SendDefMessage(SM_SRVVERSION, Integer(Self), 256, 5, 2, m_VersionManage.ServerVerSion);
{$IFEND}
if g_Config.botimeServer then
SendDefMessage(SM_SRVVERSION, Integer(Self), 256, 7, 0, m_VersionManage.ServerVerSion); //时长区
end;
FillChar(Rec, SizeOf(TREC) * 6, 0);
Rec[0].n := $0A;
Rec[1].n := $19;
Rec[2].n := $2D;
Rec[3].n := $4B;
Rec[4].n := $96;
Rec[5].n := $FA;
m_defMsg := MakeDefaultMsg(1840, Integer(Self), 3, 0, 6);
SendSocket(@m_defMsg, EnCodeBuffer(@Rec[0], SizeOf(TREC) * 6));
SendDefMessage(SM_1809, 0, 0, 0, 2, ''); //未知
nCheckCode := 1;
if m_boPneuma then begin
SendDefMessage(SM_BAGSIZE, Integer(Self), 0, m_nBagSize, 0, '');
end;
nCheckCode := 2;
SendDefMessage(1096, 0, 1, 0, 0, '');
if not m_boPneuma then begin
SendDefMessage(SM_PERSONALSIGN, Integer(Self), 1, 0, m_wPersonalCode, m_sPersonalSign);
SendDefMessage(SM_PERSONALSIGN, Integer(Self), 2, 0, 0, m_sTmpRank);
end else
SendDefMessage(SM_TASKINFO, 0, 0, 0, 0, '');
nCheckCode := 5;
m_nCharStatus := GetCharStatus();
nCheckCode := 6;
m_nMagicStatus := GetMagicStatus();
nCheckCode := 7;
//发送地图信息
m_defMsg := MakeDefaultMsg(SM_NEWMAP, Integer(Self), m_nCurrX, m_nCurrY, 10240); // nObjCount);
SendSocket(@m_defMsg, EnCodeString(m_PEnvir.m_MapFlag.sClientMapName));
nCheckCode := 9;
SendMapDescription;
nCheckCode := 10;
//发送名字
SendDefMessage(SM_9609, Integer(Self), 0, 0, 0, m_sCharName);
m_defMsg := MakeDefaultMsg(SM_USERNAME, Integer(Self), GetCharColor(Self), 0, 0);
SendSocket(@m_defMsg, EnCodeString(GetShowName));
nCheckCode := 11;
//发送公告信息
ExecuteScript(g_FunctionNPC, '@Notice');
nCheckCode := 12;
if not m_boSendNotice then begin
nCheckCode := 14;
LoadList := TStringList.Create;
Noticeanager.GetNoticesg('Notice', LoadList);
sNoticesg := '';
for i := 0 to LoadList.Count - 1 do begin
sNoticesg := sNoticesg + LoadList.Strings[i] + #$20#$1B;
end;
LoadList.free;
nCheckCode := 15;
if g_FunctionNPC <> nil then
sNoticesg := g_FunctionNPC.GetLineVariableText(Self, sNoticesg);
SendDefMessage(SM_SENDNOTICE, Integer(Self), 257, 38, 0, sNoticesg);
m_boSendNotice := True;
end;
ExecuteScript(g_ManageNPC, '@_历_活跃_HOME');
if (g_Config.boMagicCityServer){$IF DEMONSERVER = 1} or (g_Config.boNightMareServer){$IFEND} then begin
ExecuteScript(g_ManageNpc, '@_活力值_MAIN');
end;
if g_Config.boTimeBackServer then begin
SendDefMessage(SM_SRVVERSION, Integer(Self), 256, 2, 0, m_VersionManage.ServerVerSion);
end else if g_Config.boMagicCityServer then begin
SendDefMessage(SM_SRVVERSION, Integer(Self), 256, 5, 0, m_VersionManage.ServerVerSion);
{$IF DEMONSERVER = 1}
end else if g_Config.boNightMareServer then begin
SendDefMessage(SM_SRVVERSION, Integer(Self), 256, 5, 2, m_VersionManage.ServerVerSion);
{$IFEND}
end else if g_Config.botimeServer then begin
SendDefMessage(SM_SRVVERSION, Integer(Self), 256, 7, 0, m_VersionManage.ServerVerSion); //时长区
end else begin
SendDefMessage(SM_SRVVERSION, Integer(Self), 0, 0, 0, m_VersionManage.ServerVerSion);
//发送练体信息
end;
//发送宗族徽记
if (m_ClanInsignia.sClanName <> '') and (m_ClanInsignia.sGuildName <> '') and (m_ClanInsignia.sInsignia <> '') then begin
g_PacketManage3.Init;
g_PacketManage3.WriteInteger(1);
g_PacketManage3.WriteInteger(Integer(Self));
g_PacketManage3.WriteString(m_ClanInsignia.sClanName, SizeOf(m_ClanInsignia.sClanName));
g_PacketManage3.WriteByte(0);
g_PacketManage3.WriteString(m_ClanInsignia.sGuildName, SizeOf(m_ClanInsignia.sGuildName));
g_PacketManage3.WriteByte(0);
g_PacketManage3.WriteString(m_ClanInsignia.sInsignia, SizeOf(m_ClanInsignia.sInsignia));
g_PacketManage3.WriteByte(0);
g_PacketManage3.WriteInteger(m_ClanInsignia.Time);
SendDefMessage(2119, Integer(Self), 0, 0, 0, g_PacketManage3.GetMsg(), True);
end;
i := GetFeatureToLong(Self);
m_defMsg := MakeDefaultMsg(SM_FEATURECHANGED, Integer(Self), LoWord(i), HiWord(i), GetGender);
SendSocket(@m_defMsg, GetFeatureChangedMsg());
nCheckCode := 18;
nCode := 0;
nType := 0;
if not g_Config.boClassicServer then begin //修为系统
if g_Config.boClientRedPacket then
nCode := nCode + 32;
if g_Config.boClientPreferential then
nType := 8;
if g_Config.boClientBackUserExp then
nType := nType + 1;
SendDefMessage(SM_816, nType, 0, MakeWord(15, nCode), 0, '');
end else begin
SendDefMessage(SM_816, 0, 1, 15, 0, '');
end;
if g_Config.boClientNewCelebration then begin
g_PacketManage3.Init;
g_PacketManage3.WriteInteger(1);
g_PacketManage3.WriteInteger($0F);
g_PacketManage3.WriteInteger(1);
SendDefMessage(2193, Integer(Self), 0, 0, 0, g_PacketManage3.GetMsg, True);
end;
if g_RedPacketList.Count > 0 then begin //发送红包信息
for I := 0 to g_RedPacketList.Count - 1 do
SendRedPacketWindow(I);
end;
if not m_boPneuma then begin
//发送任务信息
SendTaskList;
//发送天元心法属性
ClientQueryMentalAbilitys(Self);
//发送仙官信息
SendCentsOfficerInfo();
//元气值
SendDefMessage(SM_VITALITY, Integer(Self), m_wVitaLity, m_Abil.wMaxVitaLity, 0, '');
//发送宗族信息
SendFiendList(4);
end;
except
on E: Exception do begin
MainOutMessage(Format(sExceptionMsg, [nCheckCode]));
MainOutMessage(E.Message);
end;
end;
end;
procedure TPlayObject.SendPetInfo(State: byte);
var
i, nExp : Integer;
PetInfo : TPetInfo;
UserItem : pTUserItem;
StdItem : pTStdItem;
btType, btReLive : byte;
begin
FillChar(PetInfo, SizeOf(TPetInfo), #0);
case State of
1: begin //刚放出
PetInfo.nMakeIndex := m_PetInfo[0].nMakeIndex;
PetInfo.sCharName := m_PetInfo[0].sCharName;
btType := m_PetInfo[0].btType;
btReLive := m_PetInfo[0].btReLive;
PetInfo.btLevel := m_PetInfo[0].wLevel;
end;
3: begin //摆摊
PetInfo.nMakeIndex := m_PetInfo[1].nMakeIndex;
PetInfo.sCharName := m_PetInfo[1].sCharName;
btType := m_PetInfo[1].btType;
btReLive := m_PetInfo[1].btReLive;
PetInfo.btLevel := m_PetInfo[1].wLevel;
end;
2, 6: begin //骑乘
PetInfo.nMakeIndex := m_PetInfo[2].nMakeIndex;
PetInfo.sCharName := m_PetInfo[2].sCharName;
btType := m_PetInfo[2].btType;
btReLive := m_PetInfo[2].btReLive;
PetInfo.btLevel := m_PetInfo[2].wLevel;
end;
7, 8: begin //元神骑乘
PetInfo.nMakeIndex := m_PetInfo[3].nMakeIndex;
PetInfo.sCharName := m_PetInfo[3].sCharName;
btType := m_PetInfo[3].btType;
btReLive := m_PetInfo[3].btReLive;
PetInfo.btLevel := m_PetInfo[3].wLevel;
end;
9: begin
PetInfo.nMakeIndex := m_PetInfo[4].nMakeIndex;
PetInfo.sCharName := m_PetInfo[4].sCharName;
btType := m_PetInfo[4].btType;
btReLive := m_PetInfo[4].btReLive;
PetInfo.btLevel := m_PetInfo[4].wLevel;
end;
10: begin //魂佑附体
PetInfo.nMakeIndex := m_PetInfo[5].nMakeIndex;
PetInfo.sCharName := m_PetInfo[5].sCharName;
btType := m_PetInfo[5].btType;
btReLive := m_PetInfo[5].btReLive;
PetInfo.btLevel := m_PetInfo[5].wLevel;
end;
end;
GetUserItemByMakeIndex(PetInfo.nMakeIndex, UserItem);
if (UserItem <> nil) then begin
PetInfo.wExp := UserItem.dwExp;
PetInfo.dwVil := MakeLong(MakeWord(UserItem.btValue[0], UserItem.btValue[1]), MakeWord(UserItem.btValue[2], UserItem.btValue[3]));
PetInfo.dwExp := UserItem.dwExp;
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
PetInfo.btType := MakeWord(UserItem.btValue[9] + StdItem.AniCount * 8, 0);
end;
end;
PetInfo.btKind := UserItem.btValue[8];
PetInfo.bt1 := 9;
PetInfo.dw1 := 0;
PetInfo.btHP := 100;
PetInfo.dw2 := 0;
PetInfo.dw3 := 0;
PetInfo.dw4 := 0;
PetInfo.dw5 := 0;
PetInfo.btState := State; //刚放出是1,骑上是2 摆摊是3 9探宝
if (m_Pet <> nil) then begin
PetInfo.wHP := CalcCent(m_Pet.m_WAbil.dwHP, m_Pet.m_WAbil.dwMaxHP);
PetInfo.wMaxHP := 100;
PetInfo.dwMaxExp := GetPetUpExp(btReLive, PetInfo.btLevel);
end;
PetInfo.bt2 := 0;
PetInfo.dw7 := 0;
PetInfo.bt2 := 0;
PetInfo.int64Exp := UserItem.dwExp;
PetInfo.int64MaxExp := GetPetUpExp(btReLive, PetInfo.btLevel);
m_defMsg := MakeDefaultMsg(34977, 0, 356, 1, 0);
SendSocket(@m_defMsg, EnCodeBuffer(@PetInfo, SizeOf(TPetInfo)));
end;
procedure TPlayObject.SendScriptItemPic(sMsg: string; nParam: Integer);
var
sName : string;
StdItem : pTStdItem;
StdItem80 : TStdItem;
UserItem : TUserItem;
begin
if sMsg = '' then Exit;
sName := Trim(DeCodeString(sMsg));
StdItem := UserEngine.GetStdItem(sName);
if StdItem = nil then Exit;
StdItem80 := StdItem^;
m_defMsg := MakeDefaultMsg(CM_ITEMPIC, Integer(Self), nParam, 0, 0);
FillChar(UserItem, SizeOf(TUserItem), #0);
UserItem.MakeIndex := 1;
UserItem.wIndex := UserEngine.GetStdItemIdx(sName);
UserItem.Dura := StdItem80.DuraMax;
UserItem.DuraMax := StdItem80.DuraMax;
if Assigned(m_VersionManage) then
try
SendSocket(@m_defMsg, m_VersionManage.OnGetClientItemToMsg(Self, @UserItem));
except
MainOutMessage(Format('TPlayObject::OnGetClientItemToMsg SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
end;
//发送消息到RunGate
procedure TPlayObject.SendSocket(DefMsg: pTDefaultMessage; sMsg: string);
//004CAB38
var
MsgHdr : TMsgHeader;
nSendBytes : Integer;
tBuff : PChar;
resourcestring
sExceptionMsg = '[Exception] TPlayObject::SendSocket..';
sFindMsg1 = '玩家名字:%s,发送封包Ident:%d Recog:%d Param:%d Tag:%d Series:%d Msg:%s';
begin
if (m_btRaceServer <> RC_PLAYOBJECT) then Exit;
if m_nSocket = -1 then Exit;
if m_boOfflineGetGamePoint and (DefMsg <> nil) and (DefMsg.Ident <> SM_OUTOFCONNECTION) then Exit;
tBuff := nil;
try
MsgHdr.dwCode := RUNGATECODE;
MsgHdr.nSocket := m_nSocket;
MsgHdr.wGSocketIdx := m_nGSocketIdx;
MsgHdr.wIdent := GM_DATA;
if DefMsg <> nil then begin
if sMsg <> '' then begin
MsgHdr.nLength := Length(sMsg) + SizeOf(TDefaultMessage) + 1;
nSendBytes := MsgHdr.nLength + SizeOf(TMsgHeader);
GetMem(tBuff, nSendBytes + SizeOf(Integer));
Move(nSendBytes, tBuff^, SizeOf(Integer));
Move(MsgHdr, tBuff[SizeOf(Integer)], SizeOf(TMsgHeader));
Move(DefMsg^, tBuff[SizeOf(TMsgHeader) + SizeOf(Integer)], SizeOf(TDefaultMessage));
Move(sMsg[1], tBuff[SizeOf(TDefaultMessage) + SizeOf(TMsgHeader) + SizeOf(Integer)], Length(sMsg) + 1);
end else begin
MsgHdr.nLength := SizeOf(TDefaultMessage);
nSendBytes := MsgHdr.nLength + SizeOf(TMsgHeader);
GetMem(tBuff, nSendBytes + SizeOf(Integer));
Move(nSendBytes, tBuff^, SizeOf(Integer));
Move(MsgHdr, tBuff[SizeOf(Integer)], SizeOf(TMsgHeader));
Move(DefMsg^, tBuff[SizeOf(TMsgHeader) + SizeOf(Integer)], SizeOf(TDefaultMessage));
end;
end else begin
if sMsg <> '' then begin
MsgHdr.nLength := -(Length(sMsg) + 1);
nSendBytes := abs(MsgHdr.nLength) + SizeOf(TMsgHeader);
GetMem(tBuff, nSendBytes + SizeOf(Integer));
Move(nSendBytes, tBuff^, SizeOf(Integer));
Move(MsgHdr, tBuff[SizeOf(Integer)], SizeOf(TMsgHeader));
Move(sMsg[1], tBuff[SizeOf(TMsgHeader) + SizeOf(Integer)], Length(sMsg) + 1);
end;
end;
if not RunSocket.AddGateBuffer(m_nGateIdx, tBuff) then begin
FreeMem(tBuff);
end;
except
MainOutMessage(sExceptionMsg);
end;
end;
procedure TPlayObject.SendTaskList;
var
i, m : Integer;
w : word;
TaskDesc : string;
TaskTitle, Taskaim : string;
pTask : PTTask;
begin
//发送任务列表
SendDefMessage(SM_TASKINFO, 0, 0, 0, 0, Format(sTaskInfo, [m_nMaxTaskCount, m_nAchievement, m_nTaskCount]));
for i := 0 to m_TaskList.Count - 1 do begin
pTask := PTTask(m_TaskList[i]);
if pTask^.Step <= 0 then Continue;
TaskDesc := UserEngine.GetTaskStepInfo(pTask^.TaskID, pTask^.Step, TaskTitle, Taskaim);
TaskDesc := '{Task title=' + TaskTitle + '}' + TaskDesc + '</Task>';
if Taskaim <> '' then
TaskDesc := TaskDesc + '<aim>' + Taskaim + '</aim>';
if g_FunctionNPC <> nil then
TaskDesc := g_FunctionNPC.GetLineVariableText(Self, TaskDesc);
m := UserEngine.GetMainTask(pTask^.TaskID);
w := HiWord(pTask^.Step);
if (w = 0) or (HiByte(w) = 2) then
SendDefMessage(SM_TASKINFO, pTask^.TaskID, 0, 0, MakeWord(1, m), TaskDesc)
else
SendDefMessage(SM_TASKINFO, pTask^.TaskID, LoByte(w), 0, MakeWord(3, m), TaskDesc); //刷新的五色任务
end;
end;
procedure TPlayObject.SendTigerInfo();
var
i, nValue, nFelement : Integer;
begin
if m_btJob = 3 then Exit; //妖士是没有虎王
if (m_TorDDM.Tiger.DB.level > 0) or (m_TorDDM.Tiger.DB.Exp > 0) then begin
g_LargePacketManage.Init;
g_LargePacketManage.WriteWord(m_TorDDM.Tiger.DB.level);
g_LargePacketManage.WriteDWORD(m_TorDDM.Tiger.DB.Exp);
g_LargePacketManage.WriteDWORD(m_TorDDM.Tiger.Abil.MaxExp);
nValue := 0;
nFelement := 1;
for i := 0 to 4 do begin
g_LargePacketManage.WriteByte(m_TorDDM.Tiger.DB.FelementAbil[i]);
if (m_TorDDM.Tiger.DB.FelementAbil[i] > nValue) then begin
nValue := m_TorDDM.Tiger.DB.FelementAbil[i];
nFelement := i + 1;
end;
end;
for i := 0 to 8 do begin
g_LargePacketManage.WriteByte(m_TorDDM.Tiger.DB.SkillLevel[i]); //虎王的9个基本技能
end;
if m_TorDDM.Tiger.DB.Dragon > 0 then begin
for i := 0 to 7 do begin
g_LargePacketManage.WriteByte(m_TorDDM.Tiger.DB.DragonSkillLevel[i]); //八个龙王技能
end;
end;
g_LargePacketManage.WriteByte(nFelement);
g_LargePacketManage.WriteWord(m_TorDDM.Tiger.AddAbil.HP);
g_LargePacketManage.WriteDWORD(m_TorDDM.Tiger.DB.ReCallTick);
//虎王的数据
if (m_TorDDM.Tiger.DB.Dragon = 0) then begin
g_LargePacketManage.WriteWord(m_TorDDM.Tiger.Abil.DC);
g_LargePacketManage.WriteWord(m_TorDDM.Tiger.Abil.DC2);
g_LargePacketManage.WriteWord(m_TorDDM.Tiger.Abil.MC);
g_LargePacketManage.WriteWord(m_TorDDM.Tiger.Abil.MC2);
g_LargePacketManage.WriteWord(m_TorDDM.Tiger.Abil.AC);
g_LargePacketManage.WriteWord(m_TorDDM.Tiger.Abil.AC2);
g_LargePacketManage.WriteWord(m_TorDDM.Tiger.Abil.MAC);
g_LargePacketManage.WriteWord(m_TorDDM.Tiger.Abil.MAC2);
end;
g_LargePacketManage.WriteByte(m_TorDDM.Tiger.Abil.HitPoint);
g_LargePacketManage.WriteByte(m_TorDDM.Tiger.Abil.MagicNicety);
g_LargePacketManage.WriteByte(m_TorDDM.Tiger.Abil.SpeedPoint);
g_LargePacketManage.WriteByte(m_TorDDM.Tiger.Abil.AntiMagic);
if m_TorDDM.Tiger.DB.Dragon > 0 then begin
g_LargePacketManage.WriteWord(0);
g_LargePacketManage.WriteWord(0); //技能虚弱
g_LargePacketManage.WriteWord(0); //技能霸体
g_LargePacketManage.WriteWord(0);
g_LargePacketManage.WriteWord(0);
g_LargePacketManage.WriteWord(m_TorDDM.Tiger.AddAbil.HP);
g_LargePacketManage.WriteWord(0);
m_defMsg := MakeDefaultMsg(SM_DRAGONINFO, 0, 0, 0, 0);
end else begin
g_LargePacketManage.WriteWord(0);
m_defMsg := MakeDefaultMsg(SM_TIGERINFO, 0, 0, 0, 0);
end;
SendSocket(@m_defMsg, g_LargePacketManage.GetMsg);
end;
end;
//珍宝阁
procedure TPlayObject.SendTreasurePavilion;
var
nCount, i, ii : Integer;
G : TGuild;
begin
if m_MyGuild = nil then Exit;
try
G := TGuild(m_MyGuild);
if not G.boTowerStatus then begin
SendDefMessage(SM_TREASUREPAVILION, 0, 4, 0, 0, '通灵塔资源不足被封闭,无法开启珍宝阁。');
Exit;
end;
nCount := Length(G.m_TreasurePavilion);
if nCount > 0 then begin
g_LargePacketManage.Init;
for i := 0 to nCount - 1 do begin
g_LargePacketManage.WriteBuffer(G.m_TreasurePavilion[i], 11);
g_LargePacketManage.WriteString(G.m_TreasurePavilion[i].sUserName);
g_LargePacketManage.WriteString(G.m_TreasurePavilion[i].sItemName);
end;
m_defMsg := MakeDefaultMsg(SM_TREASUREPAVILION, 0, MakeWord(0, nCount), 0, 0);
SendSocket(@m_defMsg, g_LargePacketManage.GetMsg);
end else
SendDefMessage(SM_TREASUREPAVILION, 0, 0, 0, 0, '');
except
on E: Exception do begin
MainOutMessage('procedure TPlayObject.SendTreasurePavilion');
MainOutMessage(E.Message);
end;
end;
end;
//发送本人物所学习了的技能列表
procedure TPlayObject.SendUseMagic();
var
i, nCount : Integer;
UserMagic : pTUserMagic;
ClientMagic : TClientMagic;
oClientMagic : ToClientMagic;
wCode : word;
begin
nCount := 0;
wCode := $FFFF;
g_LargePacketManage.Init;
if m_boInosculatePneuma then begin
//融合元神的技能
for i := 0 to m_MagicList.Count - 1 do begin
UserMagic := pTUserMagic(m_MagicList.Items[i]);
if (UserMagic^.btType in [MAG_AMALGAMATION, MAG_AMALGAMATION_STUDY]) then begin
UserMagic.GetClientMagic(@ClientMagic);
g_LargePacketManage.WriteBuffer(ClientMagic, SizeOf(TClientMagic));
Inc(nCount);
end;
end;
end else begin
for i := 0 to m_MagicList.Count - 1 do begin
UserMagic := pTUserMagic(m_MagicList.Items[i]);
if UserMagic^.btType < MAG_AMALGAMATION then begin
UserMagic.GetClientMagic(@ClientMagic);
if m_nSoftVersionDate < 20090402 then //1978使用
g_LargePacketManage.WriteBuffer(ClientMagic, SizeOf(TOClientMagic)- 7)
else
g_LargePacketManage.WriteBuffer(ClientMagic, SizeOf(TClientMagic));
// MainOutMessage(Format('TPlayObject::SoftVersionDate:%d', [m_nSoftVersionDate]));
Inc(nCount);
end;
if (UserMagic.GetMagIdx in [110..115, 108, 109, 120]) then begin
if UserMagic.btKey = 0 then begin
case UserMagic.GetMagIdx of
120: wCode := wCode xor 1;
108: wCode := wCode xor 2;
109: wCode := wCode xor 4;
110: wCode := wCode xor 8;
111: wCode := wCode xor $10;
112: wCode := wCode xor $20;
113: wCode := wCode xor $40;
114: wCode := wCode xor $80;
115: wCode := wCode xor $100;
end;
end;
end;
end;
end;
if nCount > 0 then begin
m_defMsg := MakeDefaultMsg(SM_SENDMYMAGIC, 0, 0, 0, 0);
SendSocket(@m_defMsg, g_LargePacketManage.GetMsg);
if m_boPneuma then begin
if (m_PneumaObject <> nil) and (m_PneumaObject is TPlayObject) then
TPlayObject(m_PneumaObject).ClientMagic_All_LongWenGang_List(Self);
end else
ClientMagic_All_LongWenGang_List(Self);
end;
SendDefMessage(CM_MAGICSWITCH, Integer(Self), m_nCurrX, m_nCurrY, wCode, '');
end;
procedure TPlayObject.SetScriptLabel(sLabel: string);
begin
m_CanJmpScriptLableList.Clear;
m_CanJmpScriptLableList.Add(sLabel);
end;
//命令 @MapInfo 地图号 X Y
procedure TPlayObject.ShowMapInfo(sMAP, sX, sY: string);
var
Map : TEnvirnoment;
nX, nY : Integer;
MapCellInfo : pTMapCellinfo;
begin
nX := Str_ToInt(sX, 0);
nY := Str_ToInt(sY, 0);
if (sMAP <> '') and (nX >= 0) and (nY >= 0) then begin
Map := g_MapManager.FindMap(sMAP);
if Map <> nil then begin
if Map.GetMapCellInfo(nX, nY, MapCellInfo) then begin
SysMsg('标志: ' + IntToStr(MapCellInfo.chFlag), c_Green, t_Hint);
if MapCellInfo.ObjList <> nil then begin
SysMsg('对象数: ' + IntToStr(MapCellInfo.ObjList.Count), c_Green,
t_Hint);
end;
end else begin
SysMsg('取地图单元信息失败: ' + sMAP, c_Red, t_Hint);
end;
end;
end else begin
SysMsg('请按正确格式输入: ' + g_GameCommand.MAPINFO.sCmd +
' 地图号 X Y', c_Green, t_Hint);
end;
end;
procedure TPlayObject.StartMapEventOfButch();
var
i : Integer;
boGotoLabel : Boolean;
MapEvent : pTMapEvent;
begin
boGotoLabel := False;
for i := 0 to g_MapEventListOfButch.Count - 1 do begin
MapEvent := pTMapEvent(g_MapEventListOfButch.Items[i]);
if MapEvent <> nil then begin
if IsGotoLabel(MapEvent.m_sMapName,
MapEvent.m_nCurrX,
MapEvent.m_nCurrY,
MapEvent.m_nRange,
MapEvent.m_MapFlag.nQuestUnit,
MapEvent.m_MapFlag.boOpen,
MapEvent.m_Condition.sItemName,
'*',
MapEvent.m_Condition.boNeedGroup, MapEvent.m_nRandomCount) then begin
boGotoLabel := True;
Break;
end;
end;
end;
if boGotoLabel and (MapEvent <> nil) then begin
case MapEvent.m_StartScript.nLable of
0: ;
1: begin
ExecuteScript(g_FunctionNPC, MapEvent.m_StartScript.sLable);
end;
end;
end;
end;
procedure TPlayObject.StartMapEventOfDropItem(sItemName: string);
var
i : Integer;
boGotoLabel : Boolean;
MapEvent : pTMapEvent;
begin
boGotoLabel := False;
for i := 0 to g_MapEventListOfDropItem.Count - 1 do begin
MapEvent := pTMapEvent(g_MapEventListOfDropItem.Items[i]);
if MapEvent <> nil then begin
if IsGotoLabel(MapEvent.m_sMapName,
MapEvent.m_nCurrX,
MapEvent.m_nCurrY,
MapEvent.m_nRange,
MapEvent.m_MapFlag.nQuestUnit,
MapEvent.m_MapFlag.boOpen,
MapEvent.m_Condition.sItemName,
sItemName,
MapEvent.m_Condition.boNeedGroup, MapEvent.m_nRandomCount) then begin
boGotoLabel := True;
Break;
end;
end;
end;
if boGotoLabel and (MapEvent <> nil) then begin
case MapEvent.m_StartScript.nLable of
0: ;
1: begin
ExecuteScript(g_FunctionNPC, MapEvent.m_StartScript.sLable);
end;
end;
end;
end;
procedure TPlayObject.StartMapEventOfMine();
var
i : Integer;
boGotoLabel : Boolean;
MapEvent : pTMapEvent;
begin
boGotoLabel := False;
for i := 0 to g_MapEventListOfMine.Count - 1 do begin
MapEvent := pTMapEvent(g_MapEventListOfMine.Items[i]);
if MapEvent <> nil then begin
if IsGotoLabel(MapEvent.m_sMapName,
MapEvent.m_nCurrX,
MapEvent.m_nCurrY,
MapEvent.m_nRange,
MapEvent.m_MapFlag.nQuestUnit,
MapEvent.m_MapFlag.boOpen,
MapEvent.m_Condition.sItemName,
'*',
MapEvent.m_Condition.boNeedGroup, MapEvent.m_nRandomCount) then begin
boGotoLabel := True;
Break;
end;
end;
end;
if boGotoLabel and (MapEvent <> nil) then begin
case MapEvent.m_StartScript.nLable of
0: ;
1: begin
ExecuteScript(g_FunctionNPC, MapEvent.m_StartScript.sLable);
end;
end;
end;
end;
procedure TPlayObject.StartMapEventOfPickUpItem(sItemName: string);
var
i : Integer;
boGotoLabel : Boolean;
MapEvent : pTMapEvent;
begin
boGotoLabel := False;
for i := 0 to g_MapEventListOfPickUpItem.Count - 1 do begin
MapEvent := pTMapEvent(g_MapEventListOfPickUpItem.Items[i]);
if MapEvent <> nil then begin
if IsGotoLabel(MapEvent.m_sMapName,
MapEvent.m_nCurrX,
MapEvent.m_nCurrY,
MapEvent.m_nRange,
MapEvent.m_MapFlag.nQuestUnit,
MapEvent.m_MapFlag.boOpen,
MapEvent.m_Condition.sItemName,
sItemName,
MapEvent.m_Condition.boNeedGroup, MapEvent.m_nRandomCount) then begin
boGotoLabel := True;
Break;
end;
end;
end;
if boGotoLabel and (MapEvent <> nil) then begin
case MapEvent.m_StartScript.nLable of
0: ;
1: begin
ExecuteScript(g_FunctionNPC, MapEvent.m_StartScript.sLable);
end;
end;
end;
end;
procedure TPlayObject.StartMapEventOfRun();
var
i : Integer;
boGotoLabel : Boolean;
MapEvent : pTMapEvent;
begin
boGotoLabel := False;
for i := 0 to g_MapEventListOfRun.Count - 1 do begin
MapEvent := pTMapEvent(g_MapEventListOfRun.Items[i]);
if MapEvent <> nil then begin
if IsGotoLabel(MapEvent.m_sMapName,
MapEvent.m_nCurrX,
MapEvent.m_nCurrY,
MapEvent.m_nRange,
MapEvent.m_MapFlag.nQuestUnit,
MapEvent.m_MapFlag.boOpen,
MapEvent.m_Condition.sItemName,
'*',
MapEvent.m_Condition.boNeedGroup, MapEvent.m_nRandomCount) then begin
boGotoLabel := True;
Break;
end;
end;
end;
if boGotoLabel and (MapEvent <> nil) then begin
case MapEvent.m_StartScript.nLable of
0: ;
1: begin
ExecuteScript(g_FunctionNPC, MapEvent.m_StartScript.sLable);
end;
end;
end;
end;
procedure TPlayObject.StartMapEventOfWalk();
var
i : Integer;
boGotoLabel : Boolean;
MapEvent : pTMapEvent;
begin
boGotoLabel := False;
for i := 0 to g_MapEventListOfWalk.Count - 1 do begin
MapEvent := pTMapEvent(g_MapEventListOfWalk.Items[i]);
if MapEvent <> nil then begin
if IsGotoLabel(MapEvent.m_sMapName,
MapEvent.m_nCurrX,
MapEvent.m_nCurrY,
MapEvent.m_nRange,
MapEvent.m_MapFlag.nQuestUnit,
MapEvent.m_MapFlag.boOpen,
MapEvent.m_Condition.sItemName,
'*',
MapEvent.m_Condition.boNeedGroup, MapEvent.m_nRandomCount) then begin
boGotoLabel := True;
Break;
end;
end;
end;
if boGotoLabel and (MapEvent <> nil) then begin
case MapEvent.m_StartScript.nLable of
0: ;
1: begin
ExecuteScript(g_FunctionNPC, MapEvent.m_StartScript.sLable);
end;
end;
end;
end;
procedure TPlayObject.StruckDamage(nDamage: Integer);
var
i, j : Integer;
nDam : Integer;
nDura, nOldDura : Integer;
StdItem : pTStdItem;
bo19 : Boolean;
AddItem : pTUserItem;
begin
if nDamage <= 0 then Exit;
nDam := Random(g_Config.nDamDuraRandom) + g_Config.nDamDuraValue;
if m_wStatusTimeArr[POISON_DAMAGEARMOR] > 0 then begin
nDam := Round(nDam * (g_Config.nPosionDamagarmor / 10) {1.2});
end;
if m_boSuperMan then nDam := 0; //无敌模式不掉持久
bo19 := False;
if m_UseItems[U_DRESS].wIndex > 0 then begin
StdItem := UserEngine.GetStdItem(m_UseItems[U_DRESS].wIndex);
if not CheckSPCode(StdItem.Reserved, RE_NODECDRUE) then begin //物品控制-不掉持久
nDura := m_UseItems[U_DRESS].Dura;
nOldDura := Round(nDura / 1000);
Dec(nDura, nDam);
if nDura <= 0 then begin
//可以控制物品破碎
if StdItem.Broken > 0 then begin
New(AddItem);
AddItem^ := m_UseItems[U_DRESS];
if AddItemToBag(AddItem) then
begin
SendDelItems(@m_UseItems[U_DRESS]);
AddItem.btItemExt[4] := 4; //物品破碎
SendUpdateItem(AddItem);
SendAddItem(AddItem);
SendDefMessage(SM_TAKEOFF_OK, GetFeatureToLong(Self), GetGender, 0, 0, '');
SysMsg(StdItem.Name + '持久过低,已破碎,已自动放入你的包裹!', c_Pink, t_Hint);
m_UseItems[U_DRESS].wIndex := 0;
m_UseItems[U_DRESS].MakeIndex := 0;
FeatureChanged();
m_UseItems[U_DRESS].wIndex := 0;
m_UseItems[U_DRESS].Dura := 0;
bo19 := True;
end else begin
Dispose(AddItem);
end;
end else begin
SendDelItems(@m_UseItems[U_DRESS]);
if StdItem.boGameLog = 1 then
AddGameDataLog('3' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
StdItem.Name + #9 +
IntToStr(m_UseItems[U_DRESS].MakeIndex) + #9 +
'TRUE' + #9 +
'0');
m_UseItems[U_DRESS].wIndex := 0;
m_UseItems[U_DRESS].MakeIndex := 0;
FeatureChanged();
m_UseItems[U_DRESS].wIndex := 0;
m_UseItems[U_DRESS].Dura := 0;
bo19 := True;
end;
end else begin
m_UseItems[U_DRESS].Dura := nDura;
end;
if nOldDura <> Round(nDura / 1000) then begin
SendMsg(Self, RM_DURACHANGE, U_DRESS, nDura, m_UseItems[U_DRESS].DuraMax, 0, '');
end;
end;
end;
for i := Low(THumItems) to High(THumItems) do begin
if i in [U_ABUJUK, U_SOULBEAD, U_RIDEDRESS, U_BACKORNAMENT..U_XIANDAI] then Continue;
if (m_UseItems[i].wIndex > 0) and (Random(8) = 0) then begin
StdItem := UserEngine.GetStdItem(m_UseItems[i].wIndex);
if StdItem = nil then Continue;
if (StdItem.StdMode in [18, 29]) and (StdItem.Shape = 150) then
Continue; //时间物品不掉持久
if CheckSPCode(StdItem.Reserved, RE_NODECDRUE) then
Continue; //物品控制-不掉持久
nDura := m_UseItems[i].Dura;
nOldDura := Round(nDura / 1000);
Dec(nDura, nDam);
if nDura <= 0 then begin
if StdItem.Broken > 0 then begin
New(AddItem);
AddItem^ := m_UseItems[i];
if AddItemToBag(AddItem) then
begin
SendDelItems(@m_UseItems[i]);
AddItem.btItemExt[4] := 4; //物品破碎
SendUpdateItem(AddItem);
SendAddItem(AddItem);
SendDefMessage(SM_TAKEOFF_OK, GetFeatureToLong(Self), GetGender, 0, 0, '');
SysMsg(StdItem.Name + '持久过低,已破碎,已自动放入你的包裹!', c_Pink, t_Hint);
m_UseItems[i].wIndex := 0;
m_UseItems[i].MakeIndex := 0;
FeatureChanged();
m_UseItems[i].wIndex := 0;
m_UseItems[i].Dura := 0;
bo19 := True;
end else begin
Dispose(AddItem);
end;
end else begin
SendDelItems(@m_UseItems[i]);
if StdItem.boGameLog = 1 then
AddGameDataLog('3' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
StdItem.Name + #9 +
IntToStr(m_UseItems[i].MakeIndex) + #9 +
'TRUE' + #9 +
'0');
m_UseItems[i].wIndex := 0;
m_UseItems[i].MakeIndex := 0;
FeatureChanged();
m_UseItems[i].wIndex := 0;
m_UseItems[i].Dura := 0;
bo19 := True;
end;
end else begin
m_UseItems[i].Dura := nDura;
{圣灵属性失效}
if Round(nDura / m_UseItems[i].DuraMax) < Round(g_Config.nHolySpiritRate / 100) then begin
if ((m_UseItems[i].btItemExt[4] and EX_HOLY) = EX_HOLY) then begin
Dec(m_UseItems[i].btItemExt[4], EX_HOLY);
SendUpdateItem(@m_UseItems[i]);
end;
end;
end;
if nOldDura <> Round(nDura / 1000) then begin
SendMsg(Self, RM_DURACHANGE, i, nDura, m_UseItems[i].DuraMax, 0, '');
end;
end;
end;
if bo19 then RecalcAbilitys(True);
//盾牌减少伤害
if (m_btShiEldDefencePower > 0) and (g_Config.nShiEldDefenceRate > 0) then begin
if (Random(g_Config.nShiEldDefenceRate) < 3) and (Random(g_Config.nShiEldLevelRate) < m_btShiEldDefenceLevel) then begin
nDamage := Round(nDamage - (nDamage * m_btShiEldDefencePower / 100));
SysMsg('恭喜你,本次盾牌成功分担部分伤害', c_Red, t_Hint);
end;
end;
//圣王盾减少伤害
if (m_btShiEldExemptHurt > 0) and (g_Config.nShiEldDefenceRate > 0) then begin
nDamage := Round(nDamage - (nDamage * g_Config.nShiEldExemptHurt / 100));
end;
//金刚护体承受的伤害超过血量的120%,触发金刚净化
if (m_wStatusTimeArr[STATE_JINGANGHUTI] > 0) and m_boRideFightOn and
(m_MagicSkills[SKILL_JINGANGPURIFY] <> nil) and (m_MagicSkills[SKILL_42] <> nil) and (m_MagicSkills[SKILL_61] <> nil) then begin
Inc(m_dwTotalDamage, nDamage);
if ((m_MagicSkills[SKILL_JINGANGPURIFY].btKey = 1)) and ((m_dwTotalDamage / m_WAbil.dwMaxHP * 100) > 120) then begin
//清除所有中毒效果
nDam := m_PetInfo[2].wLevel + m_MagicSkills[SKILL_JINGANGPURIFY].btLevel + m_MagicSkills[SKILL_42].btLevel + m_MagicSkills[SKILL_61].btLevel;
if (Random(g_Config.nMagJinGangPurifyRate) < nDam) then begin
if m_wStatusTimeArr[POISON_DAMAGEARMOR] > 0 then m_wStatusTimeArr[POISON_DAMAGEARMOR] := 1;
if m_wStatusTimeArr[POISON_DECHEALTH] > 0 then m_wStatusTimeArr[POISON_DECHEALTH] := 1;
if m_wStatusTimeArr[POISON_DECDEFENCE] > 0 then m_wStatusTimeArr[POISON_DECDEFENCE] := 1;
if m_wStatusTimeArr[POISON_DECMANA] > 0 then m_wStatusTimeArr[POISON_DECMANA] := 1;
if m_wStatusTimeArr[STATE_DECHEALTH] > 0 then m_wStatusTimeArr[STATE_DECHEALTH] := 1;
SendRefMsg(RM_510, 1, 0, 157, 0, '');
SysMsg('金刚净化成功', c_Red, t_Hint);
m_dwTotalDamage := 0;
//技能经验
TrainSkill(m_MagicSkills[SKILL_JINGANGPURIFY], Random(3) + 1, 1000);
end;
end;
end;
//火焰盾,触发抗拒火环效果
if m_boAbilMagBubbleDefence and m_boRideFightOn and (m_MagicSkills[SKILL_FIRESHIELD] <> nil) and (m_MagicSkills[SKILL_FIRESHIELD].btKey = 1) then begin
if (m_MagicSkills[SKILL_SHIELD] <> nil) and (m_MagicSkills[SKILL_FIREWIND] <> nil) then begin
nDam := m_PetInfo[2].wLevel + m_MagicSkills[SKILL_FIRESHIELD].btLevel + m_MagicSkills[SKILL_SHIELD].btLevel + m_MagicSkills[SKILL_FIREWIND].btLevel;
if (Random(g_Config.nMagFireShieldRate) < nDam) then begin
DoSpell(m_MagicSkills[SKILL_FIRESHIELD], m_nCurrX, m_nCurrY, Self);
end;
end;
end;
//狂狮盾
if (m_wStatusTimeArr[STATE_DEFENCEUP] > 1) and m_boRideFightOn and (m_MagicSkills[SKILL_LIONSHIELD] <> nil) and (m_MagicSkills[SKILL_LIONSHIELD].btKey = 1) then begin
if (m_MagicSkills[SKILL_HANGMAJINBUB] <> nil) and (m_MagicSkills[SKILL_GROUPLIGHTENING] <> nil) then begin
nDam := m_PetInfo[2].wLevel + m_MagicSkills[SKILL_LIONSHIELD].btLevel + m_MagicSkills[SKILL_HANGMAJINBUB].btLevel + m_MagicSkills[SKILL_GROUPLIGHTENING].btLevel;
if (Random(g_Config.nMagLionShieldRate) < nDam) then begin
DoSpell(m_MagicSkills[SKILL_GROUPLIGHTENING], m_nCurrX, m_nCurrY, Self);
//技能经验
TrainSkill(m_MagicSkills[SKILL_LIONSHIELD], Random(3) + 1, 1000);
end;
end;
end;
//被攻击增加元气
if (m_btRaceServer = RC_PLAYOBJECT) and
((TPlayObject(Self).m_btPneumaSex > 0) or
(TPlayObject(Self).m_Dan.SoulBaby.wKind > 0) or
(not g_Config.boNoPneumaAddVitaLity) or
(m_btJob = 3))
then begin
if (g_Config.nVitaLityAddSpeed > 0) and (nDamage > 10) then begin
//每10点伤害,随机增加1-4点元气
nDam := _MIN(10, (nDamage div 10) * (Random(4) + 1));
nDam := nDam * g_Config.nVitaLityAddSpeed;
if m_boPneuma and (m_PneumaObject <> nil) then
m_PneumaObject.DamageVitaLity(-nDam)
else
DamageVitaLity(-nDam);
end;
end;
DamageHealth(nDamage);
end;
function TPlayObject.SuperRepairUseItems: Boolean;
var
i, ii : Integer;
StdItem : pTStdItem;
begin
Result := False;
ii := 0;
for i := Low(THumItems) to High(THumItems) do begin
if (i in [U_ABUJUK, U_SOULBEAD, U_RIDEDRESS, U_BACKORNAMENT..U_XIANDAI]) then Continue;
if m_UseItems[i].wIndex > 0 then begin
StdItem := UserEngine.GetStdItem(m_UseItems[i].wIndex);
if (StdItem = nil) then Continue;
if CheckSPCode(StdItem.SPCode, SP_DISABLEBINQUAN) then Continue; //物品控制-禁止冰泉圣水
m_UseItems[i].Dura := m_UseItems[i].DuraMax;
SendMsg(Self, RM_DURACHANGE, i, m_UseItems[i].Dura, m_UseItems[i].DuraMax, 0, '');
Inc(ii);
end;
end;
for i := Low(m_EntopticItems) to High(m_EntopticItems) do begin
if m_EntopticItems[i].Item.wIndex > 0 then begin
StdItem := UserEngine.GetStdItem(m_EntopticItems[i].Item.wIndex);
if (StdItem = nil) then Continue;
if CheckSPCode(StdItem.SPCode, SP_DISABLEBINQUAN) then Continue; //物品控制-禁止冰泉圣水
m_EntopticItems[i].Item.Dura := m_EntopticItems[i].Item.DuraMax;
SendUpdateItem(@m_EntopticItems[i].Item);
Inc(ii);
//包不知道
end;
end;
//融合元神穿戴的融合装备
if m_boPneuma and m_boInosculatePneuma then begin
for i := Low(m_TorDDM.Tiger.Items) to High(m_TorDDM.Tiger.Items) do begin
if m_TorDDM.Tiger.Items[i].wIndex > 0 then begin
StdItem := UserEngine.GetStdItem(m_TorDDM.Tiger.Items[i].wIndex);
if (StdItem = nil) then Continue;
if CheckSPCode(StdItem.SPCode, SP_DISABLEBINQUAN) then Continue; //物品控制-禁止冰泉圣水
m_TorDDM.Tiger.Items[i].Dura := m_TorDDM.Tiger.Items[i].DuraMax;
SendUpdateItem(@m_TorDDM.Tiger.Items[i]);
Inc(ii);
end;
end;
end;
Result := ii > 0;
if Result then
SysMsg(g_sSuperRepairMsg, c_Green, t_Hint);
end;
function TPlayObject.SuperRepairWeapon: Boolean;
var
StdItem : pTStdItem;
begin
Result := False;
if m_UseItems[U_WEAPON].wIndex <= 0 then Exit;
StdItem := UserEngine.GetStdItem(m_UseItems[U_WEAPON].wIndex);
if StdItem = nil then Exit;
{物品控制-禁止特殊修理}
if CheckSPCode(StdItem.SPCode, SP_DISABLEREPAIR) then begin
SysMsg('此物品禁止修理', c_Red, t_Hint);
Exit;
end;
m_UseItems[U_WEAPON].Dura := m_UseItems[U_WEAPON].DuraMax;
SendMsg(Self, RM_DURACHANGE, 1, m_UseItems[U_WEAPON].Dura,
m_UseItems[U_WEAPON].DuraMax, 0, '');
SysMsg(g_sWeaponRepairSuccess {'武器修复成功...'}, c_Green, t_Hint);
Result := True;
end;
procedure TPlayObject.TakeItemOn(sItemName: string; btWhere: Integer);
var
i : Integer;
UserItem : pTUserItem;
StdItem : pTStdItem;
nOldStatus : Integer;
begin
if btWhere >= MAX_HUMITEM_COUNT then Exit;
if (sItemName = '') then begin
if m_UseItems[btWhere].wIndex > 0 then begin //取下物品
ClientTakeOffItems(btWhere, m_UseItems[btWhere].MakeIndex, UserEngine.GetStdItemName(m_UseItems[btWhere].wIndex));
end;
end else begin
if GetUserItemByName(sItemName, UserItem) <> -1 then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if ClientTakeOnItems(btWhere, UserItem.MakeIndex, StdItem.FilterName, True) then begin
SendDelItems(UserItem);
SendUpdateMsg(Self, RM_SENDUSEITEMS, 0, 0, 0, 0, '');
end;
end;
end;
end;
procedure TPlayObject.TigerDefendMaster(var nDamage: Integer);
var
i, nCount : Integer;
nX, nY, n18, n1C, nMapIndex : Integer;
wHP : word;
begin
if m_btJob = 3 then Exit; //妖士是没有虎王
if (m_Tiger <> nil) and (not m_Tiger.m_boDeath) and (not m_Tiger.m_boGhost) then begin
if CretInNear10XY(m_Tiger, m_nCurrX, m_nCurrY) then begin
if (Random(g_Config.nTigerSkillRate[4]) < m_TorDDM.Tiger.DB.SkillLevel[4]) then begin
if GetFrontPosition(nX, nY) then begin
if GetCanMovePosition(nX, nY, 3, n18, n1C) then begin
m_Tiger.SendRefMsg(RM_SPACEMOVE_FIRE, 0, 0, 0, 0, '');
nMapIndex := m_PEnvir.Index;
m_Tiger.SpaceMove(m_sMapName, n18, n1C, 0, @nMapIndex);
//恢复主人血量
nDamage := 0;
m_WAbil.dwHP := Round(m_WAbil.dwMaxHP / 2);
HealthSpellChanged();
SysMsg(Format('你的%s替你抵挡了一次致命攻击,牺牲了!', [m_Tiger.m_sCharName]), c_Red, t_Hint);
m_Tiger.Die;
end;
end;
end;
end;
end;
end;
procedure TPlayObject.TigerTransferDamage(var nDamage: Integer);
var
nObjCount, nTransfer : Integer;
begin
if m_btJob = 3 then Exit; //妖士是没有虎王
if (m_Tiger <> nil) and (not m_Tiger.m_boDeath) and (not m_Tiger.m_boGhost) then begin
if CretInNear10XY(m_Tiger, m_nCurrX, m_nCurrY) then begin
if (Random(g_Config.nTigerSkillRate[3]) < m_TorDDM.Tiger.DB.SkillLevel[3]) then begin
nObjCount := Integer(Self);
m_Tiger.SendRefMsg(RM_510, HiWord(nObjCount), LoWord(nObjCount), 104, 0, '');
nTransfer := Round(nDamage * (_MIN(m_TorDDM.Tiger.DB.level, 90)) / 100);
Dec(nDamage, nTransfer);
if nTransfer > 0 then begin
m_Tiger.StruckDamage(nTransfer);
m_Tiger.SendRefMsg(RM_STRUCK, 0, nTransfer, 0, Integer(Self), '');
end;
end;
end;
end;
end;
//更新人物到nStep,如果nStep=0,则在原来的基础上+1
function TPlayObject.UpdateTaskStep(const TaskID: Integer; nStep: Integer): Integer;
var
i : Integer;
TaskTitle, TaskDesc, Taskaim : string;
m : Integer;
pTask : PTTask;
begin
Result := -1;
m := 0;
for i := 0 to m_TaskList.Count - 1 do begin
pTask := PTTask(m_TaskList[i]);
if pTask^.TaskID = TaskID then begin
m := pTask^.Step;
if (nStep = 0) then nStep := LoWord(m) + 1;
pTask^.Step := MakeLong(nStep, HiWord(m));
;
Result := nStep;
Break;
end;
end;
if Result > 0 then begin
i := UserEngine.GetMainTask(TaskID);
if m > 0 then begin
SendMsg(Self, RM_ADDTASK, MakeWord(2, i), TaskID, 0, 0, '');
end;
TaskDesc := UserEngine.GetTaskStepInfo(pTask^.TaskID, pTask^.Step, TaskTitle, Taskaim);
TaskDesc := '{Task title=' + TaskTitle + '}' + TaskDesc + '</Task>';
if Taskaim <> '' then
TaskDesc := TaskDesc + '<aim>' + Taskaim + '</aim>';
if g_FunctionNPC <> nil then
TaskDesc := g_FunctionNPC.GetLineVariableText(Self, TaskDesc);
SendMsg(Self, RM_ADDTASK, MakeWord(1, i), TaskID, 0, 0, TaskDesc)
end;
end;
procedure TPlayObject.RefreshTask(const TaskID, nStep: Integer);
var
i, m, w : Integer;
TaskTitle, TaskDesc, Taskaim : string;
pTask : PTTask;
begin
if nStep = 0 then Exit;
SendDefMessage(SM_TASKINFO, 0, 0, 0, 0, Format(sTaskInfo, [m_nMaxTaskCount, m_nAchievement, m_nTaskCount]));
for i := 0 to m_TaskList.Count - 1 do begin
pTask := PTTask(m_TaskList[i]);
if pTask^.TaskID = TaskID then begin
TaskDesc := UserEngine.GetTaskStepInfo(TaskID, nStep, TaskTitle, Taskaim);
TaskDesc := '{Task title=' + TaskTitle + '}' + TaskDesc + '</Task>';
if Taskaim <> '' then
TaskDesc := TaskDesc + '<aim>' + Taskaim + '</aim>';
if g_FunctionNPC <> nil then
TaskDesc := g_FunctionNPC.GetLineVariableText(Self, TaskDesc);
m := UserEngine.GetMainTask(TaskID);
w := HiWord(pTask^.Step);
if (w = 0) or (HiByte(w) = 2) then
SendMsg(Self, RM_ADDTASK, MakeWord(1, m), TaskID, 0, 0, TaskDesc)
else
SendMsg(Self, RM_ADDTASK, MakeWord(3, m), TaskID, LoByte(w), 0, TaskDesc);
end;
end;
end;
//客户端任务ID=任务ID*100 + 任务步骤
procedure TPlayObject.ClientDelTask(const TaskID: Integer);
var
i, m : Integer;
pTask : PTTask;
begin
if GetTaskStep(TaskID) = 0 then Exit;
m := UserEngine.GetMainTask(TaskID);
for i := m_TaskList.Count - 1 downto 0 do begin
pTask := PTTask(m_TaskList[i]);
if pTask^.TaskID = TaskID then begin
SendMsg(Self, RM_ADDTASK, MakeWord(2, m), TaskID, 0, 0, '');
m_sScriptParam[0] := IntToStr(pTask^.TaskID);
m_sScriptParam[1] := IntToStr(LoWord(pTask^.Step));
m_TaskList.Delete(i);
Dispose(pTask); //
if (m = 0) then Dec(m_nTaskCount);
ExecuteScript(g_FunctionNPC, '@CancelTask');
Break;
end;
end;
end;
procedure TPlayObject.SendColorTask(const TaskID, Color: Integer);
var
TaskTitle, TaskDesc, Taskaim : string;
begin
TaskDesc := UserEngine.GetTaskStepInfo(TaskID, 1, TaskTitle, Taskaim);
TaskDesc := '{Task title=' + TaskTitle + '}' + TaskDesc + '</Task>';
if Taskaim <> '' then
TaskDesc := TaskDesc + '<aim>' + Taskaim + '</aim>';
if g_FunctionNPC <> nil then
TaskDesc := g_FunctionNPC.GetLineVariableText(Self, TaskDesc);
SendMsg(Self, RM_ADDTASK, MakeWord(3, 1), TaskID, Color, 0, TaskDesc);
end;
procedure TPlayObject.UPGRADEMON(nType: Integer);
var
UserItem : pTUserItem;
StdItem : pTStdItem;
i : Integer;
nMakeIndex : Integer;
tm : DWORD;
OldItem : TUserItem;
begin
if (m_PetInfo[0].nMakeIndex = 0) or (m_Pet = nil) then begin
SysMsg('请将你的灵兽处于跟随状态。', c_Red, t_Hint);
Exit;
end else
nMakeIndex := m_PetInfo[0].nMakeIndex;
{找到豹魔石}
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[i];
if (UserItem <> nil) and (UserItem.MakeIndex = nMakeIndex) then begin
tm := DateTimeToWolTIme(Now);
UserItem.btValue[0] := LoByte(LoWord(tm));
UserItem.btValue[1] := HiByte(LoWord(tm));
UserItem.btValue[2] := LoByte(HiWord(tm));
UserItem.btValue[3] := HiByte(HiWord(tm));
UserItem.btValue[4] := 0; //等级
UserItem.btValue[5] := 0;
// UserItem.btValue[6] := 0; //经验
// UserItem.btValue[7] := 0;
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if nType = -1 then begin
{灵兽转生}
//2转到3转,属性需要重新赋值
OldItem := UserItem^;
UserItem.btValue[9] := _MIN(3, UserItem.btValue[9] + 1);
UserItem.btValue[8] := _MIN(2, _Max(1, UserItem.btValue[8]));
if (UserItem.btValue[9] = 3) then begin
UserItem.wHP := OldItem.wHP;
UserItem.wMP := OldItem.wMP;
UserItem.btAntiPoison := OldItem.btAntiPoison;
UserItem.wMAC := OldItem.wMAC;
UserItem.btMagicNicety := OldItem.btMagicNicety;
UserItem.btEvaDet := OldItem.btEvaDet;
UserItem.wAC := OldItem.wAC;
UserItem.btAntiMagic := OldItem.btAntiMagic;
UserItem.btPoisonNicety := OldItem.btPoisonNicety;
UserItem.btSavvy := OldItem.btSavvy;
UserItem.btFelemEntType[0] := OldItem.btFelemEntType[0];
UserItem.btFelemEntType[1] := OldItem.btFelemEntType[1];
UserItem.btFelemEntPoint[0] := OldItem.btFelemEntPoint[0];
UserItem.btFelemEntPoint[1] := OldItem.btFelemEntPoint[1];
UserItem.wLevel := OldItem.wLevel;
UserItem.dwExp := OldItem.dwExp;
UserItem.wMC := OldItem.wMC;
UserItem.wSC := OldItem.wSC;
UserItem.wDC := OldItem.wDC;
UserItem.btHitNicety := OldItem.btHitNicety;
UserItem.btLuck := OldItem.btLuck;
end;
if (m_Pet <> nil) and (StdItem <> nil) then begin
if (UserItem.btValue[9] = 1) then begin
case StdItem.AniCount of
0: m_Pet.m_wAppr := 166;
1: m_Pet.m_wAppr := 185;
2: m_Pet.m_wAppr := 39;
3: m_Pet.m_wAppr := 301;
end;
m_Pet.SendRefMsg(RM_510, 1, 0, 84, 0, '');
end else begin
m_Pet.SendRefMsg(RM_510, 1, 0, 97, 0, '');
end;
m_Pet.m_btGender := UserItem.btValue[9];
m_Pet.m_wSlaveExpLevel := 0;
m_Pet.m_sCharName := _PETNAME[_MIN(10, StdItem.AniCount)][_MIN(3, UserItem.btValue[9])];
m_Pet.RefShowName;
m_PetInfo[0].wLevel := 0;
m_Pet.FeatureChanged;
m_Pet.SendRefMsg(RM_SPACEMOVE_SHOW,
m_Pet.m_btDirection,
m_Pet.m_nCurrX,
m_Pet.m_nCurrY,
0,
m_Pet.GetShowName);
end;
end else begin
{天地灵水}
UserItem.btValue[8] := nType;
if (m_Pet <> nil) and (StdItem <> nil) then begin
{
case StdItem.AniCount of
0: m_Pet.m_wAppr := 165 + nType;
1: m_Pet.m_wAppr := 184 + nType;
2: m_Pet.m_wAppr := 38 + nType;
3: m_Pet.m_wAppr := 300 + nType;
4: ;
5: ;
6: ;
end;
}
case nType of
1: m_Pet.SendRefMsg(RM_510, 1, 0, 46, 0, '');
2: m_Pet.SendRefMsg(RM_510, 1, 0, 54, 0, '');
3: m_Pet.SendRefMsg(RM_510, 1, 0, 53, 0, '');
end;
m_Pet.FeatureChanged;
end;
end;
SendUpdateItem(UserItem);
PetShow(UserItem.MakeIndex);
Break;
end;
end;
end;
//用户登陆游戏引擎
procedure TPlayObject.UserLogon;
var
nUserCount : Integer;
i : Integer;
ii : Integer;
UserItem : pTUserItem;
UserItem1 : pTUserItem;
StdItem : pTStdItem;
s14 : string;
sItem : string;
sIPaddr : string;
nOrd : Integer;
iStatus : Integer;
Country : TCountry;
nCode : Integer;
VoiceServ : TVoiceServer;
resourcestring
sExceptionMsg = '[Exception] TPlayObject::UserLogon Name=%s Code=%d';
sCheckIPaddrFail = '登录IP地址不匹配!!!';
sClientVarMsg = '您当前客户端版本号为:%d';
begin
nCode := 0;
nUserCount := 0;
sIPaddr := '';
try
if g_Config.boTestServer then begin
if m_Abil.level < g_Config.nTestLevel then m_Abil.level := g_Config.nTestLevel;
if m_nGold < g_Config.nTestGold then m_nGold := g_Config.nTestGold;
end;
if g_Config.boTestServer or (g_Config.boServiceMode) then m_nPayMent := 3;
m_dwMapMoveTick := GetTickCount();
m_dLogonTime := Now();
m_dwLogonTick := GetTickCount();
nCode := 1;
Initialize();
nCode := 2;
SendMsg(Self, RM_LOGON, 0, 0, 0, 0, '');
//等级小于7的人,在超过80人的地方将不能出生,会被随机传送
if m_Abil.level <= 7 then begin
if GetRangeHumanCount >= 80 then begin
MapRandomMove(m_PEnvir.m_sMapName, 0, nil);
end;
end;
if not m_boPneuma then begin
//战斗中死亡的,也将被随机传送
if m_boDieInFight3Zone then begin
ii := m_PEnvir.Index;
MapRandomMove(m_PEnvir.m_sMapName, 0, @ii);
end;
if m_PEnvir.m_MapFlag.boNORECONNECT then begin
MapRandomMove(m_PEnvir.m_MapFlag.sReConnectMap, 0, nil);
end;
end;
nCode := 3;
//取用户权限
UserEngine.GetHumPermission(m_sCharName, sIPaddr, m_btPermissionGM);
//反盗版措施
// if nCrackLevel = 3 then begin
// m_nGameGold := High(LongWord);
// m_Abil.level := High(word);
// end;
nCode := 4;
GetStartPoint();
nCode := 5;
if m_boNewHuman then begin //新人的处理,增加新人装备
New(UserItem);
if UserEngine.CopyToUserItemFromName(g_Config.sBook, UserItem) then
//传世宝典
m_ItemList.Add(UserItem)
else
Dispose(UserItem);
New(UserItem);
if UserEngine.CopyToUserItemFromName(g_Config.sBasicDrug, UserItem) then
//药品
m_ItemList.Add(UserItem)
else
Dispose(UserItem);
New(UserItem);
if m_btGender = 0 then
sItem := g_Config.sClothsMan
else
sItem := g_Config.sClothsWoman;
if UserEngine.CopyToUserItemFromName(sItem, UserItem) then //衣服
m_ItemList.Add(UserItem)
else
Dispose(UserItem);
New(UserItem);
if UserEngine.CopyToUserItemFromName(g_Config.sWoodenSword, UserItem) then
//武器
m_ItemList.Add(UserItem)
else
Dispose(UserItem);
//新人满血
m_Abil.dwHP := m_Abil.dwMaxHP;
m_Abil.dwMP := m_Abil.dwMaxMP;
//发送登陆动画
if (m_btLastOutStatus = 0) then begin
g_SmallPacketManage.Init;
g_SmallPacketManage.FillWrite(10, 0);
if not m_boNewHuman then
g_SmallPacketManage.WriteByte(0)
else begin
if (g_Config.boTimeBackServer = True) then begin
g_SmallPacketManage.WriteByte(2);
end else if (g_Config.boMagicCityServer = True) then begin
g_SmallPacketManage.WriteByte(3);
end else if (g_Config.boMagicCityServer = True) then begin
g_SmallPacketManage.WriteByte(4);
end else if (g_Config.botimeServer = True) then begin
g_SmallPacketManage.WriteByte(9); //时长区
end else
begin
g_SmallPacketManage.WriteByte(1);
end;
end;
g_SmallPacketManage.FillWrite(5, 0);
m_defMsg := MakeDefaultMsg(1554, 0, 0, 0, 0);
SendSocket(@m_defMsg, g_SmallPacketManage.GetMsg);
end;
end;
nCode := 6;
//检查背包中的物品是否合法
for i := m_ItemList.Count - 1 downto 0 do begin
UserItem := m_ItemList.Items[i];
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if (StdItem = nil) or IsDenyItemIndex(UserItem.MakeIndex) or
CheckSPCode(StdItem.Reserved, RE_LOGONCLEAR) then begin //非法物品编号
{$IF USESDK = DEBUG}
SysMsg('删除非法物品:' + IntToStr(UserItem.MakeIndex), c_Pink, t_Hint);
{$IFEND}
Dispose(UserItem);
m_ItemList.Delete(i);
//Dispose(UserItem); //物品控制-上线消失
end;
end;
nCode := 7;
//检查人物身上的物品是否符合使用规则
if g_Config.boCheckUserItemPlace then begin
for i := Low(THumItems) to High(THumItems) do begin
if m_UseItems[i].wIndex > 0 then begin
StdItem := UserEngine.GetStdItem(m_UseItems[i].wIndex);
if StdItem <> nil then begin
if IsDenyItemIndex(m_UseItems[i].MakeIndex) or (CheckSPCode(StdItem.Reserved, RE_LOGONCLEAR)) then begin //非法物品编号
m_UseItems[i].wIndex := 0; //物品控制-上线消失
end else if not CheckUserItems(i, StdItem) then begin
New(UserItem);
UserItem^ := m_UseItems[i];
if not AddItemToBag(UserItem) then begin //强行加入物品数据
m_ItemList.Insert(0, UserItem);
end;
m_UseItems[i].wIndex := 0;
{超级技能项链}
end else if StdItem.StdMode = 18 then begin
if CheckUserItemTimeOut(@m_UseItems[i], StdItem) then begin
m_UseItems[i].wIndex := 0;
SysMsg(Format('你的%s已经到期', [StdItem.FilterName]), c_Red, t_Hint);
end;
end
{灵鼠神佑、金牛神佑}
else if StdItem.StdMode = 29 then begin
if CheckUserItemTimeOut(@m_UseItems[i], StdItem) then begin
m_UseItems[i].wIndex := 0;
SysMsg(Format('你的%s已经到期', [StdItem.FilterName]), c_Red, t_Hint);
end;
end else if (StdItem.StdMode = 6) and (StdItem.Shape = 20) then begin
if CheckUserItemTimeOut(@m_UseItems[i], StdItem) then begin
m_UseItems[i].wIndex := 0;
SendDelItems(@m_UseItems[i]);
SysMsg(Format('你的%s已经到期', [StdItem.FilterName]), c_Red, t_Hint);
end;
end;
end else
m_UseItems[i].wIndex := 0;
end;
end;
end;
nCode := 8;
//检查背包中是否有复制品
for i := m_ItemList.Count - 1 downto 0 do begin
UserItem := m_ItemList.Items[i];
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem = nil then Continue;
if StdItem = nil then begin
{$IF USESDK = DEBUG}
SysMsg('删除非法物品:' + IntToStr(UserItem.MakeIndex), c_Pink, t_Hint);
{$IFEND}
m_ItemList.Delete(i);
Dispose(UserItem);
Continue;
end;
s14 := StdItem.Name;
for ii := i - 1 downto 0 do begin
UserItem1 := m_ItemList.Items[ii];
if (UserItem.MakeIndex = UserItem1.MakeIndex) and (UserEngine.GetStdItemName(UserItem1.wIndex) = s14) then begin
{$IF USESDK = DEBUG}
SysMsg('删除复制品:' + IntToStr(UserItem.MakeIndex), c_Pink, t_Hint);
{$IFEND}
m_ItemList.Delete(ii);
Dispose(UserItem1);
Break;
end;
end;
//检查背包物品和身上装备是否有复制
for ii := Low(THumItems) to High(THumItems) do begin
if (m_UseItems[ii].wIndex > 0) and (UserItem.MakeIndex = m_UseItems[ii].MakeIndex) and (UserEngine.GetStdItemName(m_UseItems[ii].wIndex) = s14) then begin
{$IF USESDK = DEBUG}
SysMsg('删除复制品:' + IntToStr(m_UseItems[ii].MakeIndex), c_Pink, t_Hint);
{$IFEND}
m_UseItems[ii].wIndex := 0;
Break;
end;
end;
end;
nCode := 9;
for i := Low(m_dwStatusArrTick) to High(m_dwStatusArrTick) do begin
if m_wStatusTimeArr[i] <> 0 then m_dwStatusArrTick[i] := GetTickCount();
end;
nCode := 10;
m_nCharStatus := GetCharStatus();
m_nMagicStatus := GetMagicStatus();
if (m_nGold > g_Config.nHumanMaxGold * 2) and (g_Config.nHumanMaxGold > 0) then m_nGold := g_Config.nHumanMaxGold * 2;
if m_boPneuma and (m_PneumaObject <> nil) then m_btAttatckMode := m_PneumaObject.m_btAttatckMode;
if m_wStatusTimeArr[STATE_MAGDEFENCEUP] > 0 then
SysMsg(Format(g_sMagDefenceUpTime, [m_wStatusTimeArr[STATE_MAGDEFENCEUP]]), c_Green, t_Client);
if m_wStatusTimeArr[STATE_DEFENCEUP] > 0 then
SysMsg(Format(g_sDefenceUpTime, [m_wStatusTimeArr[STATE_DEFENCEUP]]), c_Green, t_Client);
if not m_boPneuma then begin
if (m_nSoftVersionDate < g_Config.nSoftVersionDate) or (m_VersionManage = nil) or (m_VersionManage.SoftVersion = -1) then begin
if not g_Config.boCanOldClientLogon then begin
SysMsg(sClientSoftVersionError, c_Red, t_Hint);
SysMsg(sDownLoadNewClientSoft, c_Red, t_Hint);
SysMsg(sForceDisConnect, c_Red, t_Hint);
m_boEmergencyClose := True;
Exit;
end;
end;
if ((m_VersionManage = nil) or (m_VersionManage.SoftVersion < MIN_CLIENT_SOFTVERSION)) and g_Config.boOldClientShowHiLevel then begin
SysMsg(sClientSoftVersionTooOld, c_Blue, t_Hint);
SysMsg(sDownLoadAndUseNewClient, c_Red, t_Hint);
end;
nCode := 11;
case m_btAttatckMode of
HAM_ALL: SysMsg(sAttackModeOfAll, c_Green, t_Client); //[攻击模式: 全体攻击]
HAM_PEACE: SysMsg(sAttackModeOfPeaceful, c_Green, t_Client); //[攻击模式: 和平攻击]
HAM_DEAR: SysMsg(sAttackModeOfDear, c_Green, t_Client); //[攻击模式: 和平攻击]
HAM_MASTER: SysMsg(sAttackModeOfMaster, c_Green, t_Client); //[攻击模式: 和平攻击]
HAM_GROUP: SysMsg(sAttackModeOfGroup, c_Green, t_Client); //[攻击模式: 编组攻击]
HAM_GUILD: SysMsg(sAttackModeOfGuild, c_Green, t_Client); //[攻击模式: 行会攻击]
HAM_PKATTACK: SysMsg(sAttackModeOfRedWhite, c_Green, t_Client); //[攻击模式: 红名攻击]
{$IF COUNTRYSYSTEM = 1}
HAM_COUNTRY: SysMsg(sAttackModeOfCountry, c_Green, t_Client); //[攻击模式: 国家攻击]
{$IFEND}
end;
SysMsg(sStartChangeAttackModeHelp, c_Green, t_Client); //使用组合快捷键 CTRL-H 更改攻击...
if (g_Config.boTestServer) and (g_Config.boOldClientShowHiLevel) then SysMsg(sStartNoticeMsg, c_Green, t_Hint); //欢迎进入本服务器进行游戏...
if UserEngine.PlayObjectCount > g_Config.nTestUserLimit then begin
if m_btPermissionGM < 2 then begin
SysMsg(sOnlineUserFull1, c_Red, t_Hint);
SysMsg(sForceDisConnect, c_Red, t_Hint);
m_boEmergencyClose := True;
end;
end;
end;
m_nBright := 0;
m_MyGuild := g_GuildManager.MemberOfGuild(m_sCharName);
m_MyClan := g_GuildManager.MemberOfClan(m_sCharName);
if m_MyGuild <> nil then begin
m_sGuildRankName := TGuild(m_MyGuild).GetRankName(Self, m_nGuildRankNo);
for i := 0 to TGuild(m_MyGuild).m_GuildWarList.Count - 1 do begin
SysMsg(TGuild(m_MyGuild).m_GuildWarList.Keys[i] + ' 正在与本行会进行行会战。', c_Green, t_Hint);
end;
end else begin
m_nGuildGold := 0;
GuildGoldChanged(); //没有行会则行会银两清0
end;
nCode := 12;
if not m_boPneuma then begin
RecalcTowerAbility();
RecalcTigerLevelAbilitys;
SendTigerInfo; //发送虎王数据
end;
nCode := 13;
RecalcAbilitys;
nCode := 131;
SendMsg(Self, RM_TOWERAAILITY, 0, 0, 0, 0, '');
SendDelayMsg(Self, RM_ABILITY, 0, 0, 0, 0, '', 1000);
nCode := 132;
SendUpdateMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
nCode := 133;
// SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
nCode := 134;
SendMsg(Self, RM_ADJUST_BONUS, 0, 0, 0, 0, '');
nCode := 135;
SendMsg(Self, RM_DAYCHANGING, 0, 0, 0, 0, '');
nCode := 136;
SendDelayMsg(Self, RM_SENDUSEITEMS, 0, 0, 0, 0, '', 1000);
SendDelayMsg(Self, CM_QUERYBAGITEMS, 0, 0, 0, 0, '', 1000);
nCode := 137;
//执行登陆脚本
if not m_boOfflineResume then begin
ExecuteScript(g_ManageNPC, '@Initialize');
ExecuteScript(g_ManageNPC, '@Login');
end else begin
ExecuteScript(g_ManageNPC, '@Resume');
end;
SendDelayMsg(Self, RM_GOLDCHANGED, 0, m_nGold, 0, 0, '', 1000);
SendDelayMsg(Self, RM_GAMEGOLDCHANGED, 0, m_nGameGold, 0, 0, '', 1000);
nCode := 138;
if not m_boPneuma then begin
SendDelayMsg(Self, RM_GOLDCHANGED, 1, m_nBindGold, 0, 0, '', 1000);
SendDelayMsg(Self, RM_GOLDCHANGED, 2, m_nBindGameGold, 0, 0, '', 1000);
SendDelayMsg(Self, RM_QUERYPETSOUL, 0, 0, 0, 0, '', 1000);
SendUpdateDelayMsg(Self, RM_REFRESHRANK, 0, 0, 0, 0, '', 1000);
SendUpdateDelayMsg(Self, RM_REFRESHRANK, 0, 5, 0, 0, '', 1000);
end else begin
SendUpdateDelayMsg(Self, RM_REFRESHRANK, 0, 1, 0, 0, '', 1000);
end;
SendUseMagic();
nCode := 15;
//若装备了马牌
HorseName := '';
m_btHorseType := 0;
if (m_UseItems[U_RIGHTHAND].wIndex > 0) then begin
StdItem := UserEngine.GetStdItem(m_UseItems[U_RIGHTHAND].wIndex);
if (StdItem <> nil) and (StdItem.StdMode = 33) then begin
if StdItem.Shape = 0 then begin
HorseName := UserEngine.GetHorseName(@m_UseItems[U_RIGHTHAND]);
m_btHorseType := m_UseItems[U_RIGHTHAND].btValue[0];
end else begin
HorseName := StdItem.Name;
m_btHorseType := StdItem.Shape;
end;
if m_btHorseType > 50 then Dec(m_btHorseType, 50);
if m_UseItems[U_RIGHTHAND].Dura < 1000 then
m_UseItems[U_RIGHTHAND].Dura := 0
else
m_UseItems[U_RIGHTHAND].Dura := m_UseItems[U_RIGHTHAND].Dura - 1000;
end;
end;
if (m_btHorseType = 0) and (m_UseItems[U_CHARM].wIndex > 0) then begin
StdItem := UserEngine.GetStdItem(m_UseItems[U_CHARM].wIndex);
if (StdItem <> nil) and (StdItem.StdMode = 33) then begin
if StdItem.Shape = 0 then begin
m_btHorseType := m_UseItems[U_CHARM].btValue[0];
HorseName := UserEngine.GetHorseName(@m_UseItems[U_CHARM]);
end else begin
HorseName := StdItem.Name;
m_btHorseType := StdItem.Shape;
end;
if m_btHorseType > 50 then Dec(m_btHorseType, 50);
if m_UseItems[U_CHARM].Dura < 1000 then
m_UseItems[U_CHARM].Dura := 0
else
m_UseItems[U_CHARM].Dura := m_UseItems[U_CHARM].Dura - 1000;
end;
end;
if Length(HorseName) > 0 then begin
if Pos('(', HorseName) > 0 then begin
Delete(HorseName, 1, Pos('(', HorseName));
Delete(HorseName, Length(HorseName), 1);
end;
//允许骑马则生成马
if m_PEnvir.m_MapFlag.boRideOn then begin
m_Horse := MakeSlave(HorseName, 7, 7, 100, 24 * 60 * 60, -1);
if m_Horse <> nil then begin
m_Horse.TurnTo(m_btDirection);
SendDefMessage(34977, m_Horse.m_wAppr, 612, 1, 0, '');
end;
end else begin
m_Horse := nil;
SysMsg('本地图不允许骑宠。', c_Red, t_Hint);
end;
end;
m_boRideOn := False;
m_boRideFightOn := False;
nCode := 17;
RefShowName();
if (m_nPayMent = 1) then begin
SysMsg(sYouNowIsTryPlayMode, c_Red, t_Hint);
m_nGoldMax := g_Config.nHumanTryModeMaxGold;
if m_Abil.level > g_Config.nTryModeLevel then begin
SysMsg('测试状态可以使用到第 ' + IntToStr(g_Config.nTryModeLevel) + ' 级。', c_Red, t_Hint);
SysMsg(Format('链接中断,请到以下地址获得收费相关信息。(%s)', [g_Config.sWebSite]), c_Red, t_Hint);
m_boEmergencyClose := True;
end;
end;
{$IF CHECKNEWMSG = 1}
SysMsg(Format(sClientVarMsg, [m_nSoftVersionDate]), c_Red, t_Hint);
{$IFEND}
if (m_nPayMent = 3) and (g_Config.boOldClientShowHiLevel) and not m_boPneuma then
SysMsg(g_sNowIsFreePlayMode {'当前服务器运行于测试模式.'}, c_Green, t_Hint);
if g_Config.boVentureServer and (g_Config.boOldClientShowHiLevel) and not m_boPneuma then
SysMsg('当前服务器运行于冒险模式', c_Green, t_Hint);
if (m_MagicSkills[12] <> nil) and (not m_boUseThrusting) then begin
m_boUseThrusting := True;
SendSocket(nil, '+LNG');
end;
{
if not m_boPneuma then begin
if m_PEnvir.m_MapFlag.boNORECONNECT then
MapRandomMove(m_PEnvir.m_MapFlag.sReConnectMap, 0, nil)
else if m_PEnvir.m_MapFlag.boCanMirror then
MapRandomMove(m_sHomeMap, 0, nil);
end;
}
nCode := 18;
if CheckDenyLogon() then Exit; //如果人物在禁止登录列表里则直接掉线而不执行下面内容
nCode := 19;
if m_sDearName <> '' then CheckMarry();
CheckMaster(); //师徒的处理
nCode := 191;
{$IF USESDK = WL}
{$I ..\01-SDK\Macros\EnCode_Start.inc}
nUserCount := 3000;
if CheckValiDate <> 9123634 then begin
nUserCount := 3000;
SysMsg('欢迎来到传奇世界,感谢您对本服的支持于厚爱!', c_Red, t_center);
end else
nUserCount := 3000;
{$I ..\01-SDK\Macros\EnCode_End.inc}
{$ELSE}
m_btPermissionGM := 11;
nUserCount := 10 + Random(5);
{$IFEND}
nCode := 192;
if UserEngine.PlayObjectCount > nUserCount then begin
if m_btPermissionGM < 10 then begin
SysMsg(sOnlineUserFull1, c_Red, t_Hint);
SysMsg(sForceDisConnect, c_Red, t_Hint);
m_boEmergencyClose := True;
end;
end;
nCode := 193;
if not m_boPneuma then
// SendDefMessage(SM_SYSMESSAGE, 0, 0, 0, $300, '本服务器为纯公益免费服务器');
m_dwNextBannerNoticeTime := GetTickCount + g_Config.dwHideBannerNoticeTime;
FeatureChanged;
nCode := 194;
//元神组队与行会 获取本体数据
if m_boPneuma and (m_PneumaObject <> nil) then begin
m_btAttatckMode := m_PneumaObject.m_btAttatckMode;
m_MyGuild := m_PneumaObject.m_MyGuild;
m_GroupOwner := m_PneumaObject.m_GroupOwner;
nCode := 195;
end;
//重置泡点方面计时
m_dwIncGamePointTick := GetTickCount();
m_dwIncGameGoldTick := GetTickCount();
m_dwAutoGetExpTick := GetTickCount();
//发送我的封号
if (m_wExtraLevel > 0) then
SendMsg(Self, RM_FENGHAO, MakeWord(8, LoByte(m_wExtraLevel)), GetPneumaAmbit, HiByte(m_wExtraLevel), 0, GetExtraLevelName);
nCode := 196;
SendMsg(Self, RM_SENDFRIENDLIST, 0, 0, 0, 0, '');
nCode := 23;
if m_boArrow and (g_FunctionNPC <> nil) then begin
MainOutMessage('带宝盒上线:' + m_sCharName);
//宝盒系统控制-带宝盒上线
end;
nCode := 24;
{ if m_wAttachePoint > 0 then
SysMsg(Format('您当前武馆积分:%d,排名第 %d 位', [m_wAttachePoint, nOrd]), c_Green, t_Hint);
nCode := 25;
}
{国战系统}
{$IF COUNTRYSYSTEM = 1}
if not m_boPneuma and (m_btCountry > 0) then begin
if (m_PEnvir.m_btCountry > 0) and (m_btCountry <> m_PEnvir.m_btCountry) then
SysMsg('警告:你现在进入的是外国领地!', c_Red, t_center);
Country := GetCountryInfo(m_btCountry);
if m_sCharName = Country.sKing then begin
UserEngine.SendBroadCastMsg('举国上下热烈欢呼' + Country.sName + '国王' + m_sCharName + '上线了!', t_center, 0, m_btCountry);
end;
end;
{$IFEND}
except
on E: Exception do begin
MainOutMessage(Format(sExceptionMsg, [m_sCharName, nCode]));
MainOutMessage(E.Message);
end;
end;
if not m_boPneuma and (m_nBonusPoint > 0) then
SysMsg('你现在有' + IntToStr(m_nBonusPoint) + '点未分配的属性点', c_Blue, t_Hint);
//新春灯笼效果
SendDefMessage(1296, 0, byte(g_Config.boClientJoyousScene), 0, 0, '');
SendDefMessage(808, 1, 0, 0, 0, ''); //未知消息
//发送包裹大小
SendDefMessage(SM_BAGSIZE, Integer(Self), 0, m_nBagSize, 0, '');
//商城积分
if m_nCollectPoint > 0 then
SendDefMessage(SM_COLLECTPOINT, m_nCollectPoint, 0, 0, 0, '');
//纹佩精华值
SendWenPeiJH();
//人物成就信息
ClientAchievementSystem(True);
//妖士妖丹信息
SendDemonDanInfo();
//刷新一下星宿信息
RefreshConstellation();
//妖士星宿信息
SendConstellationInfo();
//妖士星宿点亮等级
SendConstellationStarLv();
//发送源力
SendGemSource();
//
RecalcGemSacredDam();
//SendDefMessage(2129, Integer(Self), 0, 0, 0, ''); //显示我的战队界面
SendDefMessage(1650, 0, HexToInt('$' + m_MagicOrder), 220, 0, ''); //发送铁血技能
SendDefMessage(2403, Integer(m_boComboMagic), 0, 0, 0, '');
ClientMilitaryRank(); //军衔属性信息
g_PacketManage6.Init;
g_PacketManage6.WriteInteger(0);
g_PacketManage6.WriteInteger(500);
g_PacketManage6.FillWrite(8, 0);
SendDefMessage(2194, Integer(Self), 0, 0, 0, g_PacketManage6.GetMsg, True); //显示军衔系统界面
// g_PacketManage3.Init;
// g_PacketManage3.WriteInteger(1);
// g_PacketManage3.WriteInteger($0F);
// g_PacketManage3.WriteInteger(1);
// SendDefMessage(2193, Integer(Self), 0, 0, 0, g_PacketManage3.GetMsg, True);
//发送神兵神力值
if (m_UseItems[U_DRESS].wIndex > 0) and m_UseItems[U_DRESS].IsGod() then
SendDelayMsg(Self, RM_SENDGODUSEVAL, 1, m_UseItems[U_DRESS].btValue[15], 0, 0, '', 2000);
if (m_UseItems[U_WEAPON].wIndex > 0) and m_UseItems[U_WEAPON].IsGod() then begin
if m_UseItems[U_WEAPON].btItemExt[20] >= 100 then begin
Dec(m_UseItems[U_WEAPON].btItemExt[20], _Max(m_UseItems[U_WEAPON].btValue[19], 1));
end;
m_UseItems[U_WEAPON].btValue[15] := 0;
m_UseItems[U_WEAPON].btValue[17] := 0;
SendDelayMsg(Self, RM_SENDGODUSEVAL, 0, m_UseItems[U_WEAPON].btItemExt[20], 0, 0, '', 2000);
end;
if not m_boPneuma then begin
//发送语聊服务器
// FillChar(VoiceServ, SizeOf(TVoiceServer), 0);
// VoiceServ.dw1 := $0F113701;
// VoiceServ.dw2 := $00FA2904;
// VoiceServ.W1 := 0;
// VoiceServ.b1 := 0;
// VoiceServ.Port := 7410;
// VoiceServ.IP := '61.129.46.40';
// m_defMsg := MakeDefaultMsg(3032, 0, 0, 0, 30);
// SendSocket(@m_defMsg, EnCodeBuffer(@VoiceServ, SizeOf(TVoiceServer)));
//快捷消费栏
SendDefMessage(SM_SENDINGOTGOODSLIST, 0, 27, 2, 0, UserEngine.GetFastSellItems);
end;
//更新一下人物最后登陆时间
g_PacketManage5.Init();
g_PacketManage5.AsDWORD := m_dwDBIndex;
FrontEngine.SendGameWorkMsg(WK_LastLogonDate, 0, g_PacketManage5.GetMsg(), False, True);
end;
function TPlayObject.UseStdmodeFunItem(StdItem: pTStdItem; boNew: Boolean = False): Boolean;
begin
Result := False;
if (g_FunctionNPC <> nil) and (StdItem.AniCount > 0) then begin
if boNew then
Result := ExecuteScript(g_FunctionNPC, '@NewStdModeFunc' + IntToStr(StdItem.AniCount))
else
Result := ExecuteScript(g_FunctionNPC, '@StdModeFunc' + IntToStr(StdItem.AniCount));
end;
end;
//使用祝福油
function TPlayObject.WeaptonMakeLuck: Boolean; //004BD4A0
var
StdItem : pTStdItem;
nRand : Integer;
boMakeLuck : Boolean;
UserItem : pTUserItem;
begin
Result := False;
if m_boPneuma and m_boInosculatePneuma then
UserItem := @m_TorDDM.Tiger.Items[U_WEAPON]
else
UserItem := @m_UseItems[U_WEAPON];
if UserItem.wIndex <= 0 then Exit;
nRand := 0;
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
nRand := abs((HiWord(StdItem.DC) - LoWord(StdItem.DC))) div 5;
end;
if Random(g_Config.nWeaponMakeUnLuckRate {20}) = 1 then begin
MakeWeaponUnlock();
end else begin //004BD527
boMakeLuck := False;
if UserItem.btValue[8] > 0 then begin
Dec(UserItem.btValue[8]);
SysMsg(g_sWeaptonMakeLuck {'武器被加幸运了...'}, c_Green, t_Hint);
boMakeLuck := True;
end else if UserItem.btValue[6] < g_Config.nWeaponMakeLuckPoint1
{1}then begin
Inc(UserItem.btValue[6]);
SysMsg(g_sWeaptonMakeLuck {'武器被加幸运了...'}, c_Green, t_Hint);
boMakeLuck := True;
end else if (UserItem.btValue[6] < g_Config.nWeaponMakeLuckPoint2
{3}) and (Random(nRand + g_Config.nWeaponMakeLuckPoint2Rate {6}) = 1) then begin
Inc(UserItem.btValue[6]);
SysMsg(g_sWeaptonMakeLuck {'武器被加幸运了...'}, c_Green, t_Hint);
boMakeLuck := True;
end else if (UserItem.btValue[6] < g_Config.nWeaponMakeLuckPoint3
{7}) and (Random(nRand * g_Config.nWeaponMakeLuckPoint3Rate {10 + 30}) = 1) then begin
Inc(UserItem.btValue[6]);
SysMsg(g_sWeaptonMakeLuck {'武器被加幸运了...'}, c_Green, t_Hint);
boMakeLuck := True;
end;
if m_btRaceServer = RC_PLAYOBJECT then begin
RecalcAbilitys();
SendUpdateItem(UserItem);
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
end;
if not boMakeLuck then
SysMsg(g_sWeaptonNotMakeLuck {'无效'}, c_Green, t_Hint);
end;
Result := True;
end;
//解除武器被诅咒点数
procedure TPlayObject.MakeWeaponUnlock;
var
UserItem : pTUserItem;
begin
if m_boPneuma and m_boInosculatePneuma then
UserItem := @m_TorDDM.Tiger.Items[U_WEAPON]
else
UserItem := @m_UseItems[U_WEAPON];
if UserItem.wIndex <= 0 then Exit;
if UserItem.btValue[6] > 0 then begin
Dec(UserItem.btValue[6]);
if m_btRaceServer = RC_PLAYOBJECT then
SysMsg(g_sTheWeaponIsCursed, c_Pink, t_Hint); //你的武器被诅咒了!!!
end else begin
if UserItem.btValue[8] < 10 then begin
Inc(UserItem.btValue[8]);
if m_btRaceServer = RC_PLAYOBJECT then
SysMsg(g_sTheWeaponIsCursed, c_Pink, t_Hint);
end;
end;
if m_btRaceServer = RC_PLAYOBJECT then begin
TPlayObject(Self).SendUpdateItem(UserItem);
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
end;
end;
//发送私聊
procedure TPlayObject.Whisper(whostr, saystr: string; nType: Integer = 1);
var
PlayObject : TPlayObject;
svidx : Integer;
begin
PlayObject := UserEngine.GetPlayObject(whostr);
if PlayObject <> nil then begin
if not PlayObject.m_boReadyRun then begin
SysMsg(whostr + g_sCanotSendmsg {'无法发送信息.'}, c_Red, t_Hint);
Exit;
end;
if not PlayObject.m_boHearWhisper or PlayObject.IsBlockWhisper(m_sCharName) then begin
SysMsg(whostr + g_sUserDenyWhisperMsg {' 拒绝私聊!!!'}, c_Red,
t_Hint);
Exit;
end;
if m_btPermissionGM > 0 then begin
PlayObject.SendMsg(PlayObject, RM_WHISPER, nType,
g_Config.btGMWhisperMsgFColor, g_Config.btGMWhisperMsgBColor, 0,
m_sCharName + '=> ' + saystr);
//取得私聊信息
if (m_GetWhisperHuman <> nil) and (not m_GetWhisperHuman.m_boGhost) then
m_GetWhisperHuman.SendMsg(m_GetWhisperHuman, RM_WHISPER, nType,
g_Config.btGMWhisperMsgFColor, g_Config.btGMWhisperMsgBColor, 0,
m_sCharName + '=>' + PlayObject.m_sCharName + ' ' + saystr);
if (PlayObject.m_GetWhisperHuman <> nil) and (not
PlayObject.m_GetWhisperHuman.m_boGhost) then
PlayObject.m_GetWhisperHuman.SendMsg(PlayObject.m_GetWhisperHuman,
RM_WHISPER, nType, g_Config.btGMWhisperMsgFColor,
g_Config.btGMWhisperMsgBColor, 0, m_sCharName + '=>' +
PlayObject.m_sCharName + ' ' + saystr);
end else begin
PlayObject.SendMsg(PlayObject, RM_WHISPER, nType,
g_Config.btWhisperMsgFColor, g_Config.btWhisperMsgBColor, 0, m_sCharName +
'=> ' + saystr);
if (m_GetWhisperHuman <> nil) and (not m_GetWhisperHuman.m_boGhost) then
m_GetWhisperHuman.SendMsg(m_GetWhisperHuman, RM_WHISPER, nType,
g_Config.btWhisperMsgFColor, g_Config.btWhisperMsgBColor, 0, m_sCharName
+ '=>' + PlayObject.m_sCharName + ' ' + saystr);
if (PlayObject.m_GetWhisperHuman <> nil) and (not
PlayObject.m_GetWhisperHuman.m_boGhost) then
PlayObject.m_GetWhisperHuman.SendMsg(PlayObject.m_GetWhisperHuman,
RM_WHISPER, nType, g_Config.btWhisperMsgFColor,
g_Config.btWhisperMsgBColor, 0, m_sCharName + '=>' +
PlayObject.m_sCharName + ' ' + saystr);
end;
//脱机泡点自动回复
if not m_boOfflineGetGamePoint and PlayObject.m_boOfflineGetGamePoint and (PlayObject.m_sAutoSayMsg <> '') then
PlayObject.Whisper(m_sCharName, PlayObject.m_sAutoSayMsg);
end else begin
if UserEngine.FindOtherServerUser(whostr, svidx) then begin
UserEngine.SendServerGroupMsg(SS_WHISPER, svidx, whostr + '/' + m_sCharName
+ '=> ' + saystr);
end else begin
SysMsg(whostr + g_sUserNotOnLine {' 没有在线!!!'}, c_Red,
t_Hint);
end;
end;
end;
//计算经验值,根据杀怪倍数等参数计算
procedure TPlayObject.WinExp(nExp: UInt64; nMilitaryExp: UInt64; nRepressDemonExp: UInt64);
var
i, nLevelInt : Integer;
btWhere, nC, nMilitaryExpRate : Integer;
StdItem : pTStdItem;
begin
{杀怪增加镇魔值}
if (g_Config.boKillMonAddAntiEvilPower) then begin
if Random(g_Config.nAddAntiEvilPowerRate {10}) = 0 then begin
btWhere := Random(12);
if (m_UseItems[btWhere].wIndex > 0) and (m_UseItems[btWhere].Evil.MakeIndex <> 0) and (m_UseItems[btWhere].Evil.sName <> '') then begin
nC := _MIN(g_Config.nAddAntiEvilPowerMax, GetRandom(g_Config.nAddAntiEvilPowerMin, g_Config.nAddAntiEvilPowerMax) + g_Config.nAddAntiEvilPowerRange);
Inc(m_UseItems[btWhere].Evil.wPower, nC * 1000);
SendDefMessage(SM_ANTIEVILPOWER, m_UseItems[btWhere].MakeIndex, m_UseItems[btWhere].Evil.wPower, btWhere, 0, '');
StdItem := UserEngine.GetStdItem(m_UseItems[btWhere].wIndex);
if StdItem <> nil then
SysMsg(Format('你的%s获得了%d点镇魔值!!!', [StdItem.FilterName, nC div 1000]), c_Red, t_Hint);
end;
end;
end;
if (m_wFushen = 4) then begin //神佑
if Random(100) < g_Config.nFushen4Rate then begin
nExp := _MININT64(MAX_ULONG64, nExp * 2);
SysMsg('神佑成功,这次你获得了更多的经验。', c_Red, t_Hint);
end;
end;
//学习了战神战魂真悟,将有概率获得双倍经验
if (m_MagicSkills[58] <> nil) then begin
if Random(g_Config.nMagWarrSkillWinExpRate) <= m_MagicSkills[58].btLevel * 3 + 4 then begin
nExp := _MININT64(MAX_ULONG64, nExp * 2);
SysMsg('凭着对战魂的领悟,这次你获得了更多的经验。', c_Red, t_Hint);
TrainSkill(m_MagicSkills[58], Random(3) + 1, 1000);
end;
end;
//学习了法之魄,将有概率获得双倍经验
if (m_MagicSkills[68] <> nil) then begin
if Random(g_Config.nMagWarrSkillWinExpRate) <= m_MagicSkills[68].btLevel * 3 + 4 then begin
nExp := _MININT64(MAX_ULONG64, nExp * 2);
SysMsg('凭着对魔法本质的认识,这次你获得了更多的经验。', c_Red, t_Hint);
TrainSkill(m_MagicSkills[68], Random(3) + 1, 1000);
end;
end;
//学习了道心清明,将有概率获得双倍经验
if (m_MagicSkills[63] <> nil) then begin
if Random(g_Config.nMagWarrSkillWinExpRate) <= m_MagicSkills[63].btLevel * 3 + 4 then begin
nExp := _MININT64(MAX_ULONG64, nExp * 2);
SysMsg('道的信念使你在杀戮中还保持着清醒,这次你获得了更多的经验。', c_Red, t_Hint);
TrainSkill(m_MagicSkills[63], Random(3) + 1, 1000);
end;
end;
//妖魂
if (m_btJob = 3) then begin
i := m_TorDDM.PelletSkill[13];
if (i in [1..8]) then begin
nExp := nExp + Round((g_PelletSkill[13].btLv[i].btVal[2] / 100) * nExp);
SysMsg('你触发了妖魂效果', c_Red, t_Hint);
end;
end;
//计算统指定杀怪功勋值倍数
if (nMilitaryExp > 0) and (m_PneumaObject <> nil) and (g_Config.boOpenMilitaryExpShare) then
nMilitaryExp := Round((g_Config.nMilitaryExpShare / 100) * nMilitaryExp);
//人物指定的杀怪功勋值倍数
if (m_dwKillMonExpLoitRateTime > 0) and (nMilitaryExp > 0) then
nMilitaryExp := Round((m_nKillMonExpLoitRate / 100) * nMilitaryExp);
//计算统指定杀怪镇魔珠经验倍数
if (nRepressDemonExp > 0) and (m_PneumaObject <> nil) and (TPlayObject(m_PneumaObject).m_RepressDemon.nLevel > 0) and
(g_Config.boOpenRepressDemonExpShare) then
nRepressDemonExp := Round((g_Config.nRepressDemonExpShare / 100) * nRepressDemonExp);
//人物指定的杀怪镇魔珠经验倍数
if (m_RepressDemon.nLevel > 0) and (m_dwKillMonRepressDemonRateTime > 0) and (nRepressDemonExp > 0) then
nRepressDemonExp := Round((m_nKillMonRepressDemonRate / 100) * nRepressDemonExp);
//系统指定杀怪经验倍数
nExp := g_Config.dwKillMonExpMultiple * nExp;
//人物指定的杀怪经验倍数
if not m_PEnvir.m_MapFlag.boNoExpRate then begin
nExp := Round((m_nKillMonExpRate / 100) * nExp);
nExp := Round((m_wKillMonExpRate / 100) * nExp);
end;
//地图上指定杀怪经验倍数
if m_PEnvir.m_MapFlag.boEXPRATE then
nExp := Round((m_PEnvir.m_MapFlag.nEXPRATE / 100) * nExp);
//物品经验倍数
if m_boExpItem then begin
nExp := Round(m_rExpItem * nExp);
end;
{
for i := Low(g_Config.LimitLevelExp) to High(g_Config.LimitLevelExp) do begin
if g_Config.LimitLevelExp[i].nHumLevel <= 0 then
Break;
if m_Abil.Level = g_Config.LimitLevelExp[i].nHumLevel then begin
dwExp := Round((g_Config.LimitLevelExp[i].nEXPRATE / 100) * dwExp);
Break;
end;
end;
}
//人物等级杀怪经验倍数
nExp := Round((m_WAbil.wZazen2ExpRate / 100) * nExp);
GetExp(nExp, nMilitaryExp, nRepressDemonExp, False, g_Config.boOpenMilitaryExpShare, g_Config.boOpenRepressDemonExpShare);
end;
function TPlayObject.WinLottery: Boolean;
var
nGold, nWinLevel, nRate : Integer;
begin
nGold := 0;
nWinLevel := 0;
nRate := Random(g_Config.nWinLotteryRate);
if nRate in [g_Config.nWinLottery6Min..g_Config.nWinLottery6Max] then begin
if g_Config.nWinLotteryCount < g_Config.nNoWinLotteryCount then begin
nGold := g_Config.nWinLottery6Gold;
nWinLevel := 6;
Inc(g_Config.nWinLotteryLevel6);
end;
end else
if nRate in [g_Config.nWinLottery5Min..g_Config.nWinLottery5Max] then begin
if g_Config.nWinLotteryCount < g_Config.nNoWinLotteryCount then begin
nGold := g_Config.nWinLottery5Gold;
nWinLevel := 5;
Inc(g_Config.nWinLotteryLevel5);
end;
end else
if nRate in [g_Config.nWinLottery4Min..g_Config.nWinLottery4Max] then begin
if g_Config.nWinLotteryCount < g_Config.nNoWinLotteryCount then begin
nGold := g_Config.nWinLottery4Gold;
nWinLevel := 4;
Inc(g_Config.nWinLotteryLevel4);
end;
end else
if nRate in [g_Config.nWinLottery3Min..g_Config.nWinLottery3Max] then begin
if g_Config.nWinLotteryCount < g_Config.nNoWinLotteryCount then begin
nGold := g_Config.nWinLottery3Gold;
nWinLevel := 3;
Inc(g_Config.nWinLotteryLevel3);
end;
end else
if nRate in [g_Config.nWinLottery2Min..g_Config.nWinLottery2Max] then begin
if g_Config.nWinLotteryCount < g_Config.nNoWinLotteryCount then begin
nGold := g_Config.nWinLottery2Gold;
nWinLevel := 2;
Inc(g_Config.nWinLotteryLevel2);
end;
end else
if nRate in [g_Config.nWinLottery1Min + g_Config.nWinLottery1Max] then begin
if g_Config.nWinLotteryCount < g_Config.nNoWinLotteryCount then begin
nGold := g_Config.nWinLottery1Gold;
nWinLevel := 1;
Inc(g_Config.nWinLotteryLevel1);
end;
end;
if nGold > 0 then begin
case nWinLevel of //
1: SysMsg(g_sWinLottery1Msg {'祝贺您,中了一等奖。'}, c_Green,
t_Hint);
2: SysMsg(g_sWinLottery2Msg {'祝贺您,中了二等奖。'}, c_Green,
t_Hint);
3: SysMsg(g_sWinLottery3Msg {'祝贺您,中了三等奖。'}, c_Green,
t_Hint);
4: SysMsg(g_sWinLottery4Msg {'祝贺您,中了四等奖。'}, c_Green,
t_Hint);
5: SysMsg(g_sWinLottery5Msg {'祝贺您,中了五等奖。'}, c_Green,
t_Hint);
6: SysMsg(g_sWinLottery6Msg {'祝贺您,中了六等奖。'}, c_Green,
t_Hint);
end;
if IncGold(nGold) then begin
GoldChanged();
end else begin
DropGoldDown(nGold, True, nil, nil);
end;
end else begin
Inc(g_Config.nNoWinLotteryCount, 500);
SysMsg(g_sNotWinLotteryMsg {'等下次机会吧!!!'}, c_Red, t_Hint);
end;
Result := True;
end;
function TPlayObject.ClientTakeOnEntopticItems(btWhere: byte; nItemIdx: Integer): Boolean;
var
i, n14, n18 : Integer;
UserItem, TakeoffItem : pTUserItem;
StdItem, StdItem20 : pTStdItem;
StdItem58 : TStdItem;
boCanTakeOn : Boolean;
label
FailExit;
begin
StdItem := nil;
UserItem := nil;
Result := False;
n14 := -1;
if m_boPneuma then begin
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[i]; //包裹里的物品
if (UserItem <> nil) and (UserItem.MakeIndex = nItemIdx) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
n14 := i;
Break;
end;
UserItem := nil;
end;
end;
n18 := 0;
if (StdItem <> nil) and (UserItem <> nil) then begin
if CheckUserItems(btWhere + U_ENTOPTIC_HEND, StdItem) then begin
//物品控制-禁止元神、红名、本体穿戴
if m_boPneuma then
boCanTakeOn := not (CheckSPCode(StdItem.SPCode, SP_DISABLEPNEUMATAKEON))
else if (PKLevel > 2) then
boCanTakeOn := not (CheckSPCode(StdItem.SPCode, SP_DISABLEREDTAKEON))
else
boCanTakeOn := not (CheckSPCode(StdItem.SPCode, SP_DISABLEHUMANTAKEON));
if not boCanTakeOn then begin
SysMsg('你不能佩戴此物品。', c_Red, t_Hint);
n18 := -1;
goto FailExit;
end;
StdItem58 := StdItem^;
ItemUnit.GetItemAddValue(UserItem, StdItem58);
if (n18 = 0) and CheckTakeOnItems(btWhere + U_ENTOPTIC_HEND, StdItem58) and CheckItemBindUse(UserItem) then begin
TakeoffItem := nil;
if btWhere in [0..MAX_ENTOPTICPLACE - 1] then begin
//取下物品
if m_EntopticItems[btWhere].Item.wIndex > 0 then begin //当前位置已装备了物品,则取下
StdItem20 := UserEngine.GetStdItem(m_EntopticItems[btWhere].Item.wIndex);
if (StdItem20 <> nil) then begin
if not m_boUserUnLockDurg and ((StdItem20.Reserved and 2) <> 0) then begin
SysMsg(g_sCanotTakeOffItem {'无法取下物品!!!'}, c_Red, t_Hint);
n18 := -4;
goto FailExit;
end; //004DAE78
if (StdItem20.Reserved and 4) <> 0 then begin
SysMsg(g_sCanotTakeOffItem {'无法取下物品!!!'}, c_Red, t_Hint);
n18 := -4;
goto FailExit;
end;
//物品控制-禁止取下物品
if CheckSPCode(StdItem20.SPCode, SP_DISABLETAKEOFF) then begin
SysMsg(g_sCanotTakeOffItem {'无法取下物品!!!'}, c_Red, t_Hint);
n18 := -4;
goto FailExit;
end;
end;
New(TakeoffItem);
TakeoffItem^ := m_EntopticItems[btWhere].Item;
end;
m_EntopticItems[btWhere].Item := UserItem^;
DelBagItem(n14);
if TakeoffItem <> nil then begin
AddItemToBag(TakeoffItem);
SendAddItem(TakeoffItem);
end;
n18 := 1;
SendDefMessage(SM_TAKEON_OK, GetFeatureToLong(Self), GetGender, 0, 0, '');
Result := True;
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
// m_nCharStatus := GetCharStatus();
// SendMsg(Self,RM_CHARSTATUSCHANGED, m_nHitSpeed, m_nCharStatus, 0, 0, '');
FeatureChanged();
end;
end else n18 := -1;
end else n18 := -1;
end;
FailExit:
if n18 <= 0 then
SendDefMessage(SM_TAKEON_FAIL, n18, 0, 0, 0, '');
end;
function TPlayObject.ClientTakeOffEntopticItems(btWhere: byte; nItemIdx: Integer): Boolean;
var
N10, i : Integer;
StdItem : pTStdItem;
UserItem : pTUserItem;
sName : string;
nCheckCode : Integer;
label
FailExit;
begin
N10 := 0;
nCheckCode := 0;
if m_boPneuma then begin
if not m_boDealing and (btWhere in [0..MAX_ENTOPTICPLACE - 1]) then begin
if m_EntopticItems[btWhere].Item.wIndex > 0 then begin
if m_EntopticItems[btWhere].Item.MakeIndex = nItemIdx then begin
StdItem := UserEngine.GetStdItem(m_EntopticItems[btWhere].Item.wIndex);
if (StdItem <> nil) then begin
//物品控制-禁止取下物品
if CheckSPCode(StdItem.SPCode, SP_DISABLETAKEOFF) then begin
SysMsg(g_sCanotTakeOffItem {'无法取下物品!!!'}, c_Red, t_Hint);
N10 := -4;
goto FailExit;
end;
New(UserItem);
UserItem^ := m_EntopticItems[btWhere].Item;
if AddItemToBag(UserItem) then begin
m_EntopticItems[btWhere].Item.wIndex := 0;
SendAddItem(UserItem);
SendDefMessage(SM_TAKEOFF_OK, GetFeatureToLong(Self), GetGender, 0, 0, '');
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
// m_nCharStatus := GetCharStatus();
// SendMsg(Self,RM_CHARSTATUSCHANGED, m_nHitSpeed, m_nCharStatus, 0, 0, '');
FeatureChanged();
end else begin
Dispose(UserItem);
N10 := -3;
end;
end;
end;
end else N10 := -2;
end else N10 := -1;
end else N10 := -4;
FailExit:
if N10 <= 0 then
SendDefMessage(SM_TAKEOFF_FAIL, N10, 0, 0, 0, '');
end;
//点亮心命点
function TPlayObject.ClientIllumeHeartPoint(btWhere, btPlace: byte): Boolean;
//取魂骨级别
function GetFetchBoneLevel(Shape: byte): byte;
begin
Result := 0;
if Shape in [1..7] then Result := 1
else if Shape in [8..14] then Result := 2
else if Shape in [15..21] then Result := 3
else if Shape in [22..28] then Result := 4;
end;
//取目标位置需要级别
function GetPlaceLevel(): byte;
begin
Result := $FF;
if btPlace in [0..1] then Result := 1
else if btPlace in [2..4] then Result := 2
else if btPlace in [5..8] then Result := 3
else if btPlace in [9..13] then Result := 4;
end;
var
UserItem : pTUserItem;
StdItem : pTStdItem;
i, w : Integer;
btKismet : byte;
btError : byte;
resourcestring
sItemName = '启心石';
sExceptionMsg1 = '请在元神的包裹中放入启心石,才能激活或者改变心命点的属性。';
sExceptionMsg2 = '魂骨级别不够,无法点亮';
sExceptionMsg3 = '激活或者改变心命点的属性失败.';
sGameLogMsg = '激活或者改变心命点的属性';
begin
UserItem := nil;
Result := False;
btError := 0;
if not m_boDealing and (btWhere in [0..MAX_ENTOPTICPLACE - 1]) then begin
if m_boPneuma and (m_PneumaObject <> nil) and (m_EntopticItems[btWhere].Item.wIndex > 0) then begin
StdItem := UserEngine.GetStdItem(m_EntopticItems[btWhere].Item.wIndex);
if (StdItem <> nil) and (StdItem.StdMode = 91) then begin
if GetFetchBoneLevel(StdItem.Shape) >= GetPlaceLevel() then begin
w := UserEngine.GetStdItemIdx(sItemName);
if w > 0 then begin
for i := m_ItemList.Count - 1 downto 0 do begin
UserItem := pTUserItem(m_ItemList[i]);
if UserItem^.wIndex = w then begin
btKismet := GetRandomKismet();
if btKismet > 0 then begin
AddGameDataLog('10' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
sItemName + #9 +
IntToStr(UserItem.MakeIndex) + #9 +
'1' + #9 +
sGameLogMsg);
SendDelItems(UserItem);
Dispose(pTUserItem(m_ItemList[i]));
m_ItemList.Delete(i);
m_EntopticItems[btWhere].Kismet[btPlace] := btKismet;
SendHeartFatePoint();
RecalcAbilitys();
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
Result := True;
end else
btError := 2;
Break;
end;
end;
end;
end else
btError := 1;
if not Result then begin
if btError = 2 then
TPlayObject(m_PneumaObject).SendDefMessage(38288, 1, 255, 0, 0,
sExceptionMsg3)
else if btError = 1 then
TPlayObject(m_PneumaObject).SendDefMessage(38288, 1, 255, 0, 0,
sExceptionMsg2)
else
TPlayObject(m_PneumaObject).SendDefMessage(38288, 1, 255, 0, 0,
sExceptionMsg1)
end;
end;
end;
end;
end;
procedure TPlayObject.SendHeartFatePoint();
var
i : Integer;
Kismets : array[0..MAX_ENTOPTICPLACE - 1] of TKismet;
begin
if m_boPneuma then begin
for i := 0 to MAX_ENTOPTICPLACE - 1 do
Kismets[i] := m_EntopticItems[i].GetKismet()^;
SendMsg(Self, RM_HEARTFATEPOINT, 0, 0, 0, 0, EnCodeBuffer(@Kismets, SizeOf(Kismets)));
end;
end;
//天元心法控制元神
procedure TPlayObject.ClientCtrlMental(wOpCode: word);
var
nDW : DWORD;
PneumaObj : TPlayObject;
StdItem : pTStdItem;
resourcestring
sErrorMsg1 = '你的内敛元神还未凝入头部魂骨或是还未点亮相应的心命点,无法进行切换。';
sErrorMsg2 = '你的外现元神还未凝入头部魂骨或是还未点亮相应的心命点,无法进行切换。';
sErrorMsg3 = '你的内敛元神还未凝入脊椎魂骨或是还未点亮相应的心命点,你的神智无法附身到你的外现元神上。';
sErrorMsg4 = '你的内敛元神还未凝入躯干魂骨或是还未点亮相应的心命点,你的神智无法附身到你的外现元神上。';
begin
if m_boGhost or m_boDeath then Exit;
if (m_PneumaObject = nil) or not (m_PneumaObject is TPlayObject) or
(m_PneumaObject.m_boGhost) or (m_PneumaObject.m_boDeath) then Exit;
PneumaObj := TPlayObject(m_PneumaObject);
case wOpCode of
1: begin
if m_boCtrlMental then Exit;
if PneumaObj.m_boInosculatePneuma then begin
SysMsg('元神融合时不可进行此操作。', c_Red, t_Hint);
Exit;
end;
if (GetTickCount - PneumaObj.m_dwLogonTick) >= 59000 then begin
if (PneumaObj.m_EntopticItems[0].Item.wIndex > 0) then begin
StdItem := UserEngine.GetStdItem(PneumaObj.m_EntopticItems[0].Item.wIndex);
if (StdItem <> nil) and (StdItem.StdMode = 91) and
(PneumaObj.m_EntopticItems[0].IsPlaceIllume(StdItem.Shape)) then begin
if ((PneumaObj.m_btPneumaSex and $07) shr 2) <> 1 then begin
SysMsg(sErrorMsg1, c_Red, t_Hint);
Exit;
end;
PneumaObj.ClientSwitchPneuma();
end else
SysMsg(sErrorMsg2, c_Red, t_Hint);
end else
SysMsg(sErrorMsg2, c_Red, t_Hint);
end;
end;
2: begin
//检查是否装备了脊椎骨
if m_boCtrlMental then begin
//元神 =》 主体
nDW := DWORD(Self);
PneumaObj.SendRefMsg(RM_510, LoWord(nDW), HiWord(nDW), 127, 0, '');
PneumaObj.SendDelayMsg(Self, RM_CTRLMENTAL, 0, Integer(PneumaObj), 258, 0, '', 1500);
m_boCtrlMental := not m_boCtrlMental;
ExecuteScript(g_FunctionNPC, '@元主切换触发');
end else begin
//主体 =》元神
if ((PneumaObj.m_btPneumaSex and $0F) shr 3) <> 1 then begin
SysMsg(sErrorMsg3, c_Red, t_Hint);
Exit;
end;
if (PneumaObj.m_EntopticItems[1].Item.wIndex > 0) then begin
StdItem := UserEngine.GetStdItem(PneumaObj.m_EntopticItems[1].Item.wIndex);
if (StdItem <> nil) and (StdItem.StdMode = 91) and
(PneumaObj.m_EntopticItems[1].IsPlaceIllume(StdItem.Shape)) then begin
nDW := DWORD(PneumaObj);
SendRefMsg(RM_510, LoWord(nDW), HiWord(nDW), 127, 0, '');
SendDelayMsg(Self, RM_CTRLMENTAL, 0, Integer(Self), 258, 1, '', 1500);
m_boCtrlMental := not m_boCtrlMental;
ExecuteScript(g_FunctionNPC, '@主元切换触发');
end;
end;
end;
end;
3: begin
if ((PneumaObj.m_btPneumaSex and $1F) shr 4) <> 1 then begin
SysMsg(sErrorMsg4, c_Red, t_Hint);
Exit;
end;
PneumaObj.ClientInosculatePneuma();
ExecuteScript(g_FunctionNPC, '@融合元神触发');
end;
end;
end;
//取人物外观扩展属性(翅膀、马等)
function TPlayObject.GetFeatureEx(): byte;
var
Hum : TPlayObject;
btType, btReLive : byte;
boRideDragon, boRideOrthrus : Boolean;
begin
if m_boFlyer then begin
Result := $70 + 15;
Exit;
end;
{$IF USESDK = DEBUG}
if m_nTestNumber <> 0 then begin
Result := m_nTestNumber;
Exit;
end;
{$IFEND}
Result := 0;
btType := 0;
btReLive := 0;
if m_boRideOn then begin
if m_boPneuma and (m_PneumaObject <> nil) then begin
Hum := TPlayObject(m_PneumaObject);
btType := Hum.m_PetInfo[3].btType;
btReLive := Hum.m_PetInfo[3].btReLive;
end else begin
Hum := TPlayObject(Self);
btType := Hum.m_PetInfo[2].btType;
btReLive := Hum.m_PetInfo[2].btReLive;
end;
boRideDragon := Hum.m_boRideDragonMode;
boRideOrthrus := Hum.m_boRideOrthrusMode;
if btType < 11 then begin
case m_btHorseType of
1..5: Result := $E0 + m_btHorseType; //马
6..10: Result := $A2 + m_btHorseType; //幽影铁骑、赤炎追风、踏雪银驹
end;
end else begin
case btType of
11..13: begin //豹子
case btReLive of
1: Result := $DB + btType; //225- 227
2: Result := $DE + btType; //228 -230
3: begin
if m_boPneuma and m_boInosculatePneuma then
Result := $9C
else
Result := $81 + btType; //A4 5E 21 D7
end;
end;
end;
14..16: begin
case btReLive of //狮子
1: Result := $EB + btType;
2: begin
if btType = 11 then
Result := $F8
else
Result := $EE + btType; //$F8 红狮
end; //$D3 红狮
3: begin
if m_boPneuma and m_boInosculatePneuma then
Result := $9D
else
Result := $81 + btType;
end;
end;
end;
17..19: begin
case btReLive of //麒麟
1: Result := $DD + btType;
2: Result := $E0 + btType;
3: begin
if m_boPneuma and m_boInosculatePneuma then
Result := $9F
else
Result := $81 + btType;
end;
end;
end;
20..22: begin
case btReLive of //凤凰
1: Result := $68 + btType;
2: Result := $6B + btType;
3: begin
if m_boPneuma and m_boInosculatePneuma then
Result := $A0
else
Result := $81 + btType;
end;
end;
end;
23..25: begin
case btReLive of //老虎
1: ;
2: Result := $82;
3: begin
if m_boPneuma and m_boInosculatePneuma then
Result := $A3
else
Result := $81 + btType;
end;
end;
end;
26..27: begin
case btReLive of //鲨鱼
1: ;
2: Result := $75 + btType;
3: begin
if m_boPneuma and m_boInosculatePneuma then
Result := $A1
else
Result := $7D + btType;
end;
end;
end;
28: ;
29..31: begin
case btReLive of //帝王裂天犀
1: ;
2: Result := $85;
3: begin
if m_boPneuma and m_boInosculatePneuma then
Result := $A2
else
Result := $A2;
end;
end;
end;
32..34: begin //独角兽
case btReLive of
1: ;
2: ;
3: begin
if m_boPneuma and m_boInosculatePneuma then
Result := $AC + btType
else
Result := $A9 + btType;
end;
end;
end;
35..37: begin //战马
case btReLive of
1: ;
2: ;
3: begin
if m_boPneuma and m_boInosculatePneuma then
Result := $A2 + btType
else
Result := $9F + btType;
end;
end;
end;
38: begin //狼
case btReLive of
1: ;
2: ;
3: ;
4: begin
if m_boPneuma and m_boInosculatePneuma then
Result := $8A + btType
else
Result := $87 + btType;
end;
end;
end;
39: begin
case btReLive of
2: Result := $AD; //二转邪影银月狼
end;
end;
40: ;
41..43: begin
case btReLive of //$B4 霜血战熊 $B3 双头兽 $B0 蓝色狼闪电 $AF 金色 独角 $AE 独角红色 $AD 独角蓝色 $AA 黑色战马 霜雪战熊
1: ;
2: ;
3: begin
if m_boPneuma and m_boInosculatePneuma then
Result := $B4
else
Result := $B4;
end;
4: Result := $B4;
end;
end;
44: begin //蓝焰战马
case btReLive of
2: Result := $C3;
end;
end;
45: begin //绿焰战马
case btReLive of
2: Result := $C4;
end;
end;
46: begin
case btReLive of //赤焰战马
2: Result := $C2;
end;
end;
47: begin //狂怒战熊
case btReLive of
4: Result := $B8;
end;
end;
end;
//沙城金龙
if boRideDragon then begin
if m_boPneuma and m_boInosculatePneuma then
Result := $A6
else
Result := $A5;
end;
if boRideOrthrus then begin
if m_boPneuma and m_boInNonSuchPavilion then
Result := $B4
else
Result := $B3
end;
end;
end;
end;
function TPlayObject.GetFeature(BaseObject: TBaseObject): Integer;
var
StdItem : pTStdItem;
btWeapon : byte;
btRace, btHair, btDress, btDressShape : byte;
begin
if m_boPneuma and m_boInosculatePneuma then begin
btDress := 0;
btDressShape := m_nDressShape;
if m_TorDDM.Tiger.Items[U_DRESS].wIndex > 0 then begin //衣服
StdItem := UserEngine.GetStdItem(m_TorDDM.Tiger.Items[U_DRESS].wIndex);
if StdItem <> nil then begin
//衣服有16种颜色,所以序号*16,再加上颜色
btDress := (StdItem.Shape shl 4) + (m_TorDDM.Tiger.Items[U_DRESS].btValue[14] and $0F);
if ((btDressShape and $000000C8) <> $000000C8) then btDressShape := StdItem.Shape;
end;
end else if ((btDressShape and $000000C8) <> $000000C8) then btDressShape := 28 + m_btJob;
btWeapon := 0; //武器
if m_TorDDM.Tiger.Items[U_WEAPON].wIndex > 0 then begin
StdItem := UserEngine.GetStdItem(m_TorDDM.Tiger.Items[U_WEAPON].wIndex);
if StdItem <> nil then begin
btWeapon := StdItem.Shape;
end;
end;
m_nDressShape := MakeLong(MakeWord(btDressShape, 0), HiWord(m_nDressShape));
btHair := m_btHair; //头发
btRace := GetFeatureEx; //种族
Result := MakeHumanFeature(btRace, btDress, btWeapon, btHair);
end else
Result := inherited GetFeature(BaseObject);
end;
function TPlayObject.GetAmbitStatus(): Integer;
var
nNum : Integer;
begin
Result := inherited GetAmbitStatus();
//传世主宰者 星星数量
if (m_btRulerLevel > 0) then begin
nNum := m_btRulerLevel * 8;
Result := Result or nNum;
end;
end;
function TPlayObject.GetMagicExStatus(): byte;
begin
Result := inherited GetMagicExStatus();
//传世主宰者
if (m_btRulerLevel > 0) then Result := $80 or Result;
if m_boPneuma then begin
if m_boInosculatePneuma then begin
Result := ($80 shr 4) or Result; //是融合元神
Result := Result + (m_btPneumaSex and $03); //内敛元神职业 //元神里是用来保存内敛元神职业的
end;
end;
end;
procedure TPlayObject.ClientInosculatePneuma();
var
MainPlayObj : TPlayObject;
StdItem : pTStdItem;
i, ii, n : Integer;
Slave : TBaseObject;
RidePet : TRidePet;
resourcestring
sErrorMsg = '你的外现元神还未凝入躯干魂骨或是还未点亮相应的心命点,你的神智无法附身到你的外现元神上。';
begin
if m_PneumaObject = nil then Exit;
if m_pSwitchPneuma <> nil then Exit;
if (not m_boPneuma) or m_boCtrlMental then Exit;
MainPlayObj := TPlayObject(m_PneumaObject);
// if m_boRideOn then begin
// MainPlayObj.SysMsg('元神骑乘模式下,不可进行此操作。', c_Red, t_Hint);
// Exit;
// end;
if MainPlayObj.m_btCurPneumaCount < 2 then Exit;
if MainPlayObj.m_boGhost or
MainPlayObj.m_boDeath or
MainPlayObj.m_boSoftClose or
MainPlayObj.m_boReconnection then Exit;
if m_boGhost or m_boDeath then Exit;
if not m_boInosculatePneuma then begin
if (GetTickCount - m_dwInosculateTick) >= 60000 then begin
if (m_EntopticItems[2].Item.wIndex > 0) then begin
StdItem := UserEngine.GetStdItem(m_EntopticItems[2].Item.wIndex);
if (StdItem <> nil) and (StdItem.StdMode = 91) and
(m_EntopticItems[2].IsPlaceIllume(StdItem.Shape)) then begin
m_dwInosculateTick := GetTickCount;
m_boInosculatePneuma := True;
MainPlayObj.SendMsg(MainPlayObj, RM_CTRLMENTAL, 0, 0, 3, 0, '');
//计算战斗值
i := -1;
if (m_btAmbitKind > 2) then Inc(i);
if (m_btAmbitKind > 4) then Inc(i);
if (m_btAmbitKind > 6) then Inc(i);
if (m_btAmbitKind > 8) then Inc(i);
if (m_btAmbitKind < 3) then i := 0;
i := i * 99;
//m_wInnerPneumaLevel 为内敛元神综合等级
m_wCurFightValue := Round(((m_wInnerPneumaLevel + m_Abil.level + m_btAmbitLevel + i) / 5) + (MainPlayObj.m_btMentalLevel / 2));
m_InosculatePneumaHP := m_WAbil.dwHP; //备份元神当前血
m_InosculatePneumaMP := m_WAbil.dwMP; //备份融合元神当前蓝
m_WAbil.dwHP := MainPlayObj.m_InosculatePneumaHP; //当前融合的血值是保存主体身上的
m_WAbil.dwMP := MainPlayObj.m_InosculatePneumaMP; //当前融合的魔法值是保存主体身上的
if m_WAbil.dwHP <= Round(m_WAbil.dwMaxHP * 10 / 100) then
m_WAbil.dwHP := m_WAbil.dwMaxHP;
FillChar(m_InosculatePneumaAddAbil, SizeOf(TAddAbility), #0);
//
//计算属性 // 14 + 85 +20 42 * 338
if (m_btJob = 0) and ((m_btPneumaSex and $03) = 1) then begin //战战 14 + (122 / 2 + 20 + 122 / 4) * (122 * 2)
m_InosculatePneumaMaxHP := _MIN(MAXHUMHP, 14 + Round(((m_wCurFightValue / 2 + 20 + m_wCurFightValue / 4) * (m_wCurFightValue * 2))));
m_InosculatePneumaMaxMP := _MIN(MAXHUMMP, 13 + Round(m_wCurFightValue * 12));
n := _Max((m_wCurFightValue * 6 div 8) - 1, 1);
m_InosculatePneumaAddAbil.wDC := MakeLong(n - 1, n);
m_InosculatePneumaAddAbil.wSC := 0;
m_InosculatePneumaAddAbil.wMC := 0;
m_InosculatePneumaAddAbil.wAC := MakeLong(0, (m_wCurFightValue * 6 div 12));
m_InosculatePneumaAddAbil.wMAC := MakeLong(0, (m_wCurFightValue div 20));
end else if (m_btJob = 1) and ((m_btPneumaSex and $03) = 2) then begin //法法 14 + (122 / 3 + 20) * 122
m_InosculatePneumaMaxHP := _MIN(MAXHUMHP, 14 + Round(((m_wCurFightValue / 3 + 10) * m_wCurFightValue))); //14 + (122 / 2 + 20) * 4.4 * 122
m_InosculatePneumaMaxMP := _MIN(MAXHUMMP, 13 + Round((m_wCurFightValue / 2 + 20) * 4.4 * m_wCurFightValue));
n := _Max((m_wCurFightValue * 6 div 9) - 1, 1);
m_InosculatePneumaAddAbil.wDC := MakeLong(n - 1, n);
m_InosculatePneumaAddAbil.wMC := MakeLong(n - 1, n);
m_InosculatePneumaAddAbil.wSC := 0;
m_InosculatePneumaAddAbil.wAC := MakeLong(0, (m_wCurFightValue div 22));
m_InosculatePneumaAddAbil.wMAC := MakeLong(0, (m_wCurFightValue div 18));
end else if (m_btJob = 2) and ((m_btPneumaSex and $03) = 3) then begin //道道
m_InosculatePneumaMaxHP := _MIN(MAXHUMHP, 14 + Round(((m_wCurFightValue / 2 + 30) * m_wCurFightValue)));
m_InosculatePneumaMaxMP := _MIN(MAXHUMMP, 13 + Round(((m_wCurFightValue / 3) * 3.3 * m_wCurFightValue)));
n := _Max((m_wCurFightValue * 6 div 9) - 1, 1);
m_InosculatePneumaAddAbil.wDC := MakeLong(n - 1, n);
m_InosculatePneumaAddAbil.wMC := 0;
m_InosculatePneumaAddAbil.wSC := MakeLong(n - 1, n);
m_InosculatePneumaAddAbil.wAC := MakeLong(0, (m_wCurFightValue div 18));
n := _Max((m_wCurFightValue * 6 div 12), 1);
m_InosculatePneumaAddAbil.wMAC := MakeLong(n div 2, n + 1);
end else if (m_btJob in [0, 1]) and ((m_btPneumaSex and $03) in [1, 2]) then begin //战法
m_InosculatePneumaMaxHP := _MIN(MAXHUMHP, 14 + Round(((m_wCurFightValue / 2 + 10 + m_wCurFightValue / 4) * (m_wCurFightValue * 1.5))));
m_InosculatePneumaMaxMP := _MIN(MAXHUMMP, 13 + Round((m_wCurFightValue / 2 + 10) * 2.2 * m_wCurFightValue));
n := _Max((m_wCurFightValue * 6 div 10) - 1, 1);
m_InosculatePneumaAddAbil.wDC := MakeLong(n - 1, n);
m_InosculatePneumaAddAbil.wSC := 0;
m_InosculatePneumaAddAbil.wMC := MakeLong(n - 1, n);
m_InosculatePneumaAddAbil.wAC := MakeLong(0, (m_wCurFightValue * 6 div 14));
m_InosculatePneumaAddAbil.wMAC := MakeLong(0, (m_wCurFightValue div 18));
end else if (m_btJob in [0, 2]) and ((m_btPneumaSex and $03) in [1, 3]) then begin //战道
m_InosculatePneumaMaxHP := _MIN(MAXHUMHP, 14 + Round(((m_wCurFightValue / 3 + 15 + m_wCurFightValue / 4) * (m_wCurFightValue * 1.5))));
m_InosculatePneumaMaxMP := _MIN(MAXHUMMP, 13 + Round(((m_wCurFightValue / 4) * 2.2 * m_wCurFightValue)));
n := _Max((m_wCurFightValue * 6 div 10) - 1, 1);
m_InosculatePneumaAddAbil.wDC := MakeLong(n - 1, n);
m_InosculatePneumaAddAbil.wMC := 0;
m_InosculatePneumaAddAbil.wSC := MakeLong(n - 1, n);
m_InosculatePneumaAddAbil.wAC := MakeLong(0, (m_wCurFightValue div 22));
n := _Max((m_wCurFightValue * 6 div 18), 1);
m_InosculatePneumaAddAbil.wMAC := MakeLong(n div 2, n + 1);
end else if (m_btJob in [1, 2]) and ((m_btPneumaSex and $03) in [2, 3]) then begin //法道
m_InosculatePneumaMaxHP := _MIN(MAXHUMHP, 14 + Round(((m_wCurFightValue / 3 + 15) * m_wCurFightValue)));
m_InosculatePneumaMaxMP := _MIN(MAXHUMMP, 13 + Round(((m_wCurFightValue / 3) * 2.2 * m_wCurFightValue)));
n := _Max((m_wCurFightValue * 6 div 10) - 1, 1);
m_InosculatePneumaAddAbil.wDC := MakeLong(n - 1, n);
m_InosculatePneumaAddAbil.wMC := MakeLong(n - 1, n);
m_InosculatePneumaAddAbil.wSC := MakeLong(n - 1, n);
m_InosculatePneumaAddAbil.wAC := MakeLong(0, (m_wCurFightValue div 22));
n := _Max((m_wCurFightValue * 6 div 14), 1);
m_InosculatePneumaAddAbil.wMAC := MakeLong(n div 2, n + 1);
end;
//如果是0血,则加满血
if m_WAbil.dwHP = 0 then
m_WAbil.dwHP := m_InosculatePneumaMaxHP;
//Min(m_InosculatePneumaMaxHP, m_WAbil.dwHP);
//Min(m_InosculatePneumaMaxMP, m_WAbil.dwMP);
//发送本人物所学习了的技能列表
SendUseMagic();
//发送融合元神身上物品
SendTigerItem();
FeatureChanged();
MainPlayObj.SendMsg(MainPlayObj, RM_CTRLMENTAL, 0, Integer(MainPlayObj), 259, 1, '');
end;
end;
if not m_boInosculatePneuma then begin
MainPlayObj.SysMsg(sErrorMsg, c_Red, t_Hint);
Exit;
end;
end;
end else begin
m_boInosculatePneuma := False;
if m_SpiritInfo.boMag then begin
SendRefMsg(RM_SPIRITHP, 0, 0, 0, 0, '');
m_SpiritInfo.boMag := False; //取消技能的使用
end;
MainPlayObj.SendMsg(MainPlayObj, RM_CTRLMENTAL, 0, Integer(MainPlayObj), 259, 0, '');
//装备更换
MainPlayObj.m_InosculatePneumaHP := m_WAbil.dwHP; //把当前融合的血值保存主体身上
MainPlayObj.m_InosculatePneumaMP := m_WAbil.dwMP; //把当前融合的魔法值保存主体身上
m_WAbil.dwHP := m_InosculatePneumaHP; //还原元神当前血
m_WAbil.dwMP := m_InosculatePneumaMP; //还原元神当前魔法值
//发送本人物所学习了的技能列表
SendUseMagic();
//发送身上物品
//SendUseitems();
FeatureChanged();
end;
//{取消魔法盾,护身真气,金刚护体等下线保存}
m_wStatusTimeArr[STATE_BUBBLEDEFENCEUP] := 1;
m_wStatusTimeArr[STATE_JINGANGHUTI] := 1;
m_wStatusTimeArr[STATE_HUSHENZHENQI] := 1;
m_wStatusTimeArr[STATE_FENGYINGDUN] := 1;
m_wStatusTimeArr[STATE_FIERYDRAGON] := 1;
m_wStatusTimeArr[STATE_HELLINTENSEFLAME] := 1;
m_boAbilMag70Defence := False;
m_boAbilMagHuShenDefence := False;
m_boAbilMagJingangDefence := False;
m_boAbilMagBubbleDefence := False;
//清除宝宝
for i := 0 to m_SlaveList.Count - 1 do begin
Slave := TBaseObject(m_SlaveList.Items[i]);
//通知元神宝宝ID
ii := Integer(Slave);
SendDefMessage(SM_SLAVEINFO, Integer(Self), 0, 0, 1, EnCodeBuffer(@ii, SizeOf(Integer)));
//m_defMsg := MakeDefaultMsg(SM_SLAVEINFO, Integer(Self), 0, 0, 1);
//SendSocket(@m_defMsg, EnCodeBuffer(@ii, SizeOf(Integer)));
Slave.MakeGhost();
end;
m_SlaveList.Clear;
//刷新自身信息 到客户端
RecalcHitSpeed;
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendUpdateMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
SendRefMsg(RM_TURN, m_btDirection, m_nCurrX, m_nCurrY, CalcCent(m_WAbil.dwHP, m_WAbil.dwMaxHP), GetShowName);
end;
procedure TPlayObject.ClientSwitchPneuma();
var
MainPlayObj : TPlayObject;
begin
if m_PneumaObject = nil then Exit;
if m_pSwitchPneuma <> nil then Exit;
if not m_boPneuma then Exit;
MainPlayObj := TPlayObject(m_PneumaObject);
if MainPlayObj.m_btCurPneumaCount < 2 then Exit;
if MainPlayObj.m_boGhost or
MainPlayObj.m_boDeath or
MainPlayObj.m_boSoftClose or
MainPlayObj.m_boReconnection then Exit;
if m_boGhost or m_boDeath then Exit;
New(m_pSwitchPneuma);
try
MainPlayObj.m_PneumaObject := nil;
MainPlayObj.m_nPneumaLastX := m_nCurrX;
MainPlayObj.m_nPneumaLastY := m_nCurrY;
TPlayObject(m_PneumaObject).m_PetInfo[3].nMakeIndex := 0;
TPlayObject(m_PneumaObject).m_PetInfo[3].wLevel := 0;
TPlayObject(m_PneumaObject).m_PetInfo[3].btType := 0;
TPlayObject(m_PneumaObject).m_PetInfo[3].btReLive := 0;
TPlayObject(m_PneumaObject).m_PetInfo[3].btRideFightSpeed := 0;
m_PneumaObject := nil;
m_boSoftClose := True;
m_boReconnection := True;
SendRefMsg(RM_510, 1, 0, 42, 0, '');
SendDefMessage(SM_OUTOFCONNECTION, 0, 0, 0, 0, '');
MainPlayObj.m_dwCallPneumaTick := GetTickCount;
m_pSwitchPneuma^.dwPlayObject := Integer(MainPlayObj);
m_pSwitchPneuma^.sChrName := m_sCharName;
m_pSwitchPneuma^.dwDBIndex := m_dwDBIndex;
//在主体上保存一下当前的最大攻击吧
case m_btJob of
0: MainPlayObj.m_SpiritInfo.wWithinTotalDC := hiword(m_WAbil.DC);
1: MainPlayObj.m_SpiritInfo.wWithinTotalDC := hiword(m_WAbil.MC);
2: MainPlayObj.m_SpiritInfo.wWithinTotalDC := hiword(m_WAbil.SC);
end;
except
Dispose(m_pSwitchPneuma);
m_pSwitchPneuma := nil;
end;
end;
procedure TPlayObject.ClientTakeOnInosculatePneumaItem(nWhere, nMakeIndex: Integer);
var
i, n14, n18 : Integer;
UserItem, TakeoffItem : pTUserItem;
StdItem, StdItem20 : pTStdItem;
StdItem58 : TStdItem;
boCanTakeOn : Boolean;
label
FailExit;
begin
StdItem := nil;
UserItem := nil;
n14 := -1;
if m_boPneuma and m_boInosculatePneuma then begin
//灵珠状态下不能使用武器
if (nWhere = U_WEAPON) and m_boPneumaEffMode then Exit;
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[i]; //包裹里的物品
if (UserItem <> nil) and (UserItem.MakeIndex = nMakeIndex) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
n14 := i;
Break;
end;
StdItem := nil;
UserItem := nil;
end;
end;
n18 := 0;
if (StdItem <> nil) and (UserItem <> nil) then begin
if CheckIPUserItems(nWhere, StdItem) and (StdItem.Need = 09) then begin
//物品控制-禁止元神、红名、本体穿戴
if m_boPneuma then
boCanTakeOn := not (CheckSPCode(StdItem.SPCode, SP_DISABLEPNEUMATAKEON))
else if (PKLevel > 2) then
boCanTakeOn := not (CheckSPCode(StdItem.SPCode, SP_DISABLEREDTAKEON))
else
boCanTakeOn := not (CheckSPCode(StdItem.SPCode, SP_DISABLEHUMANTAKEON));
if not boCanTakeOn then begin
SysMsg('你不能佩戴此物品。', c_Red, t_Hint);
n18 := -1;
goto FailExit;
end;
StdItem58 := StdItem^;
ItemUnit.GetItemAddValue(UserItem, StdItem58);
if (n18 = 0) and CheckTakeOnItems(U_ENTOPTIC, StdItem58) and CheckItemBindUse(UserItem) then begin
TakeoffItem := nil;
if nWhere in [Low(m_TorDDM.Tiger.Items)..High(m_TorDDM.Tiger.Items)] then begin
//取下物品
if m_TorDDM.Tiger.Items[nWhere].wIndex > 0 then begin //当前位置已装备了物品,则取下
StdItem20 := UserEngine.GetStdItem(m_TorDDM.Tiger.Items[nWhere].wIndex);
if (StdItem20 <> nil) then begin
if not m_boUserUnLockDurg and ((StdItem20.Reserved and 2) <> 0) then begin
SysMsg(g_sCanotTakeOffItem {'无法取下物品!!!'}, c_Red, t_Hint);
n18 := -4;
goto FailExit;
end; //004DAE78
if (StdItem20.Reserved and 4) <> 0 then begin
SysMsg(g_sCanotTakeOffItem {'无法取下物品!!!'}, c_Red, t_Hint);
n18 := -4;
goto FailExit;
end;
//物品控制-禁止取下物品
if CheckSPCode(StdItem20.SPCode, SP_DISABLETAKEOFF) then begin
SysMsg(g_sCanotTakeOffItem {'无法取下物品!!!'}, c_Red, t_Hint);
n18 := -4;
goto FailExit;
end;
end;
New(TakeoffItem);
TakeoffItem^ := m_TorDDM.Tiger.Items[nWhere];
end;
m_TorDDM.Tiger.Items[nWhere] := UserItem^;
DelBagItem(n14);
if TakeoffItem <> nil then begin
AddItemToBag(TakeoffItem);
SendAddItem(TakeoffItem);
end;
n18 := 1;
SendDefMessage(SM_TAKEON_OK, GetFeatureToLong(Self), GetGender, 0, 0, '');
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
FeatureChanged();
if (m_btJob = 0) and (nWhere in [0..1]) then
SendRefMsg(RM_TURN, m_btDirection, m_nCurrX, m_nCurrY,
CalcCent(m_WAbil.dwHP, m_WAbil.dwMaxHP), '');
end;
end else n18 := -1;
end else n18 := -1;
end;
FailExit:
if n18 <= 0 then
SendDefMessage(SM_TAKEON_FAIL, n18, 0, 0, 0, '');
end;
procedure TPlayObject.ClientTakeOffInosculatePneumaItem(nWhere, nMakeIndex: Integer);
var
N10, i : Integer;
StdItem : pTStdItem;
UserItem : pTUserItem;
sName : string;
nCheckCode : Integer;
label
FailExit;
begin
N10 := 0;
nCheckCode := 0;
if m_boPneuma and m_boInosculatePneuma then begin
if not m_boDealing and (nWhere in [Low(m_TorDDM.Tiger.Items)..High(m_TorDDM.Tiger.Items)]) then begin
if m_TorDDM.Tiger.Items[nWhere].wIndex > 0 then begin
if m_TorDDM.Tiger.Items[nWhere].MakeIndex = nMakeIndex then begin
StdItem := UserEngine.GetStdItem(m_TorDDM.Tiger.Items[nWhere].wIndex);
if (StdItem <> nil) then begin
//物品控制-禁止取下物品
if CheckSPCode(StdItem.SPCode, SP_DISABLETAKEOFF) then begin
SysMsg(g_sCanotTakeOffItem {'无法取下物品!!!'}, c_Red, t_Hint);
N10 := -4;
goto FailExit;
end;
New(UserItem);
UserItem^ := m_TorDDM.Tiger.Items[nWhere];
if AddItemToBag(UserItem) then begin
m_TorDDM.Tiger.Items[nWhere].wIndex := 0;
SendAddItem(UserItem);
SendDefMessage(SM_TAKEOFF_OK, GetFeatureToLong(Self), GetGender, 0, 0, '');
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
FeatureChanged();
if (m_btJob = 0) and (nWhere = 0) then
SendRefMsg(RM_TURN, m_btDirection, m_nCurrX, m_nCurrY,
CalcCent(m_WAbil.dwHP, m_WAbil.dwMaxHP), '');
end else begin
Dispose(UserItem);
N10 := -3;
end;
end;
end;
end else N10 := -2;
end else N10 := -1;
end else N10 := -4;
FailExit:
if N10 <= 0 then
SendDefMessage(SM_TAKEOFF_FAIL, N10, 0, 0, 0, '');
end;
procedure TPlayObject.RecalcAddInosculatePneumaAbil();
var
i : Integer;
StdItem : pTStdItem;
begin
if not m_boPneuma or not m_boInosculatePneuma then Exit;
for i := Low(TTigerItems) to High(TTigerItems) do begin
if (m_TorDDM.Tiger.Items[i].wIndex <= 0) or (m_TorDDM.Tiger.Items[i].Dura <= 0) then
Continue; //物品不存在或物品已损坏
StdItem := UserEngine.GetStdItem(m_TorDDM.Tiger.Items[i].wIndex);
if StdItem = nil then Continue;
//获得物品的附加属性
GetAccessory(m_TorDDM.Tiger.Items[i], m_AddAbil);
//武器
if (i = U_WEAPON) then begin
if (StdItem.Source - 1 - 10) < 0 then
m_AddAbil.btWeaponStrong := StdItem.Source; //强度+
if (StdItem.Source <= -1) and (StdItem.Source >= -50) then // -1 至 -50
m_AddAbil.btSacred := m_AddAbil.btSacred + -StdItem.Source; //神圣+
if (StdItem.Source <= -51) and (StdItem.Source >= -100) then // -51 至 - 100
m_AddAbil.btSacred := m_AddAbil.btSacred + (StdItem.Source + 50); //神圣-
end;
end;
//神魂融合增加血上线与攻击
if m_SpiritInfo.boMag then begin
Inc(m_AddAbil.dwHP, m_SpiritInfo.wAddHP);
case m_btJob of
0: m_AddAbil.wDC := MakeLong(LoWord(m_AddAbil.wDC), HiWord(m_AddAbil.wDC) + m_SpiritInfo.wAddDC);
1: m_AddAbil.wMC := MakeLong(LoWord(m_AddAbil.wMC), HiWord(m_AddAbil.wMC) + m_SpiritInfo.wAddDC);
2: m_AddAbil.wSC := MakeLong(LoWord(m_AddAbil.wSC), HiWord(m_AddAbil.wSC) + m_SpiritInfo.wAddDC);
3: m_AddAbil.dwGC := MakeLong(LoWord(m_AddAbil.dwGC), HiWord(m_AddAbil.dwGC) + m_SpiritInfo.wAddDC);
end;
end;
Inc(m_AddAbil.wSpeedPoint, m_InosculatePneumaAddAbil.wSpeedPoint); //躲避
Inc(m_AddAbil.wHitPoint, m_InosculatePneumaAddAbil.wHitPoint); //人物攻击命中(Byte)
Inc(m_AddAbil.wAntiPoison, m_InosculatePneumaAddAbil.wAntiPoison); //中毒躲避
Inc(m_AddAbil.wPoisonRecover, m_InosculatePneumaAddAbil.wPoisonRecover); //中毒恢复
Inc(m_AddAbil.wHealthRecover, m_InosculatePneumaAddAbil.wHealthRecover); //生命恢复
Inc(m_AddAbil.wSpellRecover, m_InosculatePneumaAddAbil.wSpellRecover); //魔法恢复
Inc(m_AddAbil.wAntiMagic, m_InosculatePneumaAddAbil.wAntiMagic); //魔法躲避
Inc(m_AddAbil.btMagicNicety, m_InosculatePneumaAddAbil.btMagicNicety); //魔法命中
Inc(m_AddAbil.btPoisonNicety, m_InosculatePneumaAddAbil.btPoisonNicety); //中毒命中
Inc(m_AddAbil.btLuck, m_InosculatePneumaAddAbil.btLuck); //人物的幸运值
Inc(m_AddAbil.btUnLuck, m_InosculatePneumaAddAbil.btUnLuck); //人物的诅咒值
Inc(m_AddAbil.nHitSpeed, m_InosculatePneumaAddAbil.nHitSpeed); //攻击速度
m_AddAbil.wAC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wAC) + loword(m_InosculatePneumaAddAbil.wAC)),
_MIN(High(MaxInt), hiword(m_AddAbil.wAC) + hiword(m_InosculatePneumaAddAbil.wAC)));
m_AddAbil.wMAC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wMAC) + loword(m_InosculatePneumaAddAbil.wMAC)),
_MIN(High(MaxInt), hiword(m_AddAbil.wMAC) + hiword(m_InosculatePneumaAddAbil.wMAC)));
m_AddAbil.wDC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wDC) + loword(m_InosculatePneumaAddAbil.wDC)),
_MIN(High(MaxInt), hiword(m_AddAbil.wDC) + hiword(m_InosculatePneumaAddAbil.wDC)));
m_AddAbil.wMC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wMC) + loword(m_InosculatePneumaAddAbil.wMC)),
_MIN(High(MaxInt), hiword(m_AddAbil.wMC) + hiword(m_InosculatePneumaAddAbil.wMC)));
m_AddAbil.wSC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wSC) + loword(m_InosculatePneumaAddAbil.wSC)),
_MIN(High(MaxInt), hiword(m_AddAbil.wSC) + hiword(m_InosculatePneumaAddAbil.wSC)));
m_AddAbil.dwGC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.dwGC) + loword(m_InosculatePneumaAddAbil.dwGC)),
_MIN(High(MaxInt), hiword(m_AddAbil.dwGC) + hiword(m_InosculatePneumaAddAbil.dwGC)));
end;
procedure TPlayObject.ClientQueryGuildClanList;
var
sData, sClanName, sAmbit : string;
Clan : TClan;
i, ii : Integer;
ClanAmbit : pTClanAmbit;
begin
if m_MyGuild = nil then Exit;
sData := '';
for i := 0 to TGuild(m_MyGuild).m_ClanList.Count - 1 do begin
if i >= 50 then Break;
sClanName := TGuild(m_MyGuild).m_ClanList.Strings[i];
Clan := g_GuildManager.FindClan(sClanName);
if Clan <> nil then begin
sData := sData + '#' + Clan.m_sClanName + '/' + Clan.ChiefName + '/' + IntToStr(Clan.btClanKind) + '/';
for ii := 0 to Clan.m_MemberList.Count - 1 do begin
if ii >= 200 then Break;
ClanAmbit := pTClanAmbit(Clan.m_MemberList.GetValues(Clan.m_MemberList.Keys[ii]));
if (ClanAmbit.Ambit > 2) then begin
if (ClanAmbit.Ambit mod 2) = 0 then
sAmbit := '2'
else
sAmbit := '1';
end else
sAmbit := '0';
sData := sData + Clan.m_MemberList.Keys[ii] + '/' + sAmbit + '/';
end;
end;
end;
SendDefMessage(CM_GUILDCLAN, 0, 0, 0, 0, sData);
end;
procedure TPlayObject.ClientClanOperate(nOpCode: Integer; sMsg: string);
var
sName, ClanName : string;
Hum : TPlayObject;
Clan : TClan;
begin
if (m_MyClan <> nil) then begin
case nOpCode of
0: begin //招收弟子
sName := DeCodeString(sMsg);
Hum := UserEngine.GetPlayObject(sName);
if (Hum <> nil) then begin
if CretInNear10XY(Hum, m_nCurrX, m_nCurrY) then begin
if (Hum.m_MyGuild = m_MyGuild) then begin
Clan := TClan(m_MyClan);
if (Hum.m_MyClan = nil) and (Clan.ChiefName = m_sCharName) then begin
Hum.SendDefMessage(CM_CLANQUERY, 0, 1, 0, 0, m_sCharName);
Hum.m_sQueryName := m_sCharName;
end else begin
SysMsg('对方已有宗族!', c_Red, t_Hint);
end;
end else
SysMsg('对方和你不是同一行会,不能加入!', c_Red, t_Hint);
end else
SysMsg('想加入宗族的成员必须在族长附近。', c_Red, t_Hint);
end;
end;
1: begin //开除弟子
sName := DeCodeString(sMsg);
if (sName <> m_sCharName) then begin
Hum := UserEngine.GetPlayObject(sName);
Clan := TClan(m_MyClan);
if (Hum <> nil) and (Hum.m_MyClan <> nil) and (Clan.ChiefName = m_sCharName) then begin
if (Hum.m_MyClan = m_MyClan) then begin
Clan := TClan(Hum.m_MyClan);
if Clan.DelMember(sName) then begin
Hum.m_MyClan := nil;
Hum.SendDefMessage(CM_CLANOPERATE, 0, 1, 0, 0, Clan.m_sClanName + '/' + sName);
end;
end else begin
SysMsg('对方不是你的宗族弟子!', c_Red, t_Hint);
end;
end;
end else
SysMsg('不能删除自己', c_Red, t_Hint);
end;
2: begin //退出宗族
Clan := TClan(m_MyClan);
if (Clan <> nil) then begin
if Clan.DelMember(m_sCharName) then begin
m_MyClan := nil;
SendDefMessage(CM_CLANOPERATE, 0, 1, 0, 0, Clan.m_sClanName + '/' + m_sCharName);
end;
end;
end;
3: begin //解散宗族
Clan := TClan(m_MyClan);
if (Clan.ChiefName = m_sCharName) then begin
sName := Clan.m_sClanName;
if Clan.CancelClan(m_sCharName) then begin
g_GuildManager.DelClan(sName);
SysMsg('成功解散宗族!', c_Red, t_Hint);
end;
end;
end;
end;
end;
end;
procedure TPlayObject.ClientClanReQuery(nOpCode: Integer; sMsg: string);
var
Hum : TPlayObject;
Clan : TClan;
Guild : TGuild;
sGuildName : string;
begin
if (m_sQueryName <> '') then Hum := UserEngine.GetPlayObject(m_sQueryName);
if (Hum <> nil) and (not m_boDeath) and (not m_boGhost) then begin
Clan := TClan(Hum.m_MyClan);
if (Clan <> nil) and (CompareStr(Clan.ChiefName, m_sQueryName) = 0) then begin
case LoByte(nOpCode) of
1: begin
if (HiByte(nOpCode) = 1) then begin
if (Clan <> nil) then begin
if Clan.AddMember(Self) then begin
m_MyClan := Clan;
//如果宗族有行会,则需要加入该行会
if (Hum.m_MyGuild <> nil) and (m_MyGuild = nil) then begin
TGuild(Hum.m_MyGuild).AddMember(Self);
UserEngine.SendServerGroupMsg(SS_207, g_Config.nServerNumber, TGuild(Hum.m_MyGuild).sGuildName);
m_MyGuild := TGuild(Hum.m_MyGuild);
m_sGuildRankName := TGuild(Hum.m_MyGuild).GetRankName(Self, m_nGuildRankNo);
RefShowName();
SysMsg('你已加入行会: ' + TGuild(Hum.m_MyGuild).sGuildName + ' 当前封号为: ' + m_sGuildRankName, c_Green, t_Hint);
end;
SysMsg('成功加入宗族!', c_Red, t_Hint);
SendFiendList(4);
SendMeOnlineState(1, 4);
end;
end;
end else begin
Hum.SysMsg('对方不同意加入宗族!', c_Red, t_Hint);
end;
end;
end;
end;
end;
end;
function TPlayObject.CheckMapRideOn(Envir: TEnvirnoment): Boolean;
var
btType : byte;
begin
Result := False;
if Envir = nil then Exit;
if (not m_PEnvir.m_MapFlag.boRideOn) and (m_btHorseType > 0) then Exit;
if m_PEnvir.m_MapFlag.boNoRidePet or g_Config.boChMapRideOff then Exit;
if m_boRideOn then begin
if m_boPneuma and (m_PneumaObject <> nil) then
btType := TPlayObject(m_PneumaObject).m_PetInfo[3].btType
else
btType := m_PetInfo[2].btType;
end else
btType := m_PetInfo[0].btType;
if (btType in [26..28]) and (not m_PEnvir.m_MapFlag.boCanRideShark) then Exit;
if not (btType in [26..28]) and (m_PEnvir.m_MapFlag.boWaterNeed) and (not m_boUnWater) then Exit;
Result := True;
end;
//火龙附体
procedure TPlayObject.MagFieryDragonRun();
var
i : Integer;
BaseObject : TBaseObject;
nPower : Integer;
begin
nPower := 0;
if ((GetTickCount - m_dwFieryDragonRunTick) > 1000) then begin
m_dwFieryDragonRunTick := GetTickCount();
if (m_wStatusTimeArr[STATE_FIERYDRAGON] > 0) or (m_wStatusTimeArr[STATE_WARWHIRLWIND] > 0) or
(m_wStatusTimeArr[STATE_FIREDRAGON] > 0) or (m_btRandomDanceTime > 0) then
begin
for i := 0 to m_VisibleActors.Count - 1 do begin
BaseObject := TBaseObject(pTVisibleBaseObject(m_VisibleActors[i]).BaseObject);
if (not BaseObject.m_boDeath) and (BaseObject <> Self) then begin
if IsProperTarget(BaseObject) then begin
if (abs(m_nCurrX - BaseObject.m_nCurrX) <= 3) and (abs(m_nCurrY - BaseObject.m_nCurrY) <= 3) then begin
end;
if (abs(m_nCurrX - BaseObject.m_nCurrX) <= 2) and (abs(m_nCurrY - BaseObject.m_nCurrY) <= 2) then begin
//火龙附体
if (m_wStatusTimeArr[STATE_FIERYDRAGON {火龙附体}] > 0) then begin
nPower := m_wCurFightValue * 2;
BaseObject.SendMsg(Self, RM_MAGSTRUCK, 0, nPower, SKILL_FIERYDRAGON, 0, '');
end;
end;
end;
end;
end;
end;
end;
end;
//投石车攻击目标
procedure TPlayObject.ClientCatapultAttackTarget(nOpCode, nX, nY: Integer);
var
MessageBody : TMessageBody3W;
begin
if m_boDeath or m_boGhost then Exit;
if (GetTickCount - m_dwCatapultAttackTick) < 3000 then Exit;
if m_boCatapultMode and m_boCatapultAttackMode then begin
if m_PEnvir.CanWalk(nX, nY, True) then begin
//检测炮弹
if nOpCode = 0 then begin
MessageBody.wX := nX;
MessageBody.wY := nY;
MessageBody.wParam := 0;
SendRefMsg(RM_LAPIDATION, 0, Integer(Self), nX, nY, EnCodeBuffer(@MessageBody, SizeOf(TMessageBody3W)));
end else begin //速射
end;
m_dwCatapultAttackTick := GetTickCount;
//SendRefMsg(RM_CATAPULTATTACK, 0, Integer(Self), nX, nY, '');
SendDefMessage(SM_CATAPULTATTACK, Integer(Self), nX, nY, 0, '');
end else begin
SysMsg('请向空地投弹', c_Red, t_Hint);
SendDefMessage(SM_CATAPULTATTACK, Integer(Self), nX, nY, 1, '');
end;
end;
end;
//附加天元心法属性
procedure TPlayObject.RecalcMentalLevelAbilitys;
var
MentalAbility : pTMentalAbility;
begin
if m_boPneuma then Exit;
MentalAbility := UserEngine.GetMentalAbil(m_btJob, m_btMentalLevel);
if MentalAbility <> nil then begin
m_nMentalPointMax := MentalAbility.MentalExp;
m_AddAbil.dwHP := _MIN(MAXHUMHP, m_AddAbil.dwHP + MentalAbility.HP);
case m_btJob of
0: m_AddAbil.wDC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wDC) + MentalAbility.DC), _MIN(High(MaxInt), hiword(m_AddAbil.wDC) + MentalAbility.DC2));
1: m_AddAbil.wMC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wMC) + MentalAbility.DC), _MIN(High(MaxInt), hiword(m_AddAbil.wMC) + MentalAbility.DC2));
2: m_AddAbil.wSC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wSC) + MentalAbility.DC), _MIN(High(MaxInt), hiword(m_AddAbil.wSC) + MentalAbility.DC2));
end;
m_AddAbil.wAC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wAC) + MentalAbility.AC), _MIN(High(MaxInt), hiword(m_AddAbil.wAC) + MentalAbility.AC2));
m_AddAbil.wMAC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wMAC) + MentalAbility.MAC), _MIN(High(MaxInt), hiword(m_AddAbil.wMAC) + MentalAbility.MAC2));
m_AddAbil.wElementForceMax := _MIN(High(MaxInt), m_AddAbil.wElementForceMax + MentalAbility.ElementForce);
m_AddAbil.btThump := _MIN(High(word), m_AddAbil.btThump + MentalAbility.Thump);
m_AddAbil.wAgainst := _MIN(High(word), m_AddAbil.wAgainst + MentalAbility.Against);
//MentalAbility.UnPalsy 抗麻痹
end;
end;
procedure TPlayObject.ClientQueryMentalAbilitys(PlayObject: TPlayObject);
type
TMentalPack = packed record
btType: byte;
wValue: word;
end;
var
MentalAbility : pTMentalAbility;
NewMentalAbility : pTMentalAbility;
MentalSet : array[0..7] of word;
MentalPack : array[0..11] of TMentalPack;
i, nCount : Integer;
s, sName : string;
Foresee : TStringList;
begin
if PlayObject = nil then Exit;
MentalSet[0] := MakeWord($01, $0B);
MentalSet[1] := MakeWord($06, $01);
MentalSet[2] := MakeWord($09, $01);
MentalSet[3] := MakeWord($0A, $01);
MentalSet[4] := MakeWord($0B, $11);
MentalSet[5] := MakeWord($0C, $05);
MentalSet[6] := MakeWord($0D, $14);
MentalSet[7] := MakeWord($0E, $0B);
m_defMsg := MakeDefaultMsg(CM_QUERYMENTAL, 0, 8, 0, 0);
SendSocket(@m_defMsg, EnCodeBuffer(@MentalSet, 16));
MentalAbility := UserEngine.GetMentalAbil(PlayObject.m_btJob, PlayObject.m_btMentalLevel);
if MentalAbility <> nil then begin
MentalPack[0].btType := $01;
MentalPack[0].wValue := MakeWord(MentalAbility.DC, MentalAbility.DC2);
MentalPack[1].btType := $06;
MentalPack[1].wValue := MentalAbility.HP;
MentalPack[2].btType := $09;
MentalPack[2].wValue := MakeWord(MentalAbility.AC, MentalAbility.AC2);
MentalPack[3].btType := $0A;
MentalPack[3].wValue := MakeWord(MentalAbility.MAC, MentalAbility.MAC2);
MentalPack[4].btType := $0B;
MentalPack[4].wValue := MentalAbility.Thump;
MentalPack[5].btType := $0C;
MentalPack[5].wValue := MentalAbility.ElementForce;
MentalPack[6].btType := $0D;
MentalPack[6].wValue := MentalAbility.Against;
MentalPack[7].btType := $0E;
MentalPack[7].wValue := MentalAbility.UnPalsy;
s := Trim(MentalAbility.Foresee);
nCount := 0;
if s <> '' then begin
NewMentalAbility := UserEngine.GetMentalAbil(PlayObject.m_btJob, PlayObject.m_btMentalLevel + 1);
if (MentalAbility <> nil) and (NewMentalAbility <> nil) then begin
Foresee := TStringList.Create;
try
ExtractStrings([','], [], PChar(s), Foresee);
for i := 0 to Foresee.Count - 1 do begin
if nCount >= 6 then Break;
sName := UpperCase(Foresee.Strings[i]);
if (sName = 'DC') then begin
MentalPack[8 + nCount].btType := $01;
MentalPack[8 + nCount].wValue := MakeWord(NewMentalAbility.DC - MentalAbility.DC, NewMentalAbility.DC2 - MentalAbility.DC2);
Inc(nCount);
Continue;
end;
if (sName = 'HP') then begin
MentalPack[8 + nCount].btType := $06;
MentalPack[8 + nCount].wValue := NewMentalAbility.HP - MentalAbility.HP;
Inc(nCount);
Continue;
end;
if (sName = 'EF') then begin
MentalPack[8 + nCount].btType := $0C;
MentalPack[8 + nCount].wValue := NewMentalAbility.ElementForce - MentalAbility.ElementForce;
Inc(nCount);
Continue;
end;
if (sName = 'AC') then begin
MentalPack[8 + nCount].btType := $09;
MentalPack[8 + nCount].wValue := MakeWord(NewMentalAbility.AC - MentalAbility.AC, NewMentalAbility.AC2 - MentalAbility.AC2);
Inc(nCount);
Continue;
end;
if (sName = 'MAC') then begin
MentalPack[8 + nCount].btType := $0A;
MentalPack[8 + nCount].wValue := MakeWord(NewMentalAbility.MAC - MentalAbility.MAC, NewMentalAbility.MAC2 - MentalAbility.MAC2);
Inc(nCount);
Continue;
end;
if (sName = 'THUMP') then begin
MentalPack[8 + nCount].btType := $0B;
MentalPack[8 + nCount].wValue := NewMentalAbility.Thump - MentalAbility.Thump;
Inc(nCount);
Continue;
end;
if (sName = 'AGAINST') then begin
MentalPack[8 + nCount].btType := $0D;
MentalPack[8 + nCount].wValue := NewMentalAbility.Against - MentalAbility.Against;
Inc(nCount);
Continue;
end;
if (sName = 'UNPALSY') then begin
MentalPack[8 + nCount].btType := $0E;
MentalPack[8 + nCount].wValue := NewMentalAbility.UnPalsy - MentalAbility.UnPalsy;
Inc(nCount);
Continue;
end;
end;
finally
Foresee.free;
end;
end else
nCount := 0;
end;
m_defMsg := MakeDefaultMsg(CM_QUERYMENTALABIL, Integer(PlayObject), MakeWord(8, nCount), PlayObject.m_btMentalLevel, 0);
SendSocket(@m_defMsg, EnCodeBuffer(@MentalPack, SizeOf(TMentalPack) * (8 + nCount)));
end;
end;
//宠物摆摊
procedure TPlayObject.ClientPetDoShop(nPet: Integer; shopItemCount: word; sMsg: string);
var
RetCode : Integer;
DoShopResult : TDoShopResult;
i, j, ii : Integer;
UserShop : TUserShop;
UserItem : pTUserItem;
StdItem : pTStdItem;
boFind : Boolean;
sName, s1C : string;
Castle : TUserCastle;
tm : DWORD;
Shop : TShop;
BaseObjectList : TList;
BaseObject : TBaseObject;
resourcestring
sHint1 = '骑宠状态不能摆摊。';
sHint2 = '此地图禁止摆摊。';
sHint3 = '正在攻城的区域禁止摆摊。';
sHint4 = '你正在进行抢宝活动,禁止摆摊。';
sHint5 = '周围没有空的位置,无法摆下你的摊位。';
sHint6 = '摆摊物品价格定义错误,请勿使用非法外挂!';
sHint7 = '金币交易价格定义超过允许的范围。';
sHint8 = '元宝交易价格定义超过允许的范围。';
sHint9 = '此物品开启后不允许交易,但时间到后可丢弃。';
sHint10 = '你要出售的物品并不存在。';
sHint11 = ' 不允许交易。';
begin
if m_PackPet <> nil then Exit;
if nPet = Integer(Self) then nPet := Integer(m_Pet);
if (nPet = 0) or (m_Pet = nil) or (nPet <> Integer(m_Pet)) then Exit;
{
if m_boRideOn then begin
SysMsg(sHint1, c_Red, t_Hint);
Exit;
end;
}
if not g_Config.boPetDoShop then begin
SysMsg('当前服务器宠物豹摆摊系统未开放!', c_Red, t_Hint);
Exit;
end;
if not m_boCanDeal then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, g_sCanotTryDealMsg);
Exit;
end;
if m_PEnvir.m_MapFlag.boNoDoShop then begin
SysMsg(sHint2, c_Red, t_Hint);
Exit;
end;
Castle := g_CastleManager.InCastleWarArea(Self);
//城堡正在战斗
if (Castle <> nil) and Castle.m_boUnderWar then begin
SysMsg(sHint3, c_Red, t_Hint);
Exit;
end;
if m_boArrow then begin
SysMsg(sHint4, c_Red, t_Hint);
Exit;
end;
BaseObjectList := TList.Create;
try
GetMapBaseObjects(m_Pet.m_PEnvir, m_Pet.m_nCurrX, m_Pet.m_nCurrY, 2, BaseObjectList);
for i := 0 to BaseObjectList.Count - 1 do begin
BaseObject := TBaseObject(BaseObjectList.Items[i]);
if (BaseObject.m_btRaceServer = RC_NPC) then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, '你离NPC太近了,不能摆摊。');
Exit;
end;
end;
finally
BaseObjectList.free;
end;
//检查前后左右有没有空位置
if (shopItemCount > 0) then begin //开始摆摊的时候才需要判断
if (m_Pet.m_nCurrX > 0) and (m_Pet.m_nCurrX < m_PEnvir.m_nWidth) and
(m_Pet.m_nCurrY > 0) and (m_Pet.m_nCurrY < m_PEnvir.m_nHeight) and
m_PEnvir.CanWalk(m_Pet.m_nCurrX, m_Pet.m_nCurrY - 1, True) and //0 0 -1
m_PEnvir.CanWalk(m_Pet.m_nCurrX + 1, m_Pet.m_nCurrY - 1, True) and //1 1 -1
m_PEnvir.CanWalk(m_Pet.m_nCurrX + 1, m_Pet.m_nCurrY, True) and //2 1 0
m_PEnvir.CanWalk(m_Pet.m_nCurrX + 1, m_Pet.m_nCurrY + 1, True) and //3 1 1
m_PEnvir.CanWalk(m_Pet.m_nCurrX, m_Pet.m_nCurrY + 1, True) and //4 0 1
m_PEnvir.CanWalk(m_Pet.m_nCurrX - 1, m_Pet.m_nCurrY + 1, True) and //5 -1 1
m_PEnvir.CanWalk(m_Pet.m_nCurrX - 1, m_Pet.m_nCurrY, True) and //6 -1 0
m_PEnvir.CanWalk(m_Pet.m_nCurrX - 1, m_Pet.m_nCurrY - 1, True) then //7 -1 -1
else begin
SysMsg(sHint5, c_Red, t_Hint);
Exit;
end;
end;
shopItemCount := _MIN(15, shopItemCount);
if shopItemCount = 0 then begin
RetCode := $FF;
end else begin //判断能否摆摊
RetCode := 1;
end;
FillChar(Shop, SizeOf(TShop), #0);
if (RetCode = 1) and (shopItemCount > 0) and (sMsg <> '') then begin //取摊位名字和物品
DeCodeBuffer(sMsg, @Shop, SizeOf(TShop));
end;
//检测摊位名称
if CheckFilterWords(Shop.ShopName) then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, '输入内容含有非法字符!');
Exit;
end;
for i := 0 to shopItemCount - 1 do begin
if Shop.ShopItems[i].MakeIndex <> 0 then begin
if not (Shop.ShopItems[i].PayType in [0..1]) then begin
SysMsg(sHint6, c_Red, t_Hint);
shopItemCount := 0;
Exit;
end;
if (Shop.ShopItems[i].PayType = 0) and
((Shop.ShopItems[i].Price < 1) or (Shop.ShopItems[i].Price > 150000000)) then begin
SysMsg(sHint7, c_Red, t_Hint);
shopItemCount := 0;
Exit;
end;
if (Shop.ShopItems[i].PayType = 1) and
((Shop.ShopItems[i].Price < 1) or (Shop.ShopItems[i].Price > 10000000)) then begin
SysMsg(sHint8, c_Red, t_Hint);
shopItemCount := 0;
Exit;
end;
//检查物品合法性
boFind := False;
for j := m_ItemList.Count - 1 downto 0 do begin
UserItem := pTUserItem(m_ItemList[j]);
if UserItem.MakeIndex = Shop.ShopItems[i].MakeIndex then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem = nil then Break;
sName := '';
ItemUnit.GetCustomItemName(UserItem, sName);
{物品控制-禁止摆摊物品}
if CheckSPCode(StdItem.SPCode, SP_DISABLEDOSHOP) or
((UserItem.btItemExt[4] and EX_BIND) = EX_BIND) then begin //物品控制-禁止摆摊物品
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, sName + sHint11);
shopItemCount := 0;
Exit;
end;
//魂佑灵兽禁止放入灵犀宝盒
if (StdItem.StdMode = 49) and (StdItem.Shape = 51) and (UserItem.btItemExt[29] >= 2) then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, '魂佑灵兽不允许出售');
shopItemCount := 0;
Exit;
end;
{已放出豹禁止出售}
if IsDownPetItem(UserItem.MakeIndex) then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, sName + '放出宠物时不允许出售');
shopItemCount := 0;
Exit;
end;
boFind := True;
Break;
end;
end;
if not boFind then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, sHint10);
shopItemCount := 0;
Exit;
end;
end;
end;
for i := shopItemCount to 14 do begin
Shop.ShopItems[i].MakeIndex := 0;
Shop.ShopItems[i].Price := 0;
Shop.ShopItems[i].PayType := 0;
end;
m_PackPet := g_PetBoothManage.CreatePetObject(m_dwDBIndex, m_Pet, Shop.ShopName);
if m_PackPet = nil then Exit;
m_PackPet.SendRefMsg(RM_TURN,
m_PackPet.m_btDirection,
m_PackPet.m_nCurrX,
m_PackPet.m_nCurrY,
CalcCent(m_PackPet.m_WAbil.dwHP, m_PackPet.m_WAbil.dwMaxHP),
m_PackPet.GetShowName);
m_PetInfo[1] := m_PetInfo[0];
PetHide(m_PetInfo[0].nMakeIndex);
//把要出售的物品移动到豹子包裹里
for i := 0 to shopItemCount - 1 do begin
if Shop.ShopItems[i].MakeIndex <> 0 then begin
for j := m_ItemList.Count - 1 downto 0 do begin
UserItem := pTUserItem(m_ItemList[j]);
if UserItem.MakeIndex = Shop.ShopItems[i].MakeIndex then begin
if m_PackPet.AddBoothItem(UserItem, @Shop.ShopItems[i]) then begin
m_ItemList.Delete(j);
SendDelItems(UserItem);
WeightChanged;
end;
Break;
end;
end;
end;
end;
m_nPetTargetX := m_PackPet.m_nCurrX;
m_nPetTargetY := m_PackPet.m_nCurrY;
if (RetCode = 0) and ((m_PackPet.m_btDirection mod 2) = 0) then
m_PackPet.m_btDirection := m_PackPet.m_btDirection + 1;
m_PackPet.GetUserShop(@UserShop);
UserShop.DoShopResult.RetCode := RetCode;
m_PackPet.SaveRcd := True;
//发送操作结果给本人
SendDefMessage(34977, 0, 0, 0, 0, '');
SendDelayMsg(Self, RM_SENDSHOPITEMS, 0, 0, 0, 0, '', 500); // m_PackPet.SendShopItems(Self, 1);
UserShop.DoShopResult.RetCode := 0;
UserShop.GoodsCount := 0;
//广播操作结果
SendRefMsg(RM_PETDOSHOP,
m_PackPet.m_btDirection,
MakeLong(m_PackPet.m_nCurrX, m_PackPet.m_nCurrY),
RetCode,
Integer(m_PackPet),
EnCodeBuffer(@UserShop, 62));
SendPetInfo($03);
SysMsg('灵兽守摊开始', c_Red, t_Hint);
if (not m_boPneuma) then begin
m_sScriptParam[0] := '1';
ExecuteScript(g_FunctionNPC, '@开始摆摊');
end;
end;
procedure TPlayObject.ClientRequestPetDoShop(); //请求摆摊
var
i, j : Integer;
UserItem : pTUserItem;
ShopInfo : TShopInfo;
begin
if (m_PackPet = nil) then begin
SendDefMessage(SM_80D5, Integer(m_Pet), 5, 0, 0, '');
end else
SendDefMessage(SM_80D5, Integer(m_PackPet), 5, 1, 0,
Format('%s(%d:%d)', [m_PackPet.m_PEnvir.m_sMapDesc,
m_PackPet.m_nCurrX, m_PackPet.m_nCurrY]));
end;
//宠物收摊
procedure TPlayObject.ClientPetStopDoShop();
begin
if (m_PackPet <> nil) then begin
m_PackPet.PetStopDoShop();
m_PackPet := nil;
m_PetInfo[1].nMakeIndex := 0;
m_PetInfo[1].wLevel := 0;
m_PetInfo[1].btType := 0;
m_PetInfo[1].btReLive := 0;
SendDefMessage(32981, 0, 0, 0, 0, '');
end;
end;
//更新宠物摊位物品和名称
procedure TPlayObject.ClientUpdatePetShop(nPet: Integer; nOpCode: Integer; sMsg: string);
begin
if (m_PackPet = nil) or (nPet <> Integer(m_PackPet)) then Exit; //错误
if ((m_PackPet.m_PEnvir = m_PEnvir) and
(abs(m_PackPet.m_nCurrX - m_nCurrX) < 15) and
(abs(m_PackPet.m_nCurrY - m_nCurrY) < 15)) then
m_PackPet.UpdatePetShop(Self, nOpCode, sMsg);
end;
//取摆摊物品
procedure TPlayObject.ClientGetbackPetShopItem();
var
i, j : Integer;
UserItem : pTUserItem;
ShopInfo : TShopInfo;
begin
if m_boGhost or m_boDeath then Exit;
ShopInfo := g_PetBoothManage.GetPetInfo(m_dwDBIndex);
if ShopInfo = nil then begin
SendDefMessage(32981, Integer(Self), 3, 16, 0, '');
Exit;
end;
if ShopInfo.m_PetMon <> nil then begin
SendDefMessage(32981, Integer(Self), 3, 19, 0, '');
Exit;
end;
if ShopInfo.Count <= 0 then begin
SendDefMessage(32981, Integer(Self), 3, 16, 0, '');
Exit;
end;
if g_PetBoothManage.GetUserItem(ShopInfo, Self) = 0 then begin
SysMsg('物品已放入你的包裹内', c_Red, t_Hint);
WeightChanged;
SendDefMessage(32981, Integer(Self), 3, 0, 0, '');
end else
SendDefMessage(32981, Integer(Self), 3, 13, 0, '');
end;
procedure TPlayObject.ClientGetbackPetMoney();
var
btCode : byte;
ShopInfo : TShopInfo;
begin
if m_boGhost or m_boDeath then Exit;
if m_PackPet <> nil then
ShopInfo := m_PackPet.ShopInfo
else
ShopInfo := g_PetBoothManage.GetPetInfo(m_dwDBIndex);
if ShopInfo = nil then begin
SendDefMessage(32981, Integer(Self), 2, 23, 0, '');
Exit;
end;
btCode := g_PetBoothManage.GetUserGold(ShopInfo, Self);
if btCode = 1 then begin
SendDefMessage(32981, Integer(Self), 2, 0, 0, '');
end else begin
if btCode = 0 then
SendDefMessage(32981, Integer(Self), 2, 23, 0, '')
else begin
if btCode = 2 then begin
SendDefMessage(32981, Integer(Self), 2, 18, 0, '');
end else begin
SendDefMessage(32981, Integer(Self), 2, 13, 0, '');
end;
end;
end;
end;
procedure TPlayObject.SendShopResult();
var
DoShopResult : TDoShopResult;
UserShop : TUserShop;
begin
//重新发送摊位状态
if m_wShopItemCount > 0 then
DoShopResult.RetCode := 0
else
DoShopResult.RetCode := $FF;
DoShopResult.ShopType := m_wShopKind;
DoShopResult.FlagType := m_btShopBanner;
DoShopResult.FlagColor := m_nBannerColor;
m_defMsg := MakeDefaultMsg(SM_DOSHOP, Integer(Self), m_nCurrX, m_nCurrY, m_btDirection);
SendSocket(@m_defMsg, EnCodeBuffer(@DoShopResult, SizeOf(TDoShopResult)));
UserShop.DoShopResult.RetCode := DoShopResult.RetCode;
UserShop.DoShopResult.ShopType := DoShopResult.ShopType;
UserShop.DoShopResult.FlagType := DoShopResult.FlagType;
UserShop.DoShopResult.FlagColor := DoShopResult.FlagColor;
UserShop.GoodsCount := 0;
UserShop.ShopName := m_Shop.ShopName;
//发送操作结果和商店名称
SendRefMsg(RM_DOSHOP,
m_btDirection,
MakeLong(m_nCurrX, m_nCurrY),
DoShopResult.ShopType,
0,
EnCodeBuffer(@UserShop, SizeOf(TUserShop) {- SizeOf(TClientItem) * 15}));
end;
function TPlayObject.IsShop(): Boolean; //是否摆摊
begin
Result := m_wShopItemCount > 0;
end;
procedure TPlayObject.GetUserShop(const pUserShop: PTUserShop); //取摆摊状态
begin
pUserShop.DoShopResult.ShopType := m_wShopKind;
pUserShop.DoShopResult.RetCode := 0;
pUserShop.DoShopResult.FlagType := m_btShopBanner;
pUserShop.DoShopResult.FlagColor := m_nBannerColor;
pUserShop.GoodsCount := 0;
pUserShop.ShopName := m_Shop.ShopName;
end;
//购买玩家摊位的物品 PlayObject:卖家 nInt:MakeIndex
procedure TPlayObject.ClientBuyShopItem(Play: TBaseObject; sItemName: string; nInt: Integer);
var
i, j, p : Integer;
StdItem : pTStdItem;
UserItem : pTUserItem;
sName : string;
boFound : Boolean;
Price : Integer;
pricetype : word;
nCode : Integer;
maxGold : Int64;
PlayObject : TPlayObject;
petBooth : TPetBoothMonster;
begin
if (nInt = 0) or (Play = nil) then Exit;
if m_boGhost or m_boDeath then Exit;
if Play is TPlayObject then
PlayObject := Play as TPlayObject
else if Play is TPetBoothMonster then begin
petBooth := Play as TPetBoothMonster;
petBooth.BuyShopItem(Self, sItemName, nInt);
Exit;
end else
Exit;
boFound := False;
Price := 0;
pricetype := 0;
for i := 0 to PlayObject.m_wShopItemCount - 1 do begin
if nInt = PlayObject.m_Shop.ShopItems[i].MakeIndex then begin
boFound := True;
p := i;
Price := PlayObject.m_Shop.ShopItems[i].Price;
pricetype := PlayObject.m_Shop.ShopItems[i].PayType;
Break;
end;
end;
nCode := 1;
if not boFound then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, '你要购买的物品已经被售出了!');
Exit;
end;
//检查有没有钱买
if (pricetype = 0) and (m_nGold < Price) then begin
nCode := 3;
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, '你没有这么多金币!');
Exit;
end else if (pricetype = 1) and (m_nGameGold < Price) then begin
nCode := 3;
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, '你没有这么多元宝!');
Exit;
end;
if (pricetype <> 0) and (pricetype <> 1) then begin
SysMsg('暂不支持该物品的支付方式。', c_Red, t_Hint);
Exit;
end;
//检查卖家是否超过金币或元宝携带数限制
if (pricetype = 0) then begin
nCode := 3;
maxGold := PlayObject.m_nGold + Price;
if maxGold > g_Config.nHumanMaxGold then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0,
g_sDealHumanGoldLargeThenLimit);
Exit;
end;
end else if (pricetype = 1) then begin
nCode := 3;
maxGold := PlayObject.m_nGameGold + Price;
if maxGold > g_Config.nHumanMaxGameGold then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0,
g_sDealHumanGameGoldLargeThenLimit);
Exit;
end;
end;
for i := PlayObject.m_ItemList.Count - 1 downto 0 do begin
UserItem := PlayObject.m_ItemList.Items[i];
if (UserItem <> nil) and (UserItem.MakeIndex = nInt) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
//取自定义物品名称
sName := '';
ItemUnit.GetCustomItemName(UserItem, sName);
if (CompareText(sItemName, sName) = 0) then begin
if (PlayObject <> nil) and
(PlayObject.m_wShopItemCount > 0) and
((PlayObject.m_PEnvir = m_PEnvir) and
(abs(PlayObject.m_nCurrX - m_nCurrX) < 15) and
(abs(PlayObject.m_nCurrY - m_nCurrY) < 15)) then begin
//重量、包裹容量允许
if IsAddWeightAvailable(StdItem.Weight) then begin
//添加到包裹
if AddItemToBag(UserItem) then begin
//删除包裹物品
PlayObject.m_ItemList.Delete(i);
//移动物品
Dec(PlayObject.m_wShopItemCount);
for j := p to PlayObject.m_wShopItemCount - 1 do begin
PlayObject.m_Shop.ShopItems[j] := PlayObject.m_Shop.ShopItems[j + 1];
end;
if pricetype = 0 then begin
//给卖物所得
PlayObject.IncGold(Price);
PlayObject.GoldChanged;
//减买物消费
DecGold(Price);
GoldChanged;
end else if pricetype = 1 then begin
//给卖物所得
Inc(PlayObject.m_nGameGold, Price);
PlayObject.GameGoldChanged;
//减买物消费
Dec(m_nGameGold, Price);
GameGoldChanged;
end;
SendAddItem(UserItem);
nCode := 0;
//发送刷新后的摊位信息,
PlayObject.SendShopResult();
{清除自定义物品名称}//是否有必要????
if UserItem.btValue[13] and $01 = 1 then begin
ItemUnit.DelCustomItemName(UserItem.MakeIndex, UserItem.wIndex);
UserItem.btValue[13] := UserItem.btValue[13] and $FE;
end;
m_dwSaveRcdTick := 0;
//发送删除物品的数据包
PlayObject.SendDelItems(UserItem);
UserEngine.SaveHumanRcd(PlayObject);
PlayObject.m_dwSaveRcdTick := GetTickCount;
end else
nCode := 2;
end else
SysMsg(g_sCanotGetItems, c_Red, t_Hint);
end;
end;
end;
Break;
end;
end;
// for
if nCode = 0 then begin
SendMsg(Self, RM_BUYITEM_SUCCESS, 0, m_nGold, nInt, 0, '');
SysMsg('你购买了' + sName, c_Red, t_Hint);
PlayObject.SendShopItems(Self, 2);
if PlayObject.m_btRaceServer = RC_PLAYOBJECT then begin
if pricetype = 0 then
PlayObject.SysMsg(m_sCharName + '在' + FormatDateTime('yyyy-mm-dd hh:nn:ss', Date + Time) + '以' + IntToStr(Price) + '个金币购买了你的' + sName, c_Red, t_Hint)
else
PlayObject.SysMsg(m_sCharName + '在' + FormatDateTime('yyyy-mm-dd hh:nn:ss', Date + Time) + '以' + IntToStr(Price) + '个元宝购买了你的' + sName, c_Red, t_Hint);
end;
if (UserItem <> nil) and (StdItem <> nil) then begin
if not IsCheapStuff(StdItem.StdMode) then begin
if StdItem.boGameLog = 1 then
AddGameDataLog('37' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
PlayObject.m_sCharName + #9 +
StdItem.Name + #9 +
IntToStr(UserItem.MakeIndex) + #9 +
'1' + #9 +
m_sCharName);
end;
end;
if pricetype = 0 then begin
if g_boGameLogGold then
AddGameDataLog('14' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
sSTRING_GOLDNAME + #9 +
IntToStr(m_nGold) + #9 +
'1' + #9 +
PlayObject.m_sCharName);
end else begin
if g_boGameLogGameGold then
AddGameDataLog('17' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
sSTRING_GAMEGOLDNAME + #9 +
IntToStr(m_nGameGold) + #9 +
'2' + #9 +
PlayObject.m_sCharName);
end;
end else begin
SendMsg(Self, RM_BUYITEM_FAIL, 0, nCode, 0, 0, '');
end;
end;
procedure TPlayObject.SendAddPetSoulInfo(nMakeIndex: Integer);
var
boFind : Boolean;
i, ii : Integer;
UserItem : pTUserItem;
StdItem : pTStdItem;
begin
for ii := 0 to 7 do begin
boFind := False;
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[i];
if (UserItem.MakeIndex = m_SoulPetItemIndex[ii]) then begin
boFind := True;
Break;
end;
end;
if not boFind then begin
m_SoulPetItemIndex[ii] := nMakeIndex;
g_SmallPacketManage.Init();
g_SmallPacketManage.WriteInteger(nMakeIndex);
g_SmallPacketManage.WriteWord(ii);
g_SmallPacketManage.FillWrite(64, 0);
m_defMsg := MakeDefaultMsg(SM_ADDSOULPET, Integer(Self), 0, 0, 0);
SendSocket(@m_defMsg, g_SmallPacketManage.GetMsg);
Break;
end;
end;
end;
//发送魂佑灵兽信息
procedure TPlayObject.ClientQueryPetSoulInfo;
var
i, ii, nCount : Integer;
UserItem : pTUserItem;
StdItem : pTStdItem;
MagicList : array[0..40] of byte;
btID, btLv : byte;
begin
nCount := 0;
FillChar(m_SoulPetItemIndex, SizeOf(m_SoulPetItemIndex), #0);
g_LargePacketManage.Init();
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[i];
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if (StdItem <> nil) and (StdItem.StdMode = 49) and (StdItem.Shape = 51) and (UserItem.btItemExt[29] >= 2) then begin
g_LargePacketManage.WriteInteger(UserItem.MakeIndex);
g_LargePacketManage.WriteWord(nCount);
FillChar(MagicList, 41, 0);
//写入技能信息
for ii := 0 to 9 do begin
btID := UserItem.btExtra.PetMagics[ii].GetID();
btLv := UserItem.btExtra.PetMagics[ii].GetLv();
if (btID in [0..40]) and (btLv > 0) then begin
MagicList[btID] := (btLv shl 4) or (ii and $0F);
end;
end;
g_LargePacketManage.WriteBuffer(MagicList[0], 41);
//23个技能位没有用到,写0
g_LargePacketManage.FillWrite(23, 0);
m_SoulPetItemIndex[nCount] := UserItem.MakeIndex;
Inc(nCount);
end;
if nCount >= 8 then Break;
end;
if nCount > 0 then begin
m_defMsg := MakeDefaultMsg(SM_QUERYPETSOUL, Integer(Self), nCount, 0, 0);
SendSocket(@m_defMsg, g_LargePacketManage.GetMsg);
end;
end;
//发送魂佑灵兽装备
procedure TPlayObject.ClientQueryPetSoulItem(nMakeIndex: Integer; wIndex: word);
begin
if Assigned(m_VersionManage) then
try
m_VersionManage.OnQueryPetSoulItem(Self, nMakeIndex, wIndex);
except
MainOutMessage(Format('TPlayObject::OnQueryPetSoulItem SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
end;
//查询人物属性
procedure TPlayObject.ClientQueryAbility();
begin
if Assigned(m_VersionManage) then
try
m_VersionManage.OnQueryAbility(Self);
except
MainOutMessage(Format('TPlayObject::OnQueryAbility SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
end;
function TPlayObject.GetPetSoulItem(const nMakeIndex: Integer; boNew: Boolean = False): pTPetSoulItem;
var
PetSoulItems : pTPetSoulItem;
i : Integer;
begin
Result := nil;
PetSoulItems := nil;
for i := 0 to m_PetSoulItemsList.Count - 1 do begin
PetSoulItems := pTPetSoulItem(m_PetSoulItemsList.Items[i]);
if (PetSoulItems^.nMakeIndex = nMakeIndex) then begin //跟随的灵兽
Result := PetSoulItems;
Break;
end;
end;
if (Result = nil) and boNew then begin
New(Result);
FillChar(Result^, SizeOf(TPetSoulItem), 0);
Result^.nMakeIndex := nMakeIndex;
m_PetSoulItemsList.Add(Result);
end;
end;
//计算魂佑灵兽装备的属性
procedure TPlayObject.RecalcPetSoulAbilitys;
resourcestring
sExceptionMsg = '[Exception] TPlayObject::RecalcPetSoulAbilitys Name=%s Code=%d';
const
nMax : array[1..9] of Integer = (2, 4, 6, 4, 6, 4, 6, 4, 6);
var
btMagicID : byte;
i, nWhere : Integer;
PetSoulItems : pTPetSoulItem;
StdItem : pTStdItem;
StdItem18 : TStdItem;
UserItem : TUserItem;
nPetItemCount : array[1..9] of Integer;
nCheckCode : Integer;
begin
nCheckCode := 0;
try
m_FelementReduce := 0;
m_FelementRedouble := 0;
m_ReduceSkillRate := 0;
FillChar(m_ReduceSkillPoint, SizeOf(m_ReduceSkillPoint), #0);
nCheckCode := 1;
if (not m_boBeast) or (m_PetInfo[5].nMakeIndex = 0) or m_boPneuma then Exit;
nCheckCode := 2;
PetSoulItems := GetPetSoulItem(m_PetInfo[5].nMakeIndex, True);
if PetSoulItems = nil then Exit;
nCheckCode := 3;
for i := 1 to 9 do begin
nPetItemCount[i] := 0;
end;
nCheckCode := 4;
for nWhere := Low(PetSoulItems^.Items) to High(PetSoulItems^.Items) do begin
UserItem := PetSoulItems^.Items[nWhere];
nCheckCode := 5;
if UserItem.wIndex > 0 then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
StdItem18 := StdItem^;
nCheckCode := 6;
ItemUnit.GetItemAddValue(@UserItem, StdItem18);
m_FelementRedouble := _MIN(High(word), m_FelementRedouble + LoWord(StdItem18.DC)); //五行攻击
m_FelementReduce := _MIN(High(word), m_FelementReduce + LoWord(StdItem18.AC)); //五行防御
nCheckCode := 7;
btMagicID := UserItem.btItemExt[14]; //抵抗技能ID
for i := 0 to 40 do begin
if (btMagicID = g_BeastMagic[i].wSkillID) then begin
m_ReduceSkillPoint[i] := _MIN(High(byte), m_ReduceSkillPoint[i] + HiWord(StdItem18.MC)); //抵抗技能伤害
Break;
end;
end;
nCheckCode := 8;
if StdItem.Shape in [1..9] then Inc(nPetItemCount[StdItem.Shape]);
end;
end;
end;
nCheckCode := 9;
//装备数量激活抵抗技能几率
for i := 1 to 9 do begin
if (nPetItemCount[i] > nMax[i]) then begin
m_ReduceSkillRate := _MIN(10, m_ReduceSkillRate + i + 1); //几率最高为10
end;
end;
except
on E: Exception do
MainOutMessage(Format(sExceptionMsg, [m_sCharName, nCheckCode]));
end;
end;
//穿戴灵兽装备
procedure TPlayObject.ClientTakeOnPetSoulItem(nWhere, nMakeIndex: Integer; wIndex: word);
var
n18, n14, i : Integer;
StdItem : pTStdItem;
UserItem, TakeoffItem : pTUserItem;
sName : string;
StdItem18 : TStdItem;
PetSoulItems : pTPetSoulItem;
btReLive, btLevel : byte;
label
FailExit;
begin
if m_boPneuma or m_boGhost or m_boDeath then Exit;
if not (wIndex in [0..7]) then Exit;
if (m_PetInfo[0].nMakeIndex <> m_SoulPetItemIndex[wIndex]) and ((m_PetInfo[5].nMakeIndex <> m_SoulPetItemIndex[wIndex])) then begin
n18 := -1;
goto FailExit;
end;
PetSoulItems := GetPetSoulItem(m_SoulPetItemIndex[wIndex], True);
if PetSoulItems = nil then begin
n18 := -1;
goto FailExit;
end;
StdItem := nil;
UserItem := nil;
n14 := -1;
n18 := 0;
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[i]; //包裹里的物品
if (UserItem <> nil) and (UserItem.MakeIndex = nMakeIndex) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
n14 := i;
Break;
end;
end;
UserItem := nil;
end;
if (m_SoulPetItemIndex[wIndex] = m_PetInfo[0].nMakeIndex) then begin
btReLive := m_PetInfo[0].btReLive;
btLevel := m_PetInfo[0].wLevel;
end else begin
btReLive := m_PetInfo[5].btReLive;
btLevel := m_PetInfo[5].wLevel;
end;
if (StdItem <> nil) and (UserItem <> nil) then begin
if CheckPetUserItems(nWhere, StdItem) then begin
StdItem18 := StdItem^;
if (btReLive < 3) and (btLevel < StdItem18.NeedLevel) then begin
SysMsg('灵兽等级不满足条件,无法佩戴。', c_Red, t_Hint);
n18 := -1;
goto FailExit;
end;
TakeoffItem := nil;
if nWhere in [0..5] then begin
//取下物品
if PetSoulItems^.Items[nWhere].wIndex > 0 then begin
New(TakeoffItem);
TakeoffItem^ := PetSoulItems^.Items[nWhere];
end;
PetSoulItems^.Items[nWhere] := UserItem^;
DelBagItem(n14);
if TakeoffItem <> nil then begin
AddItemToBag(TakeoffItem);
SendAddItem(TakeoffItem);
end;
n18 := 1;
SendDefMessage(SM_TAKEPETSOULITEM, 0, MakeWord(1, 1), wIndex, 0, '');
RecalcPetSoulAbilitys;
RecalcAbilitys(); //重新计算属性
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
end;
end;
end;
FailExit:
if n18 <= 0 then
SendDefMessage(SM_TAKEPETSOULITEM, 0, MakeWord(1, 0), wIndex, 0, '');
end;
procedure TPlayObject.ClientTakeOffPetSoulItem(nWhere, nMakeIndex: Integer; wIndex: word);
var
i, n18 : Integer;
StdItem : pTStdItem;
UserItem : pTUserItem;
PetSoulItems : pTPetSoulItem;
label
FailExit;
begin
if m_boPneuma or m_boGhost or m_boDeath then Exit;
if not (wIndex in [0..7]) then Exit;
if (m_PetInfo[0].nMakeIndex <> m_SoulPetItemIndex[wIndex]) and ((m_PetInfo[5].nMakeIndex <> m_SoulPetItemIndex[wIndex])) then begin
n18 := -1;
goto FailExit;
end;
PetSoulItems := GetPetSoulItem(m_SoulPetItemIndex[wIndex], False);
if PetSoulItems = nil then begin
n18 := -1;
goto FailExit;
end;
n18 := 0;
if nWhere in [0..5] then begin
if PetSoulItems^.Items[nWhere].wIndex > 0 then begin
if PetSoulItems^.Items[nWhere].MakeIndex = nMakeIndex then begin
StdItem := UserEngine.GetStdItem(PetSoulItems^.Items[nWhere].wIndex);
if (StdItem <> nil) then begin
New(UserItem);
UserItem^ := PetSoulItems^.Items[nWhere];
if AddItemToBag(UserItem) then begin
PetSoulItems.Items[nWhere].wIndex := 0;
SendAddItem(UserItem);
SendDefMessage(SM_TAKEPETSOULITEM, 0, MakeWord(2, 1), wIndex, 0, '');
RecalcPetSoulAbilitys;
RecalcAbilitys(); //重新计算属性
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
n18 := 1;
end else begin
Dispose(UserItem);
n18 := -1;
end;
end;
end;
end;
end;
FailExit:
if n18 <= 0 then
SendDefMessage(SM_TAKEPETSOULITEM, 0, MakeWord(2, 0), wIndex, 0, '');
end;
procedure TPlayObject.RecalcPerHealthSpell();
var
nPerReply : Integer;
begin
inherited RecalcPerHealthSpell();
nPerReply := m_nAllIncReply div 10;
Inc(m_nPerHealth, nPerReply);
Inc(m_nPerSpell, nPerReply);
end;
//兽化
procedure TPlayObject.ClientMagOfPetBeast(nMakeIndex: Integer);
var
UserItem : pTUserItem;
StdItem : pTStdItem;
i : Integer;
btID, btLv : byte;
begin
if m_MagicSkills[SKILL_BEAST] = nil then Exit;
//先判断 nMakeIndex 的合法性
StdItem := nil;
for i := 0 to m_ItemList.Count - 1 do begin //包裹里的物品
UserItem := m_ItemList.Items[i];
StdItem := nil;
if (UserItem <> nil) and (UserItem.MakeIndex = nMakeIndex) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
Break;
end;
end;
if (StdItem <> nil) and (UserItem <> nil) and
(StdItem.StdMode = 49) and (StdItem.Shape = 51) and
(UserItem.btItemExt[29] in [2, 3]) then begin
if m_boBeast then begin
m_boBeast := False;
m_PetInfo[5].nMakeIndex := 0;
m_PetInfo[5].wLevel := 0;
m_PetInfo[5].btType := 0;
m_PetInfo[5].btReLive := 0;
UserItem.btItemExt[29] := 2;
SendUpdateItem(UserItem, False);
SendDefMessage(SM_PETBAGSIZE, Integer(Self), 0, m_nPetShopSize, m_nPetBagSize, '');
m_defMsg := MakeDefaultMsg(34977, 0, 100, 0, 0);
SendSocket(@m_defMsg, EnCodeBuffer(@nMakeIndex, 4));
SendRefMsg(RM_510, 1, 0, 171, 0, '');
//SysMsg('附体魂佑灵兽已经收回到包裹中,魂佑附体状态解除!', c_Red, t_Hint);
end else begin
if (m_Pet <> nil) and (m_PetInfo[0].nMakeIndex <> 0) then begin
m_boBeast := True;
for i := 0 to 9 do begin
btID := UserItem.btExtra.PetMagics[i].GetID();
btLv := UserItem.btExtra.PetMagics[i].GetLv();
if (btID in [0..40]) and (btLv > 0) then begin
m_ReduceSkillLevel[btID] := btLv;
end;
end;
UserItem.btItemExt[29] := 3;
SendUpdateItem(UserItem, False);
SendRefMsg(RM_510, 1, 0, 170, 0, '');
m_PetInfo[5] := m_PetInfo[0];
SendPetInfo($0A);
m_nCharStatus := GetCharStatus();
StatusChanged();
g_SmallPacketManage.Init;
g_SmallPacketManage.WriteWord(m_nCurrY);
g_SmallPacketManage.WriteWord(m_Pet.m_nCurrX);
g_SmallPacketManage.WriteWord(m_Pet.m_nCurrY);
SendRefMsg(RM_PETBEAST, m_nCurrX, Integer(m_Pet), 0, 0, g_SmallPacketManage.GetMsg);
//SysMsg('魂佑灵兽化为魂佑,附体于你!你感觉力量无穷!', c_Red, t_Hint);
PetHide(m_PetInfo[0].nMakeIndex);
end else begin
SysMsg('需要魂佑灵兽处于跟随状态,才能使用兽化技能', c_Red, t_Hint);
Exit;
end;
end;
RecalcPetSoulAbilitys;
RecalcAbilitys(); //重新计算属性
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
SendMsg(Self, RM_SUBABILITY, 0, 0, 0, 0, '');
end;
end;
function TPlayObject.GetAchievementInfo(const wIndex: word): PTAchievementInfo;
var
pAchievementInfo : PTAchievementInfo;
i : Integer;
begin
Result := nil;
pAchievementInfo := nil;
for i := 0 to m_AchievementList.Count - 1 do begin
pAchievementInfo := PTAchievementInfo(m_AchievementList.Items[i]);
if (pAchievementInfo^.wIndex = wIndex) then begin
Result := pAchievementInfo;
Break;
end;
end;
end;
procedure TPlayObject.SendWenPeiJH(); //发送纹佩精华
begin
if m_dwWenPeiJH = 0 then Exit;
m_defMsg := MakeDefaultMsg(SM_WENPEIJH, Integer(Self), m_dwWenPeiJH, 0, 0);
SendSocket(@m_defMsg, '');
end;
{-------------------------------------------------------------------------------
过程名: TPlayObject.ClientAchievementSystem
作者: Cloud
日期: 2013.03.17
参数: boWenPei 是否发送纹佩宝盒的列表给客户端
返回值: 无
-------------------------------------------------------------------------------}
procedure TPlayObject.ClientAchievementSystem(boWenPei: Boolean = False); //成就系统
var
AchievementSystem : TClientAchievementInfo;
pAchievementInfo : PTAchievementInfo;
i : Integer;
sWenPeiBox : string;
XmlAchievement : PTXmlAchievement;
begin
if m_boPneuma then Exit;
if m_boGhost or m_boDeath then Exit;
if m_AchievementList.Count = 0 then Exit;
g_LargePacketManage.Init(); //从0位开始写
m_wAchievePoint := 0;
for i := 0 to m_AchievementList.Count - 1 do begin
pAchievementInfo := PTAchievementInfo(m_AchievementList.Items[i]);
XmlAchievement := GetXmlAchievement(pAchievementInfo^.wIndex);
if XmlAchievement = nil then
Continue;
if (pAchievementInfo^.tData > 0) then
Inc(m_wAchievePoint);
AchievementSystem.dwData := 0;
if pAchievementInfo^.tData <> 0 then
AchievementSystem.dwData := DateTimeToWolTIme(pAchievementInfo^.tData);
AchievementSystem.wIndex := pAchievementInfo^.wIndex;
AchievementSystem.wStep := pAchievementInfo^.wStep;
AchievementSystem.btprize := XmlAchievement^.btprize;
AchievementSystem.dwprizeValue := XmlAchievement^.dwprizeValue;
g_LargePacketManage.WriteBuffer(AchievementSystem, SizeOf(TClientAchievementInfo)); //写入成就
end;
if boWenPei then begin
sWenPeiBox := '';
for i := Low(m_WenPeiBox) to High(m_WenPeiBox) do begin
if m_WenPeiBox[i] <> 0 then
sWenPeiBox := sWenPeiBox + '|' + IntToStr(m_WenPeiBox[i])
else
Break;
end;
m_defMsg := MakeDefaultMsg(SM_WENPEIBOX, Integer(Self), Length(sWenPeiBox), m_wAchievePoint, 0);
SendSocket(@m_defMsg, EnCodeString(sWenPeiBox));
end;
m_defMsg := MakeDefaultMsg(SM_ACHIEVEMENTLIST, 0, m_AchievementList.Count, 0, 0);
SendSocket(@m_defMsg, g_LargePacketManage.GetMsg());
end;
{-------------------------------------------------------------------------------
过程名: TPlayObject.ClientMakeWenPei
作者: Cloud
日期: 2013.03.17
参数: btZW=主纹 btJW=精纹 btDW=底纹 btBW=边纹
返回值: 无
-------------------------------------------------------------------------------}
procedure TPlayObject.ClientMakeWenPei(btZW, btJW, btDW, btBW: byte);
function DelWens(): Integer;
var
i, j, ii : Integer;
WenPei : array[0..3] of byte;
nWen : Integer;
boHave : Boolean;
begin
Result := -1;
nWen := 0;
for i := Low(m_WenPeiBox) to High(m_WenPeiBox) do begin
if m_WenPeiBox[i] <> 0 then
nWen := i
else
Break;
end;
WenPei[0] := btZW;
WenPei[1] := btJW;
WenPei[2] := btDW;
WenPei[3] := btBW;
ii := 0;
for i := 0 to 3 do begin
boHave := False;
for j := 0 to nWen do begin
if m_WenPeiBox[j] = WenPei[i] then begin
WenPei[i] := j;
Inc(ii);
boHave := True;
Break;
end;
end;
if not boHave then begin
Result := i + 1;
Exit;
end;
end;
if ii = 4 then begin
for i := 0 to 3 do begin
m_WenPeiBox[WenPei[i]] := 0;
end;
i := 0;
for j := 0 to nWen do begin
if m_WenPeiBox[j] <> 0 then begin
m_WenPeiBox[i] := m_WenPeiBox[j];
Inc(i);
end;
end;
for i := nWen - 3 to nWen do begin
m_WenPeiBox[i] := 0;
end;
Result := 0;
end;
end;
var
UserItem : pTUserItem;
StdItem : pTStdItem;
nResult : Integer;
sError : string;
begin
if m_boPneuma then Exit;
if m_boGhost or m_boDeath then Exit;
if (btZW = 0) or (btJW = 0) or (btDW = 0) or (btBW = 0) then
Exit;
if (btZW > 255) or (btJW > 255) or (btDW > 255) or (btBW > 255) then
Exit;
if m_ItemList.Count < m_nBagSize then begin
nResult := DelWens();
if nResult = 0 then begin
New(UserItem);
if UserEngine.CopyToUserItemFromName('三界纹佩', UserItem) then begin
UserItem.btItemExt[4] := 1; // 三界纹佩 必须绑定
UserItem.btItemExt[16] := btZW; // 主纹
UserItem.btItemExt[17] := btJW; // 精纹
UserItem.btItemExt[18] := btDW; // 底纹
UserItem.btItemExt[19] := btBW; // 边纹
UserItem.btItemExt[20] := 0; // 星级
//主纹 加属性
UserItem.btItemExt[21] := g_Config.WenPeiList[btZW].btType;
UserItem.btItemExt[22] := g_Config.WenPeiList[btZW].btValue;
Inc(UserItem.btItemExt[31], g_Config.WenPeiList[btZW].btAbsorb);
//精纹 加属性
UserItem.btItemExt[23] := g_Config.WenPeiList[btJW].btType;
UserItem.btItemExt[24] := g_Config.WenPeiList[btJW].btValue;
Inc(UserItem.btItemExt[31], g_Config.WenPeiList[btJW].btAbsorb);
//底纹 加属性
UserItem.btItemExt[25] := g_Config.WenPeiList[btDW].btType;
UserItem.btItemExt[26] := g_Config.WenPeiList[btDW].btValue;
Inc(UserItem.btItemExt[31], g_Config.WenPeiList[btDW].btAbsorb);
//边纹 加属性
UserItem.btItemExt[27] := g_Config.WenPeiList[btBW].btType;
UserItem.btItemExt[28] := g_Config.WenPeiList[btBW].btValue;
Inc(UserItem.btItemExt[31], g_Config.WenPeiList[btBW].btAbsorb);
UserItem.btItemExt[29] := 0; // 五行强化的百分比
UserItem.btItemExt[30] := 0; // 强化后的五行吸收
m_ItemList.Add((UserItem));
SendAddItem(UserItem);
WeightChanged();
SendDefMessage(SM_TASKWEN, Integer(Self), btZW, 0, 0, ''); //通知客户端删除主纹
SendDefMessage(SM_TASKWEN, Integer(Self), btJW, 0, 0, ''); //通知客户端删除精纹
SendDefMessage(SM_TASKWEN, Integer(Self), btDW, 0, 0, ''); //通知客户端删除底纹
SendDefMessage(SM_TASKWEN, Integer(Self), btBW, 0, 0, ''); //通知客户端删除边纹
SendDefMessage(SM_MAKEWENPEI_SUCCESS, Integer(Self), MakeWord(btZW, btJW), MakeWord(btDW, btBW), 0, '');
SendDefMessage(SM_INFORMATION, 0, 0, 0, 0, '合成成功,纹佩已经放入你的包裹中!');
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem.boGameLog = 1 then
AddGameDataLog('9' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
'三界纹佩' + #9 +
IntToStr(UserItem.MakeIndex) + #9 +
'1' + #9 +
m_sCharName);
end else begin
Dispose(UserItem);
SendDefMessage(SM_INFORMATION, 0, 0, 0, 0, '合成失败,三界纹佩不存在数据库!');
end;
end else begin
case nResult of
1: sError := '存在非法的纹佩组件(主纹)';
2: sError := '存在非法的纹佩组件(精纹)';
3: sError := '存在非法的纹佩组件(底纹)';
4: sError := '存在非法的纹佩组件(边纹)';
end;
SendDefMessage(SM_INFORMATION, 0, 0, 0, 0, '合成失败,' + sError);
SysMsg(sError, c_Red, t_Hint);
end;
end else begin
SendDefMessage(SM_INFORMATION, 0, 0, 0, 0, '合成失败,包裹必须要有一个空位!');
end;
end;
//取强化纹佩需要精化
function GetQFWenPeiDemandJF(const UserItem: pTUserItem): Integer;
begin
Result := 100;
if UserItem.btItemExt[20] > 0 then
Result := UserItem.btItemExt[20] * 300;
end;
//取拆解纹佩需要灵力
function GetCJWenPeiDemandLL(const UserItem: pTUserItem): Integer;
var
eRate : Single;
begin
Result := 0;
if UserItem.btItemExt[29] > 0 then begin
eRate := UserItem.btItemExt[29] / 100;
Inc(Result, Trunc(UserItem.btItemExt[22] * eRate));
Inc(Result, Trunc(UserItem.btItemExt[24] * eRate));
Inc(Result, Trunc(UserItem.btItemExt[26] * eRate));
Inc(Result, Trunc(UserItem.btItemExt[28] * eRate));
Inc(Result, Trunc(UserItem.btItemExt[31] * (UserItem.btItemExt[30] / 100)));
end;
end;
{-------------------------------------------------------------------------------
过程名: TPlayObject.ClientGetWenPeiDemand //查询 强化 或 拆解纹佩 的需求
作者: Cloud
日期: 2013.03.17
参数: nMakeIndex=物品Index nCode= 0强化 1拆解
返回值: 无
-------------------------------------------------------------------------------}
procedure TPlayObject.ClientGetWenPeiDemand(nMakeIndex, nCode: Integer);
var
UserItem : pTUserItem;
StdItem : pTStdItem;
nQF, nCJ : Integer;
begin
if m_boPneuma then Exit;
if m_boGhost or m_boDeath then Exit;
if nMakeIndex = 0 then Exit;
if GetUserItemByMakeIndex(nMakeIndex, UserItem) <> -1 then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem.StdMode = 111 then begin
nQF := 0;
nCJ := 0;
if (nCode = 0) then begin //强化
if UserItem.btItemExt[20] >= 10 then begin
nQF := 0;
end else begin
nQF := GetQFWenPeiDemandJF(UserItem);
end;
end;
if (nCode = 1) then begin //拆解
nCJ := GetCJWenPeiDemandLL(UserItem);
end;
SendDefMessage(SM_GETWENPEI_DEMAND, Integer(Self), nQF, nCJ, nCode, '');
end;
end else begin
end;
end;
{-------------------------------------------------------------------------------
过程名: TPlayObject.ClientTakeWenPei 强化 或 拆解 纹佩
作者: Cloud
日期: 2013.03.17
参数: nMakeIndex=物品Index nCode= 0强化 1拆解
返回值: 无
-------------------------------------------------------------------------------}
procedure TPlayObject.ClientTakeWenPei(nMakeIndex, nCode: Integer);
var
UserItem : pTUserItem;
StdItem : pTStdItem;
i, ii, nQF, nCJ, nWen : Integer;
eRate : Single;
begin
if m_boPneuma then Exit;
if m_boGhost or m_boDeath then Exit;
if nMakeIndex = 0 then Exit;
if GetUserItemByMakeIndex(nMakeIndex, UserItem) <> -1 then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem.StdMode = 111 then begin
nQF := 0;
nCJ := 0;
if nCode = 0 then begin //强化
if UserItem.btItemExt[20] < 10 then begin
nQF := GetQFWenPeiDemandJF(UserItem);
if m_dwWenPeiJH >= nQF then begin
if nQF > 0 then begin
Dec(m_dwWenPeiJH, nQF);
SendWenPeiJH();
end;
SendDefMessage(SM_INFORMATION, 0, 0, 0, 0, '您的纹佩强化成功!');
Inc(UserItem.btItemExt[20], 1);
case UserItem.btItemExt[20] of
01: UserItem.btItemExt[29] := 10;
02: UserItem.btItemExt[29] := 20;
03: UserItem.btItemExt[29] := 30;
04: UserItem.btItemExt[29] := 50;
05: UserItem.btItemExt[29] := 70;
06: UserItem.btItemExt[29] := 90;
07: UserItem.btItemExt[29] := 110;
08: UserItem.btItemExt[29] := 140;
09: UserItem.btItemExt[29] := 170;
10: UserItem.btItemExt[29] := 200;
end;
UserItem.btItemExt[30] := Trunc(UserItem.btItemExt[20] * 1.4);
SendUpdateItem(UserItem);
ClientGetWenPeiDemand(nMakeIndex, 0);
end else begin
SendDefMessage(SM_INFORMATION, 0, 0, 0, 0, '您的纹佩精华不足!');
end;
end else begin
SendDefMessage(SM_INFORMATION, 0, 0, 0, 0, '您的纹佩以达到强化最大等级!');
end;
end else if nCode = 1 then begin //拆解
nCJ := GetCJWenPeiDemandLL(UserItem);
if m_Abil.wNimBusPoint >= nCJ then begin
nWen := -1;
for i := Low(m_WenPeiBox) to High(m_WenPeiBox) do begin
if m_WenPeiBox[i] = 0 then begin
nWen := i;
Break;
end;
end;
if (nWen <> -1) and ((nWen + 3) <= 99) then begin
if nCJ > 0 then begin
Dec(m_Abil.wNimBusPoint, nCJ);
RecalcAbilitys();
SendMsg(Self, RM_ABILITY, 0, 0, 0, 0, '');
end;
nQF := 0;
if UserItem.btItemExt[20] > 0 then begin
nQF := 100;
for i := 1 to UserItem.btItemExt[20] - 1 do
nQF := nQF + i * 300;
end;
Inc(m_dwWenPeiJH, nQF);
SendWenPeiJH();
ii := 16;
for i := nWen to nWen + 3 do begin
m_WenPeiBox[i] := UserItem^.btItemExt[ii];
Inc(ii);
SendDefMessage(SM_TASKWEN, Integer(Self), MakeWord(m_WenPeiBox[i], 1), 0, 0, '');
end;
SendDelItems(UserItem);
DelBagItem(UserItem^.MakeIndex, '');
SendDefMessage(SM_ACHIEVEMENT__OK, Integer(Self), 0, 0, 0, '');
SendDefMessage(SM_INFORMATION, 0, 0, 0, 0, '拆卸成功,纹佩部件和纹佩精华已放回纹佩宝盒!');
end else begin
SendDefMessage(SM_ACHIEVEMENT__OK, Integer(Self), 0, 1, 0, '');
end;
end else begin
SendDefMessage(SM_INFORMATION, 0, 0, 0, 0, '您的灵力值不够!');
SendDefMessage(SM_ACHIEVEMENT__OK, Integer(Self), 0, 1, 0, '');
end;
end;
end;
end else begin
end;
end;
{-------------------------------------------------------------------------------
过程名: TPlayObject.ClientCollectSuits 成就之收集套装
作者: Cloud
日期: 2013.03.17
参数: nCJIdx = 要做的套装成就 nCount=套装组件数量 sData 选择的套装组件索引
返回值: 无
-------------------------------------------------------------------------------}
procedure TPlayObject.ClientCollectSuits(nCJIdx, nCount: Integer; sData: string);
var
UserItem : pTUserItem;
nMakeIndexs : array[0..7] of DWORD;
i : Integer;
boFail : Boolean;
begin
if m_boPneuma then Exit;
if m_boGhost or m_boDeath then Exit;
if nCJIdx = 0 then Exit;
if (nCount = 0) or (nCount > 8) then Exit;
if (sData = '') then Exit;
if GetXmlAchievement(nCJIdx) = nil then Exit;
FillChar(nMakeIndexs, SizeOf(DWORD) * 8, 0);
DeCodeBuffer(sData, @nMakeIndexs[0], SizeOf(Integer) * nCount);
boFail := False;
if GetAchievementInfo(nCJIdx) = nil then begin
for i := 0 to nCount - 1 do begin
if GetUserItemByMakeIndex(nMakeIndexs[i], UserItem) = -1 then begin
boFail := True;
Break;
end;
end;
end else begin
boFail := True;
end;
if not boFail then begin
m_sScriptParam[0] := IntToStr(nCount);
for i := 0 to 7 do
m_sScriptParam[i + 1] := IntToStr(nMakeIndexs[i]);
ExecuteScript(g_FunctionNPC, '@套装成就' + IntToStr(nCJIdx));
//如果物品还存在,也是失败
if GetUserItemByMakeIndex(nMakeIndexs[0], UserItem) <> -1 then begin
boFail := True;
end;
end;
SendDefMessage(SM_ACHIEVEMENT__OK, Integer(Self), 1, Integer(boFail), 0, '');
end;
procedure TPlayObject.SendPetAttribute(PlayObject: TPlayObject; btWhere: byte; UserItem: pTUserItem); //发送灵兽石附加属性
begin
if Assigned(m_VersionManage) then
try
m_VersionManage.OnSendPetAttribute(Self, PlayObject, btWhere, UserItem);
except
MainOutMessage(Format('TPlayObject::OnSendPetAttribute SoftVersionDate:%d', [m_VersionManage.SoftVersionDate]));
end;
end;
procedure TPlayObject.SendBagItemsPetInfo();
var
UserItem : pTUserItem;
StdItem : pTStdItem;
i, n15, n16 : Integer;
RidePetInfo : TRidePetInfo;
SoulPetInfoAdd : TSoulPetInfoAdd;
SoulPetInfo : TSoulPetInfo;
begin
n15 := 0;
n16 := 0;
g_SmallPacketManage.Init;
g_PacketManage3.Init;
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList.Items[i];
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
if (StdItem.StdMode = 49) and (StdItem.Shape = 51) then begin
RidePetInfo := UserItem.GetRidePetInfo;
RidePetInfo.btRace := MakeByte(UserItem.btValue[8], StdItem.AniCount);
//3转灵兽
if (UserItem.btValue[9] > 2) then begin
SoulPetInfoAdd := UserItem.GetSoulPetInfoAdd;
SoulPetInfoAdd.btRace := RidePetInfo.btRace;
SoulPetInfo := UserItem.GetSoulPetInfo;
//写入三转灵兽属性
g_PacketManage3.WriteBuffer(SoulPetInfoAdd, SizeOf(TSoulPetInfoAdd));
//在写一遍魂佑信息
g_PacketManage3.WriteBuffer(SoulPetInfo, SizeOf(TSoulPetInfo));
//技能信息,填0就可以了
g_PacketManage3.FillWrite(64, 0);
Inc(n15);
end else begin
g_SmallPacketManage.WriteBuffer(RidePetInfo, SizeOf(TRidePetInfo));
Inc(n16);
end;
end;
end;
end;
for i := 0 to m_PetItemList.Count - 1 do begin
UserItem := m_PetItemList.Items[i];
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
if (StdItem.StdMode = 49) and (StdItem.Shape = 51) then begin
RidePetInfo := UserItem.GetRidePetInfo;
RidePetInfo.btRace := MakeByte(UserItem.btValue[8], StdItem.AniCount);
//3转灵兽
if (UserItem.btValue[9] > 2) then begin
SoulPetInfoAdd := UserItem.GetSoulPetInfoAdd;
SoulPetInfoAdd.btRace := RidePetInfo.btRace;
SoulPetInfo := UserItem.GetSoulPetInfo;
//写入三转灵兽属性
g_PacketManage3.WriteBuffer(SoulPetInfoAdd, SizeOf(TSoulPetInfoAdd));
//在写一遍魂佑信息
g_PacketManage3.WriteBuffer(SoulPetInfo, SizeOf(TSoulPetInfo));
//技能信息,填0就可以了
g_PacketManage3.FillWrite(64, 0);
Inc(n15);
end else begin
g_SmallPacketManage.WriteBuffer(RidePetInfo, SizeOf(TRidePetInfo));
Inc(n16);
end;
end;
end;
end;
if (n16 > 0) or (n15 > 0) then begin
g_SmallPacketManage.WriteInteger($007A2626);
g_SmallPacketManage.WriteWord(n15); //数量
g_SmallPacketManage.WriteBuffer(g_PacketManage3.Memory^, g_PacketManage3.Position);
m_defMsg := MakeDefaultMsg(SM_RIDEPETINFO, Integer(Self), 24, 0, n16);
SendSocket(@m_defMsg, g_SmallPacketManage.GetMsg());
end;
end;
function TPlayObject.TrainingPetSkill(const StdItem: pTStdItem): Boolean;
var
i, btPos : Integer;
btID, btLv : byte;
UserItem : pTUserItem;
// StdItemA : pTStdItem;
boFound : Boolean;
begin
Result := False;
boFound := False;
if (m_Pet <> nil) then begin
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := m_ItemList[i];
if UserItem.MakeIndex = m_PetInfo[0].nMakeIndex then begin
boFound := True;
Break;
end;
end;
end;
if (not boFound) or (UserItem.btItemExt[29] < 2) then begin
SysMsg('请放出一只魂佑灵兽并使之处于跟随状态', c_Red, t_Hint);
Exit;
end;
if (UserItem.wLevel < StdItem.NeedLevel) then begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, '灵兽等级不够');
Exit;
end;
// $PETMAGIC(X)
btPos := -1;
for i := 9 downto 0 do begin
btID := UserItem.btExtra.PetMagics[i].GetID();
btLv := UserItem.btExtra.PetMagics[i].GetLv();
if (btLv > 0) then begin
if (btID = LoWord(StdItem.AC)) then begin
btPos := -2;
Break;
end;
end else
btPos := i;
end;
case btPos of
-1: begin
SysMsg('已经没有技能空位来学习新技能了,请清空技能格后再来学习', c_Red, t_Hint);
Exit;
end;
-2: begin
SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(Self), 0, 0, '该灵兽已经习得这个技能。');
Exit;
end;
else begin
Result := True;
btID := LoWord(StdItem.AC);
btLv := StdItem.DuraMax + 1;
if (btPos in [0..9]) and (btLv in [1..4]) then begin
UserItem.btExtra.PetMagics[btPos].SetInfo(btID, btLv);
m_defMsg := MakeDefaultMsg(SM_COMPREHENDSKILL, Integer(Self), LoWord(UserItem.MakeIndex), HiWord(UserItem.MakeIndex), MakeWord(btLv, btID));
SendSocket(@m_defMsg, EnCodeBuffer(@btPos, 1));
end;
end;
end;
end;
procedure TPlayObject.SendStruckMsg(wIdent: word; BaseObject, Attacker: TBaseObject; nDamage: Integer; wEffect: word);
begin
if g_Config.boDisableSelfStruck and (BaseObject = Self) then Exit;
g_SmallPacketManage.Init;
//发送心魔、人类 攻击值
{$IF DEMONSERVER = 1}
if (BaseObject.m_btRaceServer = RC_PLAYOBJECT) and (m_btDemonMode > 0) then begin
g_PacketManage3.Init;
g_PacketManage3.WriteByte(1);
g_PacketManage3.WriteByte(m_btDemonForce);
g_PacketManage3.WriteInteger(Integer(Self));
g_PacketManage3.WriteInteger(0);
SendRefMsg(RM_DEMONHIT, 0, Integer(Self), 0, 0, g_PacketManage3.GetMsg);
if (m_btDemonForce = 0) then begin
m_sScriptParam[0] := IntToStr(m_btDemonMode);
m_btDemonMode := 0;
ExecuteScript(g_FunctionNPC, '@_心魔_人类心魔被杀');
end;
end;
{$IFEND}
if (BaseObject <> nil) and (not BaseObject.m_boDeath) then begin
g_SmallPacketManage.WriteInteger(BaseObject.GetFeature(nil));
g_SmallPacketManage.WriteInteger(BaseObject.m_nCharStatus);
g_SmallPacketManage.WriteInteger(Integer(Attacker));
//人被攻击
if (BaseObject.m_btRaceServer = RC_PLAYOBJECT) then begin
if wIdent = RM_STRUCK_NEWMAG1 then begin
g_SmallPacketManage.WriteInteger(MakeLong(0, wEffect));
if (BaseObject = Self) then begin
m_defMsg := MakeDefaultMsg(SM_47,
Integer(BaseObject),
BaseObject.m_WAbil.dwHP,
BaseObject.m_WAbil.dwMaxHP,
nDamage);
g_SmallPacketManage.WriteWord(BaseObject.m_WAbil.wElementForce); //自己被攻击才会发送元力的信息
g_SmallPacketManage.WriteWord(BaseObject.m_WAbil.wElementForceMax);
g_SmallPacketManage.WriteByte(02);
g_SmallPacketManage.WriteInteger(BaseObject.m_WAbil.dwHP);
g_SmallPacketManage.WriteInteger(BaseObject.m_WAbil.dwMaxHP);
end else begin
m_defMsg := MakeDefaultMsg(SM_47,
Integer(BaseObject),
CalcCent(BaseObject.m_WAbil.dwHP, BaseObject.m_WAbil.dwMaxHP),
CalcCent(BaseObject.m_WAbil.wElementForce, BaseObject.m_WAbil.wElementForceMax),
nDamage);
g_SmallPacketManage.WriteByte(02);
g_SmallPacketManage.WriteInteger(0);
g_SmallPacketManage.WriteInteger(0);
end;
end else begin
//人被攻击 会带有时间参数
g_SmallPacketManage.WriteInteger(DateTimeToWolTIme(Now));
if (BaseObject = Self) then begin
m_defMsg := MakeDefaultMsg(SM_STRUCK,
Integer(BaseObject), //被攻击者
BaseObject.m_WAbil.dwHP,
BaseObject.m_WAbil.dwMaxHP,
nDamage);
g_SmallPacketManage.WriteWord(BaseObject.m_WAbil.wElementForce); //自己被攻击才会发送元力的信息
g_SmallPacketManage.WriteWord(BaseObject.m_WAbil.wElementForceMax);
g_SmallPacketManage.WriteInteger(BaseObject.m_WAbil.dwHP);
g_SmallPacketManage.WriteInteger(BaseObject.m_WAbil.dwMaxHP);
end else begin
m_defMsg := MakeDefaultMsg(SM_STRUCK,
Integer(BaseObject), //被攻击者
CalcCent(BaseObject.m_WAbil.dwHP, BaseObject.m_WAbil.dwMaxHP),
CalcCent(BaseObject.m_WAbil.wElementForce, BaseObject.m_WAbil.wElementForceMax),
nDamage);
g_SmallPacketManage.WriteInteger(0);
g_SmallPacketManage.WriteInteger(0);
end;
end;
end else begin
if wIdent = RM_STRUCK_NEWMAG1 then begin
m_defMsg := MakeDefaultMsg(SM_47,
Integer(BaseObject),
CalcCent(BaseObject.m_WAbil.dwHP, BaseObject.m_WAbil.dwMaxHP),
BaseObject.m_wMaxHPCent,
nDamage);
g_SmallPacketManage.WriteInteger(MakeLong(0, wEffect));
g_SmallPacketManage.WriteInteger(0);
g_SmallPacketManage.WriteByte(0);
if BaseObject.m_WAbil.dwMaxHP > High(word) then begin
g_SmallPacketManage.WriteInteger(BaseObject.m_WAbil.dwHP);
g_SmallPacketManage.WriteInteger(BaseObject.m_WAbil.dwMaxHP);
end else begin
g_SmallPacketManage.WriteInteger(CalcCent(BaseObject.m_WAbil.dwHP, BaseObject.m_WAbil.dwMaxHP));
g_SmallPacketManage.WriteInteger($64);
end;
end else begin
m_defMsg := MakeDefaultMsg(SM_STRUCK,
Integer(BaseObject), //被攻击者
CalcCent(BaseObject.m_WAbil.dwHP, BaseObject.m_WAbil.dwMaxHP),
BaseObject.m_wMaxHPCent,
nDamage);
g_SmallPacketManage.WriteInteger(0);
if BaseObject.m_WAbil.dwMaxHP > High(word) then begin
g_SmallPacketManage.WriteInteger(BaseObject.m_WAbil.dwHP);
g_SmallPacketManage.WriteInteger(BaseObject.m_WAbil.dwMaxHP);
end else begin
g_SmallPacketManage.WriteInteger(CalcCent(BaseObject.m_WAbil.dwHP, BaseObject.m_WAbil.dwMaxHP));
g_SmallPacketManage.WriteInteger($64);
end;
end;
end;
g_SmallPacketManage.WriteInteger(0);
g_SmallPacketManage.WriteInteger(0);
SendSocket(@m_defMsg, g_SmallPacketManage.GetMsg);
end;
end;
procedure TPlayObject.OnEnvirnomentChanged(OldEnvir: TEnvirnoment; boChanged: Boolean = True);
begin
inherited OnEnvirnomentChanged(OldEnvir, boChanged);
if boChanged then begin
if (m_Pet <> nil) and (m_PetInfo[0].btType in [26..28]) and (not m_PEnvir.m_MapFlag.boCanRideShark) then begin //鲨鱼在普通地图不能出现
PetHide(m_PetInfo[0].nMakeIndex);
end;
if (m_Tiger <> nil) and m_PEnvir.m_MapFlag.boNOTIGER then begin
ClientReCallTiger;
end;
//心魔控制面板
if (m_nEvilFollowerPower > 0) then begin
ClientQueryEvilFollower;
end;
m_sTimerLabel := '';
m_dwTimerLong := 0;
m_sMapNewDesc := '';
if (OldEnvir <> nil) then
m_sScriptParam[0] := OldEnvir.m_sMapName
else
m_sScriptParam[0] := '';
ExecuteScript(g_FunctionNPC, '@地图变更');
end;
end;
//升级灵兽装备
procedure TPlayObject.ClientPetEquipUp(nPetItemIdx, nStoreItemIdx: Integer; sData: string);
var
nGemItemIdx : array[0..1] of Integer;
begin
if (nPetItemIdx = 0) or (nStoreItemIdx = 0) then Exit;
if (sData = '') then Exit;
FillChar(nGemItemIdx, SizeOf(Integer) * 2, 0);
DeCodeBuffer(sData, @nGemItemIdx[0], SizeOf(Integer) * 2);
m_sScriptParam[0] := IntToStr(nPetItemIdx);
m_sScriptParam[1] := IntToStr(nStoreItemIdx);
m_sScriptParam[2] := IntToStr(nGemItemIdx[0]);
m_sScriptParam[3] := IntToStr(nGemItemIdx[1]);
if m_ClickNPC <> nil then
TNormNpc(m_ClickNPC).GotoLable(Self, '@@PetEquipUp', False);
end;
procedure TPlayObject.SlaveTransferDamage(var nDamage: Integer);
var
i, nTransfer, nObjCount : Integer;
BaseObject : TBaseObject;
begin
for i := 0 to m_SlaveList.Count - 1 do begin
BaseObject := m_SlaveList[i];
if BaseObject.m_boIsGodCallBoss or BaseObject.m_boScapeGoat or BaseObject.m_boIsPet or
BaseObject.m_boGodCallBoss or (BaseObject.m_btRaceServer in [212, 214]) or (BaseObject.m_boStickMode) or
(BaseObject.m_btRaceServer in [206]) then
Continue;
if CretInNear10XY(BaseObject, m_nCurrX, m_nCurrY) then begin
nObjCount := Integer(Self);
BaseObject.SendRefMsg(RM_510, HiWord(nObjCount), LoWord(nObjCount), 104, 0, '');
nTransfer := Round(nDamage * (_MIN(m_WAbil.btShiftDamage, 90)) / 100);
Dec(nDamage, nTransfer);
if nTransfer > 0 then begin
BaseObject.StruckDamage(nTransfer);
BaseObject.SendRefMsg(RM_STRUCK, 0, nTransfer, 0, Integer(Self), '');
end;
end;
Break;
end;
end;
procedure TPlayObject.BaoBaoTransferDamage(var nDamage: Integer); //道神符印斗转
var
i, nTransfer, nObjCount : Integer;
BaseObject : TBaseObject;
begin
for i := 0 to m_SlaveList.Count - 1 do begin
BaseObject := m_SlaveList[i];
if (not BaseObject.m_boProBaoBao) then
Continue;
if CretInNear10XY(BaseObject, m_nCurrX, m_nCurrY) then begin
nObjCount := Integer(Self);
BaseObject.SendRefMsg(RM_510, HiWord(nObjCount), LoWord(nObjCount), 104, 0, '');
nTransfer := Round(nDamage * (_MIN(g_Config.nDouZhuanDamagePercent, 90)) / 100);
Dec(nDamage, nTransfer);
if nTransfer > 0 then begin
BaseObject.StruckDamage(nTransfer);
BaseObject.SendRefMsg(RM_STRUCK, 0, nTransfer, 0, Integer(Self), '');
end;
end;
Break;
end;
end;
//化身蝙蝠、遁地、移行换影
function TPlayObject.MagDoBatfly(UserMagic: pTUserMagic; nTargetX, nTargetY: Integer): Boolean;
var
FlyData : TShunyiData;
s1C, sName : string;
nPower, nMagID, nSecPwr, n20 : Integer;
nOldX, nOldY : Integer;
i, nDir, nX, nY, nRage : Integer;
nFireTime : Integer;
nBatflyRate, nBatflyMaxRage : Integer;
Event : TEvent;
BaseObjectList : TList;
BaseObject : TBaseObject;
bo18, boCanHit : Boolean;
begin
Result := False;
bo18 := False;
boCanHit := m_PEnvir.CanWalk(nTargetX, nTargetY, False);
// if (GetTickCount - UserMagic.nTranPoint) < UserMagic.MagicInfo.dwCoolDownTime then begin
// SysMsg(format('无法连续使用该技能,请%d秒后再使用。', [(UserMagic.MagicInfo.dwCoolDownTime - (GetTickCount - UserMagic.nTranPoint)) div 1000]), c_Red, t_Hint);
// Exit;
// end;
// UserMagic.nTranPoint := GetTickCount; //保存技能的使用时间
if not boCanHit then begin
//先获取首要方向
nDir := GetNextDirection(nTargetX, nTargetY, m_nCurrX, m_nCurrY);
while True do begin
if m_PEnvir.GetNextPosition(nTargetX, nTargetY, nDir, 1, nX, nY) then begin
boCanHit := m_PEnvir.CanWalk(nX, nY, False);
end;
if boCanHit or (nDir >= 7) then Break;
//如果没有找到位置,就换个方向
if not bo18 then begin
nDir := 0;
bo18 := True;
end else
Inc(nDir);
end;
end else begin
nX := nTargetX;
nY := nTargetY;
end;
//技能参数
if g_Config.boUseXMLMagicSkill then begin
nBatflyRate := g_MagicSkill[UserMagic.GetMagIdx].btLv[UserMagic.btLevel].btVal[2];
nBatflyMaxRage := g_MagicSkill[UserMagic.GetMagIdx].btLv[UserMagic.btLevel].btVal[1];
end else begin
nBatflyRate := UserMagic.btLevel + 1;
nBatflyMaxRage := g_Config.nBatflyMaxRage;
end;
if (m_wStatusTimeArr[STATE_FREEZE {冰冻}] <> 0) then begin
SysMsg('被冰冻无法使用瞬移技能。', c_Red, t_Hint);
end else if m_PEnvir.m_MapFlag.boNoBatfly then begin
SysMsg('此地图禁止使用瞬移技能。', c_Red, t_Hint);
end else if m_boArrow then begin
SysMsg('你正在执行抢宝任务,禁止使用瞬移技能。', c_Red, t_Hint);
end else if (not boCanHit) or
(abs(nTargetX - m_nCurrX) > nBatflyMaxRage) or (abs(nTargetY - m_nCurrY) > nBatflyMaxRage) then begin
SysMsg('此点不能到达', c_Red, t_Hint);
end else if InWarSnareZone(m_PEnvir, m_nCurrX, m_nCurrY) and (not g_EventManager.InWarSnareZone(m_PEnvir, nTargetX, nTargetY)) then begin
SysMsg('你已被战争牢笼困住,无法逃脱!', c_Red, t_Hint);
end else begin
//检测下附近有没有人在使用战争旋风
if not g_Config.boAntiWarWhirlWind then begin
BaseObjectList := TList.Create;
try
GetMapBaseObjects(m_PEnvir, m_nCurrX, m_nCurrY, 3, BaseObjectList);
for i := 0 to BaseObjectList.Count - 1 do begin
BaseObject := TBaseObject(BaseObjectList.Items[i]);
if (BaseObject.m_btRaceServer <> RC_PLAYOBJECT) then Continue;
if (BaseObject.m_wStatusTimeArr[STATE_WARWHIRLWIND] > 0) and (BaseObject.IsProperTarget(Self)) then begin
SysMsg('因为中了战争旋风,此技能被限制', c_Red, t_Hint);
Exit;
end;
end;
finally
BaseObjectList.free;
end;
end;
if (Random(g_Config.nBatflyRate) < nBatflyRate) and
(m_PEnvir.DeleteFromMap(m_nCurrX, m_nCurrY, OS_MOVINGOBJECT, Self) > 0) then begin
m_btDirection := GetNextDirection(m_nCurrX, m_nCurrY, nX, nY);
nOldX := m_nCurrX;
nOldY := m_nCurrY;
m_nCurrX := nX;
m_nCurrY := nY;
m_PEnvir.AddToMap(m_nCurrX, m_nCurrY, OS_MOVINGOBJECT, Self);
RunStepToDamage(_Max(abs(nOldX - m_nCurrX), abs(nOldY - m_nCurrY)));
Result := True;
end;
if Result then begin
FlyData.CharDesc.Feature := GetFeatureToLong(Self);
FlyData.CharDesc.Status := m_nCharStatus;
FlyData.CharDesc.Featurex := GetMaxHPCent(Self);
FlyData.nX := nOldX;
FlyData.nY := nOldY;
FlyData.wKnow := $01FF;
FlyData.MagCode := UserMagic.GetMagIdx;
sName := GetShowName;
g_SmallPacketManage.Init;
g_SmallPacketManage.WriteBuffer(FlyData, SizeOf(TShunyiData));
g_SmallPacketManage.WriteBuffer(sName[1], Length(sName));
g_SmallPacketManage.FillWrite(27, 0);
s1C := g_SmallPacketManage.GetMsg;
n20 := 0;
if UserMagic.btLevel > 3 then n20 := $0A;
SendRefMsg(RM_170, MakeWord(m_btDirection, n20 or m_btGender), m_nCurrX, m_nCurrY, 0, s1C);
if (m_btRaceServer = RC_PLAYOBJECT) and m_boRideFightOn then begin
case UserMagic.GetMagIdx of
SKILL_WINDTEBO: begin
//火蝙蝠
if (m_MagicSkills[SKILL_BATFIRE] <> nil) and (m_MagicSkills[SKILL_BATFIRE].btKey = 1) and (m_MagicSkills[SKILL_FIRE] <> nil) then begin
n20 := m_PetInfo[2].wLevel + m_MagicSkills[SKILL_BATFIRE].btLevel + m_MagicSkills[SKILL_FIRE].btLevel + UserMagic.btLevel;
if (Random(g_Config.nMagBatFireRate) < n20) then begin
//获得火蝙蝠的威力
nPower := GetAttackPower(GetPower(MPow(m_MagicSkills[SKILL_BATFIRE]), m_MagicSkills[SKILL_BATFIRE]) + loword(m_WAbil.MC), SmallInt(hiword(m_WAbil.MC) - loword(m_WAbil.MC)) + 1, SKILL_BATFIRE);
nSecPwr := Trunc(nPower * n20 / 500);
Inc(nPower, nSecPwr);
//控制时间
nFireTime := GetPower(10, UserMagic) + (word(GetRPow(m_WAbil.MC)) shr 1);
if g_Config.boUseFireDelayTime and (g_Config.nFireDelayTime > 0) then nFireTime := _MIN(nFireTime, g_Config.nFireDelayTime);
//最长距离
nRage := _Max(abs(nOldX - m_nCurrX), abs(nOldY - m_nCurrY));
//从原始坐标到目标坐标
nDir := GetNextDirection(nOldX, nOldY, m_nCurrX, m_nCurrY);
nX := nOldX;
nY := nOldY;
for i := 1 to nRage do begin
Event := TEvent(m_PEnvir.GetEvent(nX, nY));
//清除火墙和流星火雨
if (Event <> nil) and (Event.m_nEventType in [ET_FIRERAIN, ET_GODFIRERAIN, ET_EVILFIRERAIN]) then begin
Event.m_boClosed := True;
Event.Close;
Event := nil;
end;
if Event = nil then begin
SendDelayMsg(Self, RM_DELAYFIREBURN, ET_BATFIRE, MakeLong(nX, nY), nFireTime * 1000, nPower, '', 100);
end;
if not ((abs(nX - m_nCurrX) <= 0) and (abs(nY - m_nCurrY) <= 0)) then begin
nDir := GetNextDirection(nX, nY, m_nCurrX, m_nCurrY);
if not m_PEnvir.GetNextPosition(nX, nY, nDir, 1, nX, nY) then
Break;
end else
Break;
end;
end;
end;
end;
SKILL_75: ;
SKILL_77: begin
if (m_MagicSkills[SKILL_BANWOL] <> nil) then nMagID := SKILL_BANWOL else nMagID := SKILL_43;
if (m_MagicSkills[SKILL_SHADOWKILL] <> nil) and (m_MagicSkills[SKILL_SHADOWKILL].btKey = 1) and (m_MagicSkills[nMagID] <> nil) then begin
//影袭杀
n20 := m_PetInfo[2].wLevel + m_MagicSkills[SKILL_SHADOWKILL].btLevel + m_MagicSkills[nMagID].btLevel + UserMagic.btLevel;
if (Random(g_Config.nMagShadowKillRate) < n20) then begin
SendAttackMsg(RM_WIDEHIT, $1800 or m_btDirection, m_nCurrX, m_nCurrY);
nPower := GetAttackPower(GetPower(MPow(UserMagic), UserMagic) + loword(m_WAbil.DC), SmallInt(hiword(m_WAbil.DC) - loword(m_WAbil.DC)) + 1, SKILL_SHADOWKILL);
nSecPwr := Trunc(nPower * n20 / 500);
Inc(nPower, nSecPwr);
MagicManager.MagBigExplosion(Self, nPower, m_nCurrX, m_nCurrY, 1);
end;
end;
end;
end;
end;
end else begin
case UserMagic.GetMagIdx of
SKILL_WINDTEBO: SysMsg('化身蝙蝠失败', c_Red, t_Hint);
SKILL_75: SysMsg('使用遁地失败', c_Red, t_Hint);
SKILL_77: SysMsg('移形换影失败', c_Red, t_Hint);
end;
Result := False;
end;
end;
end;
function TPlayObject.CheckEatItems(StdItem: pTStdItem): Boolean;
var
n, i : Integer;
begin
Result := False;
n := 0;
i := 0;
case StdItem.Need of
0: Result := True;
1: begin; //需要等级
if (StdItem.NeedLevel > 71) then begin
n := Ceil((StdItem.NeedLevel - 71) / 99);
i := (StdItem.NeedLevel - 71) - 99 * (n - 1);
if ((Ceil(m_btAmbitKind / 2) - 1) > n) or (((Ceil(m_btAmbitKind / 2) - 1) = n) and (m_btAmbitLevel >= i)) then begin
Result := True;
end;
end else begin
if m_Abil.level >= StdItem.NeedLevel then begin
Result := True;
end;
end;
end;
2: begin; //需要勋爵等级
if m_wCentsOfficerLevel > StdItem.NeedLevel then begin
Result := True;
end;
end;
end;
end;
procedure TPlayObject.ClientPerfectStoreMoveHome(nParam1: Integer; nMapIdx: Integer);
const
mapName : array[0..7] of string = ('0', '1', '4', '7', '2', '5', 'haidi', 'zqd');
HomeX : array[0..7] of Integer = (474, 229, 350, 54, 223, 462, 157, 156);
HomeY : array[0..7] of Integer = (222, 241, 165, 41, 448, 107, 182, 118);
mapName1 : array[0..6] of string = ('0', '0', '4', '7', '2', '5', '1');
HomeX1 : array[0..6] of Integer = (474, 0, 350, 54, 223, 462, 229);
HomeY1 : array[0..6] of Integer = (222, 0, 165, 41, 448, 107, 241);
var
i, j : Integer;
UserItem : pTUserItem;
StdItem : pTStdItem;
begin
if (m_wShopItemCount > 0) or m_boArrow then Exit; //禁止使用回城石的条件
if (GetTickCount - m_dwUseStoreTick) < 10000 then begin
SysMsg('每隔10秒才允许使用回城石一次。', c_Red, t_Hint);
Exit;
end;
if m_PEnvir.m_MapFlag.boNOSTOREMOVE then begin
SysMsg('当前地图禁止使用回城石。', c_Red, t_Hint);
Exit;
end;
if (nMapIdx < 0) or (nMapIdx > 7) then Exit;
for i := 0 to m_ItemList.Count - 1 do begin
UserItem := pTUserItem(m_ItemList[i]);
if UserItem.MakeIndex = nParam1 then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if (StdItem.StdMode = 3) and ((StdItem.Shape = 15) or (StdItem.Shape = 17)) then begin
if not (g_Config.boClassicServer) then begin
m_sScriptParam[0] := m_PEnvir.m_sMapName;
m_sScriptParam[1] := mapName1[nMapIdx];
SendRefMsg(RM_SPACEMOVE_FIRE, 0, 0, 0, 0, '');
SpaceMove(mapName1[nMapIdx], HomeX1[nMapIdx] + Random(8) - 4, HomeY1[nMapIdx] + Random(8) - 4, 0, nil);
end else begin
m_sScriptParam[0] := m_PEnvir.m_sMapName;
m_sScriptParam[1] := mapName[nMapIdx];
SendRefMsg(RM_SPACEMOVE_FIRE, 0, 0, 0, 0, '');
SpaceMove(mapName[nMapIdx], HomeX[nMapIdx] + Random(8) - 4, HomeY[nMapIdx] + Random(8) - 4, 0, nil);
end;
m_dwUseStoreTick := GetTickCount;
SendRefMsg(RM_510, 1, 0, 29, 0, '');
ExecuteScript(g_FunctionNPC, '@使用回城石');
if (StdItem.Shape = 17) then begin
if UserItem.Dura > 0 then Dec(UserItem.Dura);
if (UserItem.Dura <= 0) then begin
SendDelItems(UserItem);
DelBagItem(UserItem.MakeIndex, '');
end else begin
SendDefMessage(SM_EAT_FAIL, 0, 0, 0, 0, '');
SendUpdateItem(UserItem);
end;
end;
end;
Break;
end;
end;
end;
procedure TPlayObject.KillMonsterFunc();
begin
if (m_PEnvir.m_MapFlag.sMapFuncLabel <> '') then begin
ExecuteScript(g_ManageNPC, m_PEnvir.m_MapFlag.sMapFuncLabel);
end;
ExecuteScript(g_FunctionNPC, '@杀怪触发');
end;
procedure TPlayObject.KillPlayerFunc();
begin
if (m_LastHiter <> nil) and (m_LastHiter.m_btRaceServer = RC_PLAYOBJECT) then begin
TPlayObject(m_LastHiter).m_sScriptParam[0] := m_sCharName;
TPlayObject(m_LastHiter).m_sScriptParam[1] := m_PEnvir.m_sMapName;
TPlayObject(m_LastHiter).m_sScriptParam[2] := IntToStr(m_nCurrX);
TPlayObject(m_LastHiter).m_sScriptParam[3] := IntToStr(m_nCurrY);
TPlayObject(m_LastHiter).m_sScriptParam[4] := m_PEnvir.m_sMapDesc;
TPlayObject(m_LastHiter).m_sScriptParam[5] := IntToStr(m_btCountry);
(m_LastHiter as TPlayObject).ExecuteScript(g_FunctionNPC, '@谋杀他人');
//被人谋杀执行脚本
TPlayObject(Self).m_sScriptParam[0] := m_LastHiter.m_sCharName;
TPlayObject(Self).m_sScriptParam[1] := m_LastHiter.m_PEnvir.m_sMapName;
TPlayObject(Self).m_sScriptParam[2] := IntToStr(m_LastHiter.m_nCurrX);
TPlayObject(Self).m_sScriptParam[3] := IntToStr(m_LastHiter.m_nCurrY);
TPlayObject(Self).m_sScriptParam[4] := m_LastHiter.m_PEnvir.m_sMapDesc;
TPlayObject(Self).m_sScriptParam[5] := IntToStr(m_LastHiter.m_btCountry);
ExecuteScript(g_FunctionNPC, '@被人谋杀');
end;
end;
procedure TPlayObject.RecalcAddProvisionalAbil;
var
i : Integer;
begin
for i := Low(TProvisionalAbil) to High(TProvisionalAbil) do begin
case i of
0: m_AddAbil.wAC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wAC) + m_ProvisionalAbil[i]), hiword(m_AddAbil.wAC)); //AC1 //防御
1: m_AddAbil.wAC := MakeLong(loword(m_AddAbil.wAC), _MIN(High(MaxInt), hiword(m_AddAbil.wAC) + m_ProvisionalAbil[i])); //AC2 //防御
2: m_AddAbil.wMAC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wMAC) + m_ProvisionalAbil[i]), hiword(m_AddAbil.wMAC)); //MAC1 //魔法防御
3: m_AddAbil.wMAC := MakeLong(loword(m_AddAbil.wMAC), _MIN(High(MaxInt), hiword(m_AddAbil.wMAC) + m_ProvisionalAbil[i])); //MAC2 //魔法防御
4: m_AddAbil.wDC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wDC) + m_ProvisionalAbil[i]), hiword(m_AddAbil.wDC)); //DC1 //攻击
5: m_AddAbil.wDC := MakeLong(loword(m_AddAbil.wDC), _MIN(High(MaxInt), hiword(m_AddAbil.wDC) + m_ProvisionalAbil[i])); //DC2 //攻击
6: m_AddAbil.wMC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wMC) + m_ProvisionalAbil[i]), hiword(m_AddAbil.wMC)); //MC1 //魔法
7: m_AddAbil.wMC := MakeLong(loword(m_AddAbil.wMC), _MIN(High(MaxInt), hiword(m_AddAbil.wMC) + m_ProvisionalAbil[i])); //MC2 //魔法
8: m_AddAbil.wSC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wSC) + m_ProvisionalAbil[i]), hiword(m_AddAbil.wSC)); //SC1 //道术
9: m_AddAbil.wSC := MakeLong(loword(m_AddAbil.wSC), _MIN(High(MaxInt), hiword(m_AddAbil.wSC) + m_ProvisionalAbil[i])); //SC2 //道术
10: m_AddAbil.dwHP := _MIN(MAXHUMHP, m_AddAbil.dwHP + m_ProvisionalAbil[i]); //HP //生命值
11: m_AddAbil.dwMP := _MIN(MAXHUMMP, m_AddAbil.dwMP + m_ProvisionalAbil[i]); //MP //魔法值
12: m_AddAbil.btLuck := _MIN(High(byte), m_AddAbil.btLuck + m_ProvisionalAbil[i]); //Luck //幸运
13: m_AddAbil.btUnLuck := _MIN(High(byte), m_AddAbil.btUnLuck + m_ProvisionalAbil[i]); //UnLuck //诅咒
14: m_AddAbil.wSpeedPoint := _MIN(High(MaxInt), m_AddAbil.wSpeedPoint + m_ProvisionalAbil[i]); //SPEED //躲避
15: m_AddAbil.wAntiMagic := _MIN(High(MaxInt), m_AddAbil.wAntiMagic + m_ProvisionalAbil[i]); //AntiMagic //魔法躲避
16: m_AddAbil.wAntiPoison := _MIN(High(MaxInt), m_AddAbil.wAntiPoison + m_ProvisionalAbil[i]); //AntiPoison //中毒躲避
17: m_AddAbil.wHitPoint := _MIN(High(MaxInt), m_AddAbil.wHitPoint + m_ProvisionalAbil[i]); //HIT //命中
18: m_AddAbil.btMagicNicety := _MIN(High(MaxInt), m_AddAbil.btMagicNicety + m_ProvisionalAbil[i]); //MagicNicety //魔法命中
19: m_AddAbil.btPoisonNicety := _MIN(High(MaxInt), m_AddAbil.btPoisonNicety + m_ProvisionalAbil[i]); //PoisonNicety //中毒命中
20: Inc(m_nHongMoSuite, m_ProvisionalAbil[i]);
21: m_AddAbil.btShiftDamage := _MIN(High(byte), m_AddAbil.btShiftDamage + m_ProvisionalAbil[i]); //ShiftDamage, /伤害转移
22: m_AddAbil.btReflexDamage := _MIN(High(byte), m_AddAbil.btReflexDamage + m_ProvisionalAbil[i]); //ReflexDamage, /伤害反射
23: m_AddAbil.wPetFelementPoint[0] := _MIN(High(Word), m_AddAbil.wPetFelementPoint[0] + m_ProvisionalAbil[i]); //Gold 金属性
24: m_AddAbil.wPetFelementPoint[1] := _MIN(High(Word), m_AddAbil.wPetFelementPoint[1] + m_ProvisionalAbil[i]); //Wood 木属性
25: m_AddAbil.wPetFelementPoint[2] := _MIN(High(Word), m_AddAbil.wPetFelementPoint[2] + m_ProvisionalAbil[i]); //Soil 水属性
26: m_AddAbil.wPetFelementPoint[3] := _MIN(High(Word), m_AddAbil.wPetFelementPoint[3] + m_ProvisionalAbil[i]); //Water 火属性
27: m_AddAbil.wPetFelementPoint[4] := _MIN(High(Word), m_AddAbil.wPetFelementPoint[4] + m_ProvisionalAbil[i]); //Fire 土属性
28: m_AddAbil.btThump := _MIN(High(Word), m_AddAbil.btThump + m_ProvisionalAbil[i]); //Thump 爆击机率
29: m_AddAbil.btReduceAC := _MIN(High(Byte), m_AddAbil.btReduceAC + m_ProvisionalAbil[i]); //ReduceAC, /减免对方物理防御
30: m_AddAbil.btReduceMAC := _MIN(High(Byte), m_AddAbil.btReduceMAC + m_ProvisionalAbil[i]); //ReduceMAC, /减免对方魔法防御
31: m_AddAbil.btReduceSpeedPoint := _MIN(High(Byte), m_AddAbil.btReduceSpeedPoint + m_ProvisionalAbil[i]); //ReduceSpeedPoint, /减免对方物理躲避
32: m_AddAbil.btReduceAntiMagic := _MIN(High(Byte), m_AddAbil.btReduceAntiMagic + m_ProvisionalAbil[i]); //ReduceAntiMagic, /减免对方魔法躲避
33: m_AddAbil.wAgainst := _MIN(High(Word), m_AddAbil.wAgainst + m_ProvisionalAbil[i]); //Against 抗性
34: m_AddAbil.btThump2 := _MIN(High(byte), m_AddAbil.btThump2 + m_ProvisionalAbil[i]); //双倍暴击
35: m_AddAbil.dwGC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.dwGC) + m_ProvisionalAbil[i]), hiword(m_AddAbil.dwGC)); //GC1 //妖力
36: m_AddAbil.dwGC := MakeLong(loword(m_AddAbil.dwGC), _MIN(High(MaxInt), hiword(m_AddAbil.dwGC) + m_ProvisionalAbil[i])); //GC2 //妖力
37: m_AddAbil.wSacredDamMin := _MIN(High(Word), m_AddAbil.wSacredDamMin + m_ProvisionalAbil[i]); //神圣伤害下限
38: m_AddAbil.wSacredDamMax := _MIN(High(Word), m_AddAbil.wSacredDamMax + m_ProvisionalAbil[i]); //神圣伤害上限
39: m_AddAbil.dwSacredThump := _MIN(High(MaxInt), m_AddAbil.dwSacredThump + m_ProvisionalAbil[i]);
40: m_AddAbil.dwSacredExempt := _MIN(High(MaxInt), m_AddAbil.dwSacredExempt + m_ProvisionalAbil[i]);
41: m_AddAbil.dwSacredPenetRation := _MIN(High(MaxInt), m_AddAbil.dwSacredPenetRation + m_ProvisionalAbil[i]);
end;
end;
end;
procedure TPlayObject.RecalcAddPetAbil;
var
UserItem : pTUserItem;
StdItem : pTStdItem;
begin
//骑战附加属性
if m_boRideOn then begin
if m_boPneuma and (m_PneumaObject <> nil) then begin
TPlayObject(m_PneumaObject).GetUserItemByMakeIndex(TPlayObject(m_PneumaObject).m_PetInfo[3].nMakeIndex, UserItem);
end else begin
GetUserItemByMakeIndex(m_PetInfo[2].nMakeIndex, UserItem);
end;
if (UserItem <> nil) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if (StdItem <> nil) and (StdItem.StdMode = 49) and (StdItem.Shape = 51) then begin
GetAccessory(UserItem^, m_AddAbil);
end;
end;
end;
//魂佑灵兽属性
if m_boBeast then begin
GetUserItemByMakeIndex(m_PetInfo[5].nMakeIndex, UserItem);
if (UserItem <> nil) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if (StdItem <> nil) and (StdItem.StdMode = 49) and (StdItem.Shape = 51) then begin
GetAccessory(UserItem^, m_AddAbil);
end;
end;
end;
end;
procedure TPlayObject.RecalcAddSuiteAbil(Idx: Integer; boPercent: Boolean);
var
SuiteAbility : pTSuiteAbility;
begin
SuiteAbility := UserEngine.GetSuiteAbility(Idx);
if (SuiteAbility <> nil) then begin
if boPercent then begin
m_AddAbil.dwHP := _MIN(MAXHUMHP, m_AddAbil.dwHP + Round(m_Abil.dwMaxHP * SuiteAbility.HP / 100));
m_AddAbil.dwMP := _MIN(MAXHUMMP, m_AddAbil.dwMP + Round(m_Abil.dwMaxMP * SuiteAbility.MP / 100));
m_AddAbil.wElementForceMax := _MIN(High(MaxInt), m_AddAbil.wElementForceMax + Round(m_Abil.wElementForceMax * SuiteAbility.EF / 100));
m_AddAbil.wAC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wAC) + Round(loword(m_Abil.AC) * (100 + SuiteAbility.AC) / 100)), hiword(m_AddAbil.wAC));
m_AddAbil.wAC := MakeLong(loword(m_AddAbil.wAC), _MIN(High(MaxInt), hiword(m_AddAbil.wAC) + Round(hiword(m_Abil.AC) * (100 + SuiteAbility.AC2) / 100)));
m_AddAbil.wMAC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wMAC) + Round(loword(m_Abil.MAC) * (100 + SuiteAbility.MAC) / 100)), hiword(m_AddAbil.wMAC));
m_AddAbil.wMAC := MakeLong(loword(m_AddAbil.wMAC), _MIN(High(MaxInt), hiword(m_AddAbil.wMAC) + Round(hiword(m_Abil.MAC) * (100 + SuiteAbility.MAC2) / 100)));
m_AddAbil.wDC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wDC) + Round(loword(m_Abil.DC) * (100 + SuiteAbility.DC) / 100)), hiword(m_AddAbil.wDC));
m_AddAbil.wDC := MakeLong(loword(m_AddAbil.wDC), _MIN(High(MaxInt), hiword(m_AddAbil.wDC) + Round(hiword(m_Abil.DC) * (100 + SuiteAbility.DC2) / 100)));
m_AddAbil.wMC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wMC) + Round(loword(m_Abil.MC) * (100 + SuiteAbility.MC) / 100)), hiword(m_AddAbil.wMC));
m_AddAbil.wMC := MakeLong(loword(m_AddAbil.wMC), _MIN(High(MaxInt), hiword(m_AddAbil.wMC) + Round(hiword(m_Abil.MC) * (100 + SuiteAbility.MC2) / 100)));
m_AddAbil.wSC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wSC) + Round(loword(m_Abil.SC) * (100 + SuiteAbility.SC) / 100)), hiword(m_AddAbil.wSC));
m_AddAbil.wSC := MakeLong(loword(m_AddAbil.wSC), _MIN(High(MaxInt), hiword(m_AddAbil.wSC) + Round(hiword(m_Abil.SC) * (100 + SuiteAbility.SC2) / 100)));
m_AddAbil.dwGC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.dwGC) + Round(loword(m_Abil.GC) * (100 + SuiteAbility.GC) / 100)), hiword(m_AddAbil.dwGC));
m_AddAbil.dwGC := MakeLong(loword(m_AddAbil.dwGC), _MIN(High(MaxInt), hiword(m_AddAbil.dwGC) + Round(hiword(m_Abil.GC) * (100 + SuiteAbility.GC2) / 100)));
m_AddAbil.wHitPoint := Round(m_AddAbil.wHitPoint * (100 + SuiteAbility.HitPoint) / 100);
m_AddAbil.wSpeedPoint := Round(m_AddAbil.wSpeedPoint * (100 + SuiteAbility.SpeedPoint) / 100);
m_AddAbil.btMagicNicety := Round(m_AddAbil.btMagicNicety * (100 + SuiteAbility.MagicNicety) / 100);
m_AddAbil.wAntiMagic := Round(m_AddAbil.wAntiMagic * (100 + SuiteAbility.AntiMagic) / 100);
m_AddAbil.btPoisonNicety := Round(m_AddAbil.btPoisonNicety * (100 + SuiteAbility.PoisonNicety) / 100);
m_AddAbil.wAntiPoison := Round(m_AddAbil.wAntiPoison * (100 + SuiteAbility.AntiPoison) / 100);
m_AddAbil.wHealthRecover := Round(m_AddAbil.wHealthRecover * (100 + SuiteAbility.HealthRecover) / 100);
m_AddAbil.wSpellRecover := Round(m_AddAbil.wSpellRecover * (100 + SuiteAbility.SpellRecover) / 100);
m_AddAbil.btVampirePoint := Round(m_AddAbil.btVampirePoint * (100 + SuiteAbility.VampirePoint) / 100);
m_AddAbil.btVampireRate := _MIN(100, Round(m_AddAbil.btVampireRate * (100 + SuiteAbility.VampireRate) / 100));
m_AddAbil.btLuck := Round(m_AddAbil.btLuck * (100 + SuiteAbility.Luck) / 100);
m_AddAbil.btShiftDamage := m_AddAbil.btShiftDamage + Round(m_Abil.btShiftDamage * (100 + SuiteAbility.ShiftDamage) / 100);
m_AddAbil.btReflexDamage := m_AddAbil.btReflexDamage + Round(m_Abil.btReflexDamage * (100 + SuiteAbility.ReflexDamage) / 100);
m_AddAbil.wPetFelementPoint[0] := m_AddAbil.wPetFelementPoint[0] + Round(m_Abil.wPetFelementAbil[0] * (100 + SuiteAbility.Gold) / 100);
m_AddAbil.wPetFelementPoint[1] := m_AddAbil.wPetFelementPoint[1] + Round(m_Abil.wPetFelementAbil[1] * (100 + SuiteAbility.Wood) / 100);
m_AddAbil.wPetFelementPoint[2] := m_AddAbil.wPetFelementPoint[2] + Round(m_Abil.wPetFelementAbil[2] * (100 + SuiteAbility.Soil) / 100);
m_AddAbil.wPetFelementPoint[3] := m_AddAbil.wPetFelementPoint[3] + Round(m_Abil.wPetFelementAbil[3] * (100 + SuiteAbility.Water) / 100);
m_AddAbil.wPetFelementPoint[4] := m_AddAbil.wPetFelementPoint[4] + Round(m_Abil.wPetFelementAbil[4] * (100 + SuiteAbility.Fire) / 100);
m_AddAbil.btThump := m_AddAbil.btThump + Round(m_Abil.btThump * (100 + SuiteAbility.Thump) / 100);
m_AddAbil.btReduceAC := m_AddAbil.btReduceAC + Round(m_Abil.btReduceAC * (100 + SuiteAbility.ReduceAC) / 100);
m_AddAbil.btReduceMAC := m_AddAbil.btReduceMAC + Round(m_Abil.btReduceMAC * (100 + SuiteAbility.ReduceMAC) / 100);
m_AddAbil.btReduceSpeedPoint := m_AddAbil.btReduceSpeedPoint + Round(m_Abil.btReduceSpeedPoint * (100 + SuiteAbility.ReduceSpeedPoint) / 100);
m_AddAbil.btReduceAntiMagic := m_AddAbil.btReduceAntiMagic + Round(m_Abil.btReduceAntiMagic * (100 + SuiteAbility.ReduceAntiMagic) / 100);
m_AddAbil.wAgainst := m_AddAbil.wAgainst + Round(m_Abil.wAgainst * (100 + SuiteAbility.Against) / 100);
m_AddAbil.wZazen2ExpRate := m_AddAbil.wZazen2ExpRate + Round(m_Abil.wZazen2ExpRate * (100 + SuiteAbility.Zazen2ExpRate) / 100);
m_AddAbil.btBreakShield := m_AddAbil.btBreakShield + Round(m_Abil.btBreakShield * (100 + SuiteAbility.BreakShield) / 100);
m_AddAbil.btShieldPower := m_AddAbil.btShieldPower + Round(m_Abil.btShieldPower * (100 + SuiteAbility.ShieldPower) / 100);
m_AddAbil.btBloodAttack := m_AddAbil.btBloodAttack + Round(m_Abil.btBloodAttack * (100 + SuiteAbility.BloodAttack) / 100);
m_AddAbil.btBloodDefense := m_AddAbil.btBloodDefense + Round(m_Abil.btBloodDefense * (100 + SuiteAbility.BloodDefense) / 100);
m_AddAbil.btSacredArmor := m_AddAbil.btSacredArmor + Round(m_Abil.btSacredArmor * (100 + SuiteAbility.SacredArmor) / 100);
m_AddAbil.btDevilGuard := m_AddAbil.btDevilGuard + Round(m_Abil.btDevilGuard * (100 + SuiteAbility.DevilGuard) / 100);
m_AddAbil.btNatureGuard := m_AddAbil.btNatureGuard + Round(m_Abil.btNatureGuard * (100 + SuiteAbility.NatureGuard) / 100);
m_AddAbil.btFightWill := m_AddAbil.btFightWill + Round(m_Abil.btFightWill * (100 + SuiteAbility.FightWill) / 100);
m_AddAbil.wSacredDamMin := m_AddAbil.wSacredDamMin + Round(m_Abil.wSacredDamMin * (100 + SuiteAbility.SacredDamMin) / 100);
m_AddAbil.wSacredDamMax := m_AddAbil.wSacredDamMax + Round(m_Abil.wSacredDamMax * (100 + SuiteAbility.SacredDamMax) / 100);
m_AddAbil.btPowerRate := m_AddAbil.btPowerRate + Round(100 * (100 + SuiteAbility.PowerRate) / 100); //读取攻击倍数
m_AddAbil.btDefenceRate := m_AddAbil.btDefenceRate + Round(100 * (100 + SuiteAbility.DefenceRate) / 100); //读取防御倍数
end else begin
m_AddAbil.dwHP := _MIN(MAXHUMHP, m_AddAbil.dwHP + SuiteAbility.HP);
m_AddAbil.dwMP := _MIN(MAXHUMMP, m_AddAbil.dwMP + SuiteAbility.MP);
m_AddAbil.wElementForceMax := _MIN(High(MaxInt), m_AddAbil.wElementForceMax + SuiteAbility.EF);
m_AddAbil.wDC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wDC) + SuiteAbility.DC), _MIN(High(MaxInt), hiword(m_AddAbil.wDC) + SuiteAbility.DC2));
m_AddAbil.wMC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wMC) + SuiteAbility.MC), _MIN(High(MaxInt), hiword(m_AddAbil.wMC) + SuiteAbility.MC2));
m_AddAbil.wSC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wSC) + SuiteAbility.SC), _MIN(High(MaxInt), hiword(m_AddAbil.wSC) + SuiteAbility.SC2));
m_AddAbil.dwGC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.dwGC) + SuiteAbility.GC), _MIN(High(MaxInt), hiword(m_AddAbil.dwGC) + SuiteAbility.GC2));
m_AddAbil.wAC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wAC) + SuiteAbility.AC), _MIN(High(MaxInt), hiword(m_AddAbil.wAC) + SuiteAbility.AC2));
m_AddAbil.wMAC := MakeLong(_MIN(High(MaxInt), loword(m_AddAbil.wMAC) + SuiteAbility.MAC), _MIN(High(MaxInt), hiword(m_AddAbil.wMAC) + SuiteAbility.MAC2));
m_AddAbil.wHitPoint := _MIN(High(MaxInt), m_AddAbil.wHitPoint + SuiteAbility.HitPoint);
m_AddAbil.wSpeedPoint := _MIN(High(MaxInt), m_AddAbil.wSpeedPoint + SuiteAbility.SpeedPoint);
m_AddAbil.btMagicNicety := _MIN(High(MaxInt), m_AddAbil.btMagicNicety + SuiteAbility.MagicNicety);
m_AddAbil.wAntiMagic := _MIN(High(MaxInt), m_AddAbil.wAntiMagic + SuiteAbility.AntiMagic);
m_AddAbil.btPoisonNicety := _MIN(High(MaxInt), m_AddAbil.btPoisonNicety + SuiteAbility.PoisonNicety);
m_AddAbil.wAntiPoison := _MIN(High(MaxInt), m_AddAbil.wAntiPoison + SuiteAbility.AntiPoison);
m_AddAbil.wHealthRecover := _MIN(High(word), m_AddAbil.wHealthRecover + SuiteAbility.HealthRecover);
m_AddAbil.wSpellRecover := _MIN(High(word), m_AddAbil.wSpellRecover + SuiteAbility.SpellRecover);
m_AddAbil.btVampirePoint := _MIN(High(byte), m_AddAbil.btVampirePoint + SuiteAbility.VampirePoint);
m_AddAbil.btVampireRate := _MIN(High(byte), m_AddAbil.btVampireRate + SuiteAbility.VampireRate);
m_AddAbil.btLuck := _MIN(High(byte), m_AddAbil.btLuck + SuiteAbility.Luck);
m_AddAbil.btShiftDamage := _MIN(High(byte), m_AddAbil.btShiftDamage + SuiteAbility.ShiftDamage);
m_AddAbil.btReflexDamage := _MIN(High(byte), m_AddAbil.btReflexDamage + SuiteAbility.ReflexDamage);
m_AddAbil.wPetFelementPoint[0] := _MIN(High(word), m_AddAbil.wPetFelementPoint[0] + SuiteAbility.Gold);
m_AddAbil.wPetFelementPoint[1] := _MIN(High(word), m_AddAbil.wPetFelementPoint[1] + SuiteAbility.Wood);
m_AddAbil.wPetFelementPoint[2] := _MIN(High(word), m_AddAbil.wPetFelementPoint[2] + SuiteAbility.Soil);
m_AddAbil.wPetFelementPoint[3] := _MIN(High(word), m_AddAbil.wPetFelementPoint[3] + SuiteAbility.Water);
m_AddAbil.wPetFelementPoint[4] := _MIN(High(word), m_AddAbil.wPetFelementPoint[4] + SuiteAbility.Fire);
m_AddAbil.btThump := _MIN(High(word), m_AddAbil.btThump + SuiteAbility.Thump);
m_AddAbil.btReduceAC := _MIN(High(Byte), m_AddAbil.btReduceAC + SuiteAbility.ReduceAC);
m_AddAbil.btReduceMAC := _MIN(High(Byte), m_AddAbil.btReduceMAC + SuiteAbility.ReduceMAC);
m_AddAbil.btReduceSpeedPoint := _MIN(High(Byte), m_AddAbil.btReduceSpeedPoint + SuiteAbility.ReduceSpeedPoint);
m_AddAbil.btReduceAntiMagic := _MIN(High(Byte), m_AddAbil.btReduceAntiMagic + SuiteAbility.ReduceAntiMagic);
m_AddAbil.wAgainst := _MIN(High(word), m_AddAbil.wAgainst + SuiteAbility.Against);
m_AddAbil.wZazen2ExpRate := _MIN(High(word), m_AddAbil.wZazen2ExpRate + SuiteAbility.Zazen2ExpRate);
m_AddAbil.btBreakShield := _MIN(High(byte), m_AddAbil.btBreakShield + SuiteAbility.BreakShield);
m_AddAbil.btShieldPower := _MIN(High(byte), m_AddAbil.btShieldPower + SuiteAbility.ShieldPower);
m_AddAbil.btBloodAttack := _MIN(High(byte), m_AddAbil.btBloodAttack + SuiteAbility.BloodAttack);
m_AddAbil.btBloodDefense := _MIN(High(byte), m_AddAbil.btBloodDefense + SuiteAbility.BloodDefense);
m_AddAbil.btSacredArmor := _MIN(High(byte), m_AddAbil.btSacredArmor + SuiteAbility.SacredArmor);
m_AddAbil.btDevilGuard := _MIN(High(byte), m_AddAbil.btDevilGuard + SuiteAbility.DevilGuard);
m_AddAbil.btNatureGuard := _MIN(High(byte), m_AddAbil.btNatureGuard + SuiteAbility.NatureGuard);
m_AddAbil.btFightWill := _MIN(High(byte), m_AddAbil.btFightWill + SuiteAbility.FightWill);
m_AddAbil.wSacredDamMin := _MIN(High(Integer), m_AddAbil.wSacredDamMin + SuiteAbility.SacredDamMin);
m_AddAbil.wSacredDamMax := _MIN(High(Integer), m_AddAbil.wSacredDamMax + SuiteAbility.SacredDamMax);
m_AddAbil.btPowerRate := _MIN(High(byte), m_AddAbil.btPowerRate + SuiteAbility.PowerRate);
m_AddAbil.btDefenceRate := _MIN(High(byte), m_AddAbil.btDefenceRate + SuiteAbility.DefenceRate);
end;
if CheckSPCode(SuiteAbility.Special, 0) then m_boParalysis := True;
if CheckSPCode(SuiteAbility.Special, 1) then m_boMagicShield := True;
if CheckSPCode(SuiteAbility.Special, 2) then m_boRevival := True;
if CheckSPCode(SuiteAbility.Special, 3) then m_boMuscleRing := True;
if CheckSPCode(SuiteAbility.Special, 4) then m_boFastTrain := True;
if CheckSPCode(SuiteAbility.Special, 5) then m_boProbeNecklace := True;
if CheckSPCode(SuiteAbility.Special, 6) then m_boHideMode := True;
if CheckSPCode(SuiteAbility.Special, 7) then m_boUnParalysis := True;
if CheckSPCode(SuiteAbility.Special, 8) then m_boUnMagicShield := True;
if CheckSPCode(SuiteAbility.Special, 9) then m_boUnRevival := True;
if CheckSPCode(SuiteAbility.Special, 10) then m_boParalysisEx := True;
if CheckSPCode(SuiteAbility.Special, 11) then m_boMagicShieldEx := True;
if CheckSPCode(SuiteAbility.Special, 12) then m_boRevivalEx := True;
if CheckSPCode(SuiteAbility.Special, 13) then m_boNoDropUseItem := True;
if CheckSPCode(SuiteAbility.Special, 14) then m_boNoDropItem := True;
if CheckSPCode(SuiteAbility.Special, 15) then m_boMcParalysis := True;
end;
end;
procedure TPlayObject.SendBroadVehicle(btCreatorType: Byte; VehicleExp: TVehicleExp);
var
i, II, nUseTeam : Integer;
boCreator : Boolean;
btState : Byte;
sMemBer : string;
GuildVehicle : pTGuildVehicle;
begin
g_SmallPacketManage.Init;
if btCreatorType = 0 then begin
g_SmallPacketManage.FillWrite(29, 0);
end else begin
g_SmallPacketManage.WriteByte(3);
if g_GuildDartList.Count > 0 then begin
for I := 0 to g_GuildDartList.Count - 1 do begin
boCreator := False;
btState := 0;
GuildVehicle := g_GuildDartList.Items[i];
for II := 0 to 2 do begin
if CompareText(m_sCharName, GuildVehicle.sMember[II].UserName) = 0 then begin
boCreator := True;
nUseTeam := GuildVehicle.nTeam;
btState := GuildVehicle.btState;
end;
end;
end;
if (boCreator) and (btState = 1) then begin
g_SmallPacketManage.WriteByte(0);
g_SmallPacketManage.WriteString('running', SizeOf('running'));
g_SmallPacketManage.WriteByte(0);
end else g_SmallPacketManage.WriteWord(0);
g_SmallPacketManage.WriteInteger(g_GuildDartList.Count);
for I := 0 to g_GuildDartList.Count - 1 do begin
GuildVehicle := g_GuildDartList.Items[i];
g_SmallPacketManage.WriteInteger(GuildVehicle.nTeam);
end;
g_SmallPacketManage.WriteInteger(g_GuildDartList.Count);
for I := 0 to g_GuildDartList.Count - 1 do begin
GuildVehicle := g_GuildDartList.Items[i];
sMemBer := Format('%s#%d#%s', [GuildVehicle.sMember[0].UserName, GuildVehicle.sMember[0].btType, GuildVehicle.sGuildName]);
g_SmallPacketManage.WriteString(sMemBer, SizeOf(sMemBer));
g_SmallPacketManage.WriteByte(0);
end;
g_SmallPacketManage.WriteInteger(g_GuildDartList.Count);
for I := 0 to g_GuildDartList.Count - 1 do begin
GuildVehicle := g_GuildDartList.Items[i];
g_SmallPacketManage.WriteInteger(GuildVehicle.nMemberCount);
end;
g_SmallPacketManage.WriteInteger(g_GuildDartList.Count);
for I := 0 to g_GuildDartList.Count - 1 do begin
GuildVehicle := g_GuildDartList.Items[i];
g_SmallPacketManage.WriteInteger(GuildVehicle.nMaxMember);
end;
g_SmallPacketManage.WriteInteger(g_GuildDartList.Count);
for I := 0 to g_GuildDartList.Count - 1 do begin
GuildVehicle := g_GuildDartList.Items[i];
g_SmallPacketManage.WriteInteger(GuildVehicle.btFullStart);
end;
if boCreator then g_SmallPacketManage.WriteInteger(nUseTeam)
else g_SmallPacketManage.WriteInteger(0);
g_SmallPacketManage.WriteWord(0);
end else g_SmallPacketManage.FillWrite(28, 0);
end;
g_SmallPacketManage.WriteInteger(3);
g_SmallPacketManage.WriteInteger(VehicleExp.nExp[0] * 10000);
g_SmallPacketManage.WriteInteger(VehicleExp.nExp[1] * 10000);
g_SmallPacketManage.WriteInteger(VehicleExp.nExp[2] * 10000);
g_SmallPacketManage.WriteInteger(3);
g_SmallPacketManage.WriteInteger(VehicleExp.nExp[3] * 10000);
g_SmallPacketManage.WriteInteger(VehicleExp.nExp[4] * 10000);
g_SmallPacketManage.WriteInteger(VehicleExp.nExp[5] * 10000);
if btCreatorType = 0 then begin
g_SmallPacketManage.FillWrite(12, 0);
end else begin
if boCreator then begin
GuildVehicle := g_GuildDartList.Items[nUseTeam - 1];
g_SmallPacketManage.WriteInteger(GuildVehicle.nMemBerCount);
for II := 0 to 2 do begin
if (GuildVehicle.nMemBerCount > II) and (GuildVehicle.sMember[II].UserName <> '') then begin
g_SmallPacketManage.WriteString(GuildVehicle.sMember[II].UserName, SizeOf(GuildVehicle.sMember[II].UserName));
g_SmallPacketManage.WriteByte(0);
end;
end;
g_SmallPacketManage.WriteInteger(GuildVehicle.nMemBerCount);
for II := 0 to 2 do begin
if (GuildVehicle.nMemBerCount > II) and (GuildVehicle.sMember[II].UserName <> '') then
g_SmallPacketManage.WriteInteger(GuildVehicle.sMember[II].btJob);
end;
g_SmallPacketManage.WriteInteger(GuildVehicle.nMemBerCount);
for II := 0 to 2 do begin
if (GuildVehicle.nMemBerCount > II) and (GuildVehicle.sMember[II].UserName <> '') then
g_SmallPacketManage.WriteInteger(GuildVehicle.sMember[II].nLevel);
end;
end else g_SmallPacketManage.FillWrite(12, 0);
end;
SendDefMessage(2417, Integer(Self), 0, 0, 0, g_SmallPacketManage.GetMsg(), True);
end;
//修复铁血神技顺序图标错乱的问题
procedure TPlayObject.SendWishAwardInfo();
var
i, ii, nRandSeed, nAward, n14 : Integer;
SetRadom : TRandomEngine;
sAwardName : string;
nAwardCount, nCount : Integer;
begin
ExecuteScript(g_FunctionNPC, '@_许愿_开始许愿');
try
nRandSeed := StrToIntDef(g_FunctionNPC.GetPlayObjectInfo(TPlayObject(Self),
UserEngine.WishAward.nRandSeed), 0);
nAward := Random(30);
SetRadom := TRandomEngine.Create;
SetRadom.MinNumber := 1;
SetRadom.MaxNumber := UserEngine.WishAward.nCount;
SetRadom.Unique := True;
SetRadom.nRandSeed := nRandSeed;
g_LargePacketManage.Init;
g_LargePacketManage.WriteWord($2D);
g_LargePacketManage.WriteWord($2D);
g_LargePacketManage.WriteByte(nAward);
g_LargePacketManage.WriteInteger($1E);
for I := 1 to 30 do begin
ii := SetRadom.GetRandom;
nCount := StrToIntDef(g_FunctionNPC.GetPlayObjectInfo(TPlayObject(Self),
UserEngine.WishAward.AwardItem[ii].Count), 0);
n14 := Length(UserEngine.WishAward.AwardItem[ii].ItemName) +
Length(UserEngine.WishAward.AwardItem[ii].Name) + 10;
g_LargePacketManage.WriteInteger(n14);
g_LargePacketManage.WriteString(UserEngine.WishAward.AwardItem[ii].ItemName,
SizeOf(UserEngine.WishAward.AwardItem[ii].ItemName));
g_LargePacketManage.WriteByte(0);
g_LargePacketManage.WriteString(UserEngine.WishAward.AwardItem[ii].Name,
SizeOf(UserEngine.WishAward.AwardItem[ii].Name));
g_LargePacketManage.WriteByte(0);
g_LargePacketManage.WriteWord(nCount);
g_LargePacketManage.WriteWord(UserEngine.WishAward.AwardItem[ii].nLook);
if (I - 1) = nAward then begin
g_LargePacketManage.WriteInteger($01000000);
sAwardName := UserEngine.WishAward.AwardItem[ii].ItemName;
nAwardCount := nCount;
end else
g_LargePacketManage.WriteInteger(0);
end;
finally
SetRadom.Free;
end;
SendDefMessage(2176, integer(Self), 0, 0, 0, g_LargePacketManage.GetMsg, True);
m_sScriptParam[0] := sAwardName;
m_sScriptParam[1] := IntToStr(nAwardCount);
ExecuteScript(g_FunctionNPC, '@_许愿_领取奖励');
end;
end.
|