?? objhero.pas
字號:
if StdItem.AniCount = 0 then begin
if (m_ItemList.Count + 6 - 1) <= m_nItemBagCount then begin
m_ItemList.Delete(I);
DisPoseAndNil(UserItem);
GetUnBindItems(GetUnbindItemName(StdItem.Shape), 6);
boEatOK := True;
end;
end;
end;
end;
Break;
end;
end;
end;
end;
end else begin
m_Master.SendMsg(g_ManageNPC, RM_MENU_OK, 0, Integer(m_Master), 0, 0, g_sCanotUseItemMsg);
end;
if boEatOK then begin
WeightChanged();
SendDefMessage(SM_HEROEAT_OK, 0, 0, 0, 0, '');
if StdItem.NeedIdentify = 1 then
AddGameDataLog('11' + #9 +
m_sMapName + #9 +
IntToStr(m_nCurrX) + #9 +
IntToStr(m_nCurrY) + #9 +
m_sCharName + #9 +
//UserEngine.GetStdItemName(UserItem34.wIndex) + #9 +
StdItem.Name + #9 +
IntToStr(UserItem34.MakeIndex) + #9 +
'1' + #9 +
'0');
end else begin
SendDefMessage(SM_HEROEAT_FAIL, 0, 0, 0, 0, '');
end;
if (UserItem <> nil) and boSendUpDate then begin
SendUpdateItem(UserItem);
end;
end;
procedure THeroObject.WeightChanged;
begin
if m_Master = nil then Exit;
m_WAbil.Weight := RecalcBagWeight();
if m_btRaceServer = RC_HEROOBJECT then begin
SendUpdateMsg(m_Master, RM_HEROWEIGHTCHANGED, 0, 0, 0, 0, '');
end;
end;
procedure THeroObject.RefMyStatus();
begin
RecalcAbilitys();
m_Master.SendMsg(m_Master, RM_MYSTATUS, 0, 1, 0, 0, '');
end;
function THeroObject.EatItems(StdItem: pTStdItem): Boolean;
var
bo06: Boolean;
nOldStatus: Integer;
begin
Result := False;
if m_PEnvir.m_boNODRUG then begin
SysMsg(sCanotUseDrugOnThisMap, c_Red, t_Hint);
Exit;
end;
case StdItem.StdMode of
0: begin
case StdItem.Shape of
1: begin
IncHealthSpell(StdItem.AC, StdItem.MAC);
Result := True;
end;
2: begin
m_boUserUnLockDurg := True;
Result := True;
end;
else begin
if (StdItem.AC > 0) then begin
Inc(m_nIncHealth, StdItem.AC);
end;
if (StdItem.MAC > 0) then begin
Inc(m_nIncSpell, StdItem.MAC);
end;
Result := True;
end;
end;
end;
1: Result := False;
{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;}
3: begin
if StdItem.Shape = 12 then begin
bo06 := False;
if LoWord(StdItem.DC) > 0 then begin
m_wStatusArrValue[0 {0x218}] := LoWord(StdItem.DC);
m_dwStatusArrTimeOutTick[0 {0x220}] := 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 {0x219}] := LoWord(StdItem.MC);
m_dwStatusArrTimeOutTick[1 {0x224}] := 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 {0x21A}] := LoWord(StdItem.SC);
m_dwStatusArrTimeOutTick[2 {0x228}] := 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 {0x21B}] := HiWord(StdItem.AC);
m_dwStatusArrTimeOutTick[3 {0x22C}] := 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 {0x21C}] := LoWord(StdItem.AC);
m_dwStatusArrTimeOutTick[4 {0x230}] := 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 {0x21D}] := LoWord(StdItem.MAC);
m_dwStatusArrTimeOutTick[5 {0x234}] := GetTickCount + HiWord(StdItem.MAC) * 1000;
SysMsg('魔法值增加' + IntToStr(HiWord(StdItem.MAC)) + '秒', c_Green, t_Hint);
bo06 := True;
end;
if bo06 then begin
RecalcAbilitys();
SendMsg(m_Master, RM_HEROABILITY, 0, 0, 0, 0, '');
SendMsg(m_Master, RM_HEROSUBABILITY, 0, 0, 0, 0, '');
Result := True;
end;
end else begin
Result := EatUseItems(StdItem.Shape);
end;
end;
end;
end;
function THeroObject.ReadBook(StdItem: pTStdItem): Boolean;
var
Magic: pTMagic;
UserMagic: pTUserMagic;
HeroObject: THeroObject;
begin
Result := False;
Magic := UserEngine.FindHeroMagic(StdItem.Name);
if Magic <> nil then begin
if not IsTrainingSkill(Magic.wMagicId) then begin
if (Magic.sDescr = '英雄') and ((Magic.btJob = 99) or (Magic.btJob = m_btJob)) then begin
if (Magic.wMagicId in [60, 65]) and (Magic.wMagicId <> GetTogetherUseSpell) then Exit;
if m_Abil.Level >= Magic.TrainLevel[0] then begin
New(UserMagic);
UserMagic.MagicInfo := Magic;
UserMagic.wMagIdx := Magic.wMagicId;
UserMagic.btKey := 0;
UserMagic.btLevel := 0;
UserMagic.nTranPoint := 0;
m_MagicList.Add(UserMagic);
RecalcAbilitys();
SendAddMagic(UserMagic);
Result := True;
end;
end;
end;
end;
end;
procedure THeroObject.SendAddMagic(UserMagic: pTUserMagic);
var
ClientMagic: TClientMagic;
begin
ClientMagic.Key := Char(UserMagic.btKey);
ClientMagic.Level := UserMagic.btLevel;
ClientMagic.CurTrain := UserMagic.nTranPoint;
ClientMagic.Def := UserMagic.MagicInfo^;
m_DefMsg := MakeDefaultMsg(SM_HEROADDMAGIC, 0, 0, 0, 1);
SendSocket(@m_DefMsg, EncodeBuffer(@ClientMagic, SizeOf(TClientMagic)));
end;
procedure THeroObject.SendDelMagic(UserMagic: pTUserMagic);
begin
m_DefMsg := MakeDefaultMsg(SM_HERODELMAGIC, UserMagic.wMagIdx, 0, 0, 1);
SendSocket(@m_DefMsg, '');
end;
function THeroObject.IsEnoughBag(): Boolean;
begin
Result := False;
if m_ItemList.Count < m_nItemBagCount then
Result := True;
end;
procedure THeroObject.MakeWeaponUnlock;
begin
if m_UseItems[U_WEAPON].wIndex <= 0 then Exit;
if m_UseItems[U_WEAPON].btValue[3] > 0 then begin
Dec(m_UseItems[U_WEAPON].btValue[3]);
SysMsg(g_sTheWeaponIsCursed, c_Red, t_Hint);
end else begin
if m_UseItems[U_WEAPON].btValue[4] < 10 then begin
Inc(m_UseItems[U_WEAPON].btValue[4]);
SysMsg(g_sTheWeaponIsCursed, c_Red, t_Hint);
end;
end;
if m_btRaceServer = RC_HEROOBJECT then begin
RecalcAbilitys();
SendMsg(m_Master, RM_HEROABILITY, 0, 0, 0, 0, '');
SendMsg(m_Master, RM_HEROSUBABILITY, 0, 0, 0, 0, '');
end;
end;
//使用祝福油
function THeroObject.WeaptonMakeLuck: Boolean;
var
StdItem: pTStdItem;
nRand: Integer;
boMakeLuck: Boolean;
begin
Result := False;
if m_UseItems[U_WEAPON].wIndex <= 0 then Exit;
nRand := 0;
StdItem := UserEngine.GetStdItem(m_UseItems[U_WEAPON].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
boMakeLuck := False;
if m_UseItems[U_WEAPON].btValue[4] > 0 then begin
Dec(m_UseItems[U_WEAPON].btValue[4]);
SysMsg(g_sWeaptonMakeLuck {'武器被加幸運了...'}, c_Green, t_Hint);
boMakeLuck := True;
end else if m_UseItems[U_WEAPON].btValue[3] < g_Config.nWeaponMakeLuckPoint1 {1} then begin
Inc(m_UseItems[U_WEAPON].btValue[3]);
SysMsg(g_sWeaptonMakeLuck {'武器被加幸運了...'}, c_Green, t_Hint);
boMakeLuck := True;
end else if (m_UseItems[U_WEAPON].btValue[3] < g_Config.nWeaponMakeLuckPoint2 {3}) and (Random(nRand + g_Config.nWeaponMakeLuckPoint2Rate {6}) = 1) then begin
Inc(m_UseItems[U_WEAPON].btValue[3]);
SysMsg(g_sWeaptonMakeLuck {'武器被加幸運了...'}, c_Green, t_Hint);
boMakeLuck := True;
end else if (m_UseItems[U_WEAPON].btValue[3] < g_Config.nWeaponMakeLuckPoint3 {7}) and (Random(nRand * g_Config.nWeaponMakeLuckPoint3Rate {10 + 30}) = 1) then begin
Inc(m_UseItems[U_WEAPON].btValue[3]);
SysMsg(g_sWeaptonMakeLuck {'武器被加幸運了...'}, c_Green, t_Hint);
boMakeLuck := True;
end;
if m_btRaceServer = RC_HEROOBJECT then begin
RecalcAbilitys();
SendMsg(m_Master, RM_HEROABILITY, 0, 0, 0, 0, '');
SendMsg(m_Master, RM_HEROSUBABILITY, 0, 0, 0, 0, '');
end;
if not boMakeLuck then SysMsg(g_sWeaptonNotMakeLuck {'無效'}, c_Green, t_Hint);
end;
Result := True;
end;
function THeroObject.RepairWeapon: Boolean;
var
nDura: Integer;
UserItem: pTUserItem;
begin
Result := False;
UserItem := @m_UseItems[U_WEAPON];
if (UserItem.wIndex <= 0) or (UserItem.DuraMax <= UserItem.Dura) then Exit;
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);
if m_btRaceServer = RC_HEROOBJECT then begin
SendMsg(m_Master, RM_HERODURACHANGE, 1, UserItem.Dura, UserItem.DuraMax, 0, '');
SysMsg(g_sWeaponRepairSuccess {'武器修復成功...'}, c_Green, t_Hint);
end;
Result := True;
end;
end;
function THeroObject.SuperRepairWeapon: Boolean;
begin
Result := False;
if m_UseItems[U_WEAPON].wIndex <= 0 then Exit;
m_UseItems[U_WEAPON].Dura := m_UseItems[U_WEAPON].DuraMax;
if m_btRaceServer = RC_HEROOBJECT then begin
SendMsg(m_Master, RM_HERODURACHANGE, 1, m_UseItems[U_WEAPON].Dura, m_UseItems[U_WEAPON].DuraMax, 0, '');
SysMsg(g_sWeaponRepairSuccess {'武器修復成功...'}, c_Green, t_Hint);
end;
Result := True;
end;
function THeroObject.AbilityUp(UserMagic: pTUserMagic): Boolean;
var
nSpellPoint, n14: Integer;
begin
Result := False;
nSpellPoint := GetSpellPoint(UserMagic);
if nSpellPoint > 0 then begin
if m_WAbil.MP < nSpellPoint then Exit;
n14 := (Random(10 + UserMagic.btLevel) + UserMagic.btLevel) * UserMagic.btLevel;
m_dwStatusArrTimeOutTick[2 {0x228}] := GetTickCount + n14 * 1000;
m_wStatusArrValue[2 {0x218}] := MakeLong(LoWord(m_WAbil.SC), HiWord(m_WAbil.SC) - 2 - (m_Abil.Level div 7)) * 2;
SysMsg('道術增加' + IntToStr(m_wStatusArrValue[2 {0x218}]) + '點 ' + IntToStr(n14) + '秒', c_Green, t_Hint);
RecalcAbilitys();
SendMsg(m_Master, RM_HEROABILITY, 0, 0, 0, 0, '');
SendMsg(m_Master, RM_HEROSUBABILITY, 0, 0, 0, 0, '');
Result := True;
end;
end;
procedure THeroObject.GainExp(dwExp: LongWord);
begin
WinExp(dwExp);
end;
procedure THeroObject.WinExp(dwExp: LongWord);
begin
if m_Abil.Level > g_Config.nLimitExpLevel then begin
dwExp := g_Config.nLimitExpValue;
GetExp(dwExp);
end else
if dwExp > 0 then begin
dwExp := g_Config.dwKillMonExpMultiple * dwExp; //系統指定殺怪經驗倍數
dwExp := LongWord(m_nKillMonExpMultiple) * dwExp; //人物指定的殺怪經驗倍數
dwExp := Round((m_nKillMonExpRate / 100) * dwExp); //人物指定的殺怪經驗倍數
if m_PEnvir.m_boEXPRATE then
dwExp := Round((m_PEnvir.m_nEXPRATE / 100) * dwExp); //地圖上指定殺怪經驗倍數
if m_boExpItem then begin //物品經驗倍數
dwExp := Round(m_rExpItem * dwExp);
end;
GetExp(dwExp);
end;
end;
procedure THeroObject.GetExp(dwExp: LongWord);
begin
Inc(m_Abil.Exp, dwExp);
//AddBodyLuck(dwExp * 0.002);
if not TPlayObject(m_Master).m_boNotOnlineAddExp then //只發送給非離線掛機人物
SendMsg(m_Master, RM_HEROWINEXP, 0, dwExp, 0, 0, '');
if m_Abil.Exp >= m_Abil.MaxExp then begin
Dec(m_Abil.Exp, m_Abil.MaxExp);
if m_Abil.Level < MAXUPLEVEL then begin
Inc(m_Abil.Level);
end;
HasLevelUp(m_Abil.Level - 1);
{AddBodyLuck(100);
AddGameDataLog('12' + #9 +
m_sMapName + #9 +
IntToStr(m_Abil.Level) + #9 +
IntToStr(m_Abil.Exp) + #9 +
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -