📄 uskills.pas
字号:
TLIfeObject(BasicObject).CommandSay(pd^.rSayString);
SpeechTick := CurTick;
if CurSpeechIndex < SpeechList.Count - 1 then Inc(CurSpeechIndex)
else CurSpeechIndex := 0;
end;
end;
end;
constructor TDeallerSkill.Create (aBasicObject : TBasicObject);
begin
BasicObject := aBasicObject;
DataList := TList.Create;
end;
destructor TDeallerSkill.Destroy;
begin
if DataList <> nil then begin
Clear;
DataList.Free;
end;
inherited Destroy;
end;
procedure TDeallerSkill.Clear;
var
i : Integer;
begin
for i := 0 to DataList.Count - 1 do dispose (DataList[i]);
DataList.Clear;
end;
function TDeallerSkill.LoadFromFile (aFileName : String) : Boolean;
var
i, j, iCount : integer;
DeallerDB : TUserStringDB;
iname : String;
pd : PTDeallerData;
str, mName, mCount : String;
begin
Result := false;
if aFileName = '' then exit;
if FileExists(aFileName) = FALSE then exit;
Clear;
DeallerDB := TUserStringDb.Create;
DeallerDB.LoadFromFile (aFileName);
for i := 0 to DeallerDB.Count -1 do begin
iname := DeallerDB.GetIndexName (i);
if DeallerDB.GetFieldValueBoolean(iname, 'boSelfSay') <> TRUE then begin
new (pd);
FillChar (pd^, sizeof(TDeallerData), 0);
pd^.rHearString := DeallerDB.GetFieldValueString (iname, 'HearString');
pd^.rSayString := DeallerDB.GetFieldValueString (iname, 'SayString');
str := DeallerDB.GetFieldValueString (iname, 'NeedItem');
for j := 0 to 5 - 1 do begin
if str = '' then break;
str := GetValidStr3 (str, mName, ':');
if mName = '' then break;
str := GetValidStr3 (str, mCount, ':');
if mCount = '' then break;
iCount := _StrToInt (mCount);
if iCount <= 0 then iCount := 1;
pd^.rNeedItem[j].rName := mName;
pd^.rNeedItem[j].rCount := iCount;
end;
str := DeallerDB.GetFieldValueString (iname, 'GiveItem');
for j := 0 to 5 - 1 do begin
if str = '' then break;
str := GetValidStr3 (str, mName, ':');
if mName = '' then break;
str := GetValidStr3 (str, mCount, ':');
if mCount = '' then break;
iCount := _StrToInt (mCount);
if iCount <= 0 then iCount := 1;
pd^.rGiveItem[j].rName := mName;
pd^.rGiveItem[j].rCount := iCount;
end;
DataList.Add(pd);
end;
end;
DeallerDB.Free;
Result := true;
end;
function TDeallerSkill.ProcessMessage (aStr : String; SenderInfo : TBasicData) : Boolean;
var
i, j, k : Integer;
sayer, dummy1, dummy2 : String;
pd : PTDeallerData;
BO : TBasicObject;
SubData : TSubData;
ItemData : TItemData;
begin
Result := false;
if DataList.Count <= 0 then exit;
for i := 0 to DataList.Count - 1 do begin
pd := DataList[i];
if ReverseFormat (astr, '%s: ' + pd^.rHearString, sayer, dummy1, dummy2, 1) then begin
BO := TLifeObject (BasicObject).GetViewObjectByID (SenderInfo.id);
if BO = nil then exit;
if SenderInfo.Feature.rRace <> RACE_HUMAN then exit;
for j := 0 to 5 - 1 do begin
if pd^.rNeedItem[j].rName = '' then break;
ItemClass.GetItemData (pd^.rNeedItem[j].rName, ItemData);
if ItemData.rName[0] <> 0 then begin
ItemData.rCount := pd^.rNeedItem[j].rCount;
if TUser (BO).FindItem (@ItemData) = false then begin
TUser (BO).SendClass.SendChatMessage (format ('%s 酒捞袍 %d俺啊 鞘夸钦聪促', [StrPas (@ItemData.rName), ItemData.rCount]), SAY_COLOR_SYSTEM);
exit;
end;
end;
end;
BasicObject.BasicData.nx := SenderInfo.x;
BasicObject.BasicData.ny := SenderInfo.y;
for j := 0 to 5 - 1 do begin
if pd^.rGiveItem[j].rName = '' then break;
ItemClass.GetItemData (pd^.rGiveItem[j].rName, ItemData);
ItemData.rCount := pd^.rGiveItem[j].rCount;
ItemData.rOwnerName[0] := 0;
SubData.ItemData := ItemData;
SubData.ServerId := BasicObject.ServerId;
if TFieldPhone (BasicObject.Manager.Phone).SendMessage (SenderInfo.id, FM_ENOUGHSPACE, BasicObject.BasicData, SubData) = PROC_FALSE then begin
for k := 0 to j - 1 do begin
if pd^.rGiveItem[j].rName = '' then break;
ItemClass.GetItemData (pd^.rGiveItem[j].rName, ItemData);
ItemData.rCount := pd^.rGiveItem[j].rCount;
ItemData.rOwnerName[0] := 0;
TUser (BO).DeleteItem (@ItemData);
end;
TLIfeObject (BasicObject).CommandSay('酒捞袍 芒狼 傍埃捞 何练钦聪促');
exit;
// TFieldPhone (BasicObject.Phone).SendMessage (MANAGERPHONE, FM_ADDITEM, BasicObject.BasicData, SubData);
end else begin
TFieldPhone(BasicObject.Manager.Phone).SendMessage (SenderInfo.id, FM_ADDITEM, BasicObject.BasicData, SubData);
end;
end;
for j := 0 to 5 - 1 do begin
if pd^.rNeedItem[j].rName = '' then break;
ItemClass.GetItemData (pd^.rNeedItem[j].rName, ItemData);
if ItemData.rName[0] <> 0 then begin
ItemData.rCount := pd^.rNeedItem[j].rCount;
TUser (BO).DeleteItem (@ItemData);
end;
end;
TLIfeObject (BasicObject).CommandSay(pd^.rSayString);
Result := true;
exit;
end;
end;
end;
constructor TAttackSkill.Create (aBasicObject : TBasicObject);
begin
BasicObject := aBasicObject;
if Pointer (BasicObject) = Pointer ($150) then begin
BasicObject := nil;
end;
Boss := nil;
ObjectBoss := nil;
DeadAttackName := '';
TargetID := 0;
EscapeID := 0;
EscapeLife := 0;
boGroup := false;
boBoss := false;
TargetPosTick := 0;
CurNearViewHumanId := 0;
HateHumanId := 0;
boGroupSkill := false;
GroupSkill := nil;
boSelfTarget := true;
BowCount := 5;
boBowAvail := true;
BowAvailTick := 0;
BowAvailInterval := 500;
end;
destructor TAttackSkill.Destroy;
begin
NoticeDie;
if ObjectBoss <> nil then begin
ObjectBoss.MemberDie (BasicObject);
end;
if GroupSkill <> nil then begin
GroupSkill.BossDie;
GroupSkill.Free;
GroupSkill := nil;
boGroupSkill := false;
end;
inherited Destroy;
end;
procedure TAttackSkill.HelpMe (aMeID, aTargetID, aX, aY : Integer);
begin
if aTargetID <> 0 then begin
if TargetID <> aTargetID then begin
SetHelpTargetIDandPos (aTargetID, aX, aY);
end;
if GroupSkill <> nil then begin
GroupSkill.MoveAttack (aTargetID, aX, aY);
end else begin
GroupSkill := nil;
end;
end;
end;
procedure TAttackSkill.CancelHelp (aTargetID : Integer);
begin
if aTargetID <> 0 then begin
if GroupSkill <> nil then begin
GroupSkill.CancelTarget (aTargetID);
end else begin
GroupSkill := nil;
end;
end;
end;
procedure TAttackSkill.SetSelf (aSelf : TBasicObject);
begin
BasicObject := aSelf;
end;
procedure TAttackSkill.SetBoss (aBoss : TBasicObject);
begin
Boss := aBoss;
end;
procedure TAttackSkill.SetObjectBoss (aBoss : TDynamicObject);
begin
ObjectBoss := aBoss;
end;
function TAttackSkill.GetObjectBoss : TDynamicObject;
begin
Result := ObjectBoss;
end;
procedure TAttackSkill.SetDeadAttackName (aName : String);
begin
if TLifeObject (BAsicObject).LifeObjectState = los_die then exit;
DeadAttackName := aName;
if aName <> '' then begin
TLifeObject (BasicObject).LifeObjectState := los_deadattack;
end;
end;
procedure TAttackSkill.SetSaveIDandPos (aTargetID : Integer; aTargetX, aTargetY : Word; aNextState : TLifeObjectState);
begin
TargetStartTick := mmAnsTick;
SaveID := aTargetID;
TargetX := aTargetX;
TargetY := aTargetY;
SaveNextState := aNextState;
end;
procedure TAttackSkill.SetTargetID (aTargetID : Integer; boCaller : Boolean);
var
SubData : TSubData;
tmpAttackSkill : TAttackSkill;
tmpTargetID : Integer;
BO : TBasicObject;
begin
if (TLifeObject (BasicObject).LifeObjectState = los_die)
or (TLifeObject (BasicObject).LifeObjectState = los_init) then exit;
if TLifeObject (BasicObject).LifeObjectState = los_deadattack then exit;
if aTargetID = BasicObject.BasicData.id then exit;
if (aTargetID = 0) and (TargetID <> 0) then begin
tmpTargetID := TargetID;
TargetId := aTargetID;
if (Boss <> nil) and (boSelfTarget = true) then begin
if Boss.BasicData.Feature.rrace = RACE_NPC then
// tmpAttackSkill := TNpc(Boss).GetAttackSkill;
tmpAttackSkill := nil
else
tmpAttackSkill := TMonster(Boss).GetAttackSkill;
if tmpAttackSkill <> nil then begin
tmpAttackSkill.CancelHelp (tmpTargetID);
end;
end;
end;
if aTargetID = 0 then begin
TargetId := aTargetID;
TLifeObject (BasicObject).LifeObjectState := los_none;
exit;
end;
boSelfTarget := true;
TargetId := aTargetID;
TLifeObject (BasicObject).LifeObjectState := los_attack;
if GroupSkill <> nil then begin
BO := TLifeObject (BasicObject).GetViewObjectByID (TargetID);
if BO <> nil then begin
GroupSkill.MoveAttack (TargetID, BO.BasicData.X, BO.BasicData.Y);
end;
end else if Boss <> nil then begin
if Boss.BasicData.Feature.rRace = RACE_NPC then
tmpAttackSkill := TNpc(Boss).GetAttackSkill
else
tmpAttackSkill := TMonster(Boss).GetAttackSkill;
if tmpAttackSkill <> nil then begin
if tmpAttackSkill.GetTargetID <> TargetID then begin
BO := TLifeObject (BasicObject).GetViewObjectByID (TargetID);
if BO <> nil then begin
if BO.BasicData.Feature.rFeatureState = wfs_die then begin
BO := nil;
exit;
end;
if tmpAttackSkill.GroupSkill <> nil then begin
tmpAttackSkill.HelpMe (BasicObject.BasicData.id, TargetID, BO.BasicData.x, BO.BasicData.y);
end else begin
BO := nil;
end;
end;
end;
end;
end else begin
if (boCaller = true) and (boVassal = true) then begin
SubData.TargetId := TargetID;
SubData.VassalCount := VassalCount;
TLifeObject (BasicObject).SendLocalMessage (NOTARGETPHONE, FM_GATHERVASSAL, BasicObject.BasicData, SubData);
end;
end;
end;
procedure TAttackSkill.SetHelpTargetID (aTargetID : Integer);
var
tmpAttackSkill : TAttackSkill;
begin
if (TLifeObject (BasicObject).LifeObjectState = los_die)
or (TLifeObject (BasicObject).LifeObjectState = los_init) then exit;
if aTargetID = BasicObject.BasicData.id then exit;
if aTargetID = 0 then begin
if Boss <> nil then begin
if Boss.BasicData.Feature.rrace = RACE_NPC then
// tmpAttackSkill := TNpc(Boss).GetAttackSkill;
tmpAttackSkill := nil
else
tmpAttackSkill := TMonster(Boss).GetAttackSkill;
if tmpAttackSkill <> nil then begin
if tmpAttackSkill.GetTargetID <> TargetID then begin
tmpAttackSkill.CancelHelp (TargetID);
end;
end;
end;
TargetId := aTargetID;
TLifeObject (BasicObject).LifeObjectState := los_none;
exit;
end;
boSelfTarget := false;
TargetId := aTargetID;
TLifeObject (BasicObject).LifeObjectState := los_attack;
if GroupSkill <> nil then begin
GroupSkill.Attack (TargetID);
end;
end;
procedure TAttackSkill.SetHelpTargetIDandPos (aTargetID, aX, aY : Integer);
begin
if (TLifeObject (BasicObject).LifeObjectState = los_die)
or (TLifeObject (BasicObject).LifeObjectState = los_init) then exit;
if aTargetID = BasicObject.BasicData.id then exit;
if (aTargetID = 0) or (aTargetID = TargetID) then exit;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -