📄 uguildsub.pas
字号:
tmpManager := ManagerList.GetManagerByServerID (aServerID);
nX := aX; nY := aY;
TMaper(tmpManager.Maper).GetNearXY (nX, nY);
StartX := nX; StartY := nY;
TargetX := nX; TargetY := nY;
RestX := nX; RestY := nY;
BasicData.x := nX; BasicData.y := nY;
SetManagerClass (tmpManager);
end;
function AddPermitExp (var aLevel, aExp: integer; addvalue: integer): integer;
var n : integer;
begin
n := GetLevelMaxExp (aLevel) * 3;
if n > addvalue then n := addvalue;
inc (aExp, n);
aLevel := GetLevel (aExp);
Result := n;
end;
function TGuildNpc.FieldProc (hfu: Longint; Msg: word; var SenderInfo: TBasicData; var aSubData: TSubData): Integer;
var
i: integer;
str, boname : String;
sayer, objectname, gradename, targetname : String;
Bo: TBasicObject;
MagicData : TMagicData;
OldSkillLevel : Integer;
begin
Result := PROC_FALSE;
if isRangeMessage ( hfu, Msg, SenderInfo) = FALSE then exit;
Result := inherited FieldProc (hfu, Msg, Senderinfo, aSubData);
if Result = PROC_TRUE then exit;
case Msg of
FM_ADDITEM :
begin
exit;
{
Bo := GetViewObjectByid (SenderInfo.id);
if Bo = nil then exit;
if not (Bo is TUSER) then exit;
boname := TUser (Bo).Name;
IsSysopName(boname);
}
end;
FM_ADDATTACKEXP :
begin
if boMagicNpc then begin
OldSkillLevel := GuildMagicData.rcSkillLevel;
AddPermitExp (GuildMagicData.rcSkillLevel, GuildMagicData.rSkillExp, aSubData.ExpData.Exp);
if OldSkillLevel <> GuildMagicData.rcSkillLevel then begin
if (GuildMagicData.rcSkillLevel mod 10) = 0 then begin
{
if GuildMagicData.rcSkillLevel >= 5000 then begin
BocSay ( Get10000To100 (GuildMagicData.rcSkillLevel) );
end else begin
BocSay ( Get10000To100 (GuildMagicData.rcSkillLevel) );
end;
}
BocSay ( Get10000To100 (GuildMagicData.rcSkillLevel) );
end;
end;
end;
end;
FM_SHOW :
begin
end;
FM_CHANGEFEATURE:
begin
if (SenderInfo.id = TargetId) and (SenderInfo.Feature.rFeatureState = wfs_die) then SetTargetId (0);
end;
FM_GUILDATTACK :
begin
if CurLife <= 0 then exit;
if aSubData.TargetID = 0 then begin
SetTargetID (aSubData.TargetID);
exit;
end;
if LifeObjectState = los_attack then exit;
Result := PROC_FALSE;
if aSubData.TargetId <> 0 then begin
// 2000.10.04 巩林唱 何巩林绰 傍拜窍瘤 臼档废 荐沥 by Lee.S.G
Bo := GetViewObjectByID (aSubData.TargetId);
if Bo = nil then exit;
if Bo is TGuildNpc then begin
if TGuildObject(ParentGuildObject).GuildName <> TGuildObject(TGuildNpc(Bo).ParentGuildObject).GuildName then begin
SetTargetId(aSubData.TargetId);
end;
end
else begin
if Bo is TUser then begin
boname := TUser (Bo).Name;
if IsSysopName(boname) = FALSE then begin
SetTargetId (aSubData.TargetId);
end;
end else begin
SetTargetId (aSubData.TargetId);
end;
end;
Result := PROC_TRUE;
end;
end;
FM_STRUCTED :
begin
if (SenderInfo.id = BasicData.id) then begin
if CurLife <= 0 then begin
SetTargetId (0);
// CommandChangeCharState (wfs_die);
exit;
end;
if pGuildNpcData^.rboProtecter then begin
// 2000.10.04 巩林唱 何巩林绰 傍拜窍瘤 臼档废 荐沥 by Lee.S.G
Bo := GetViewObjectByID (aSubData.Attacker);
if Bo = nil then exit;
if Bo is TGuildNpc then begin
if TGuildObject(ParentGuildObject).GuildName <> TGuildObject(TGuildNpc(Bo).ParentGuildObject).GuildName then begin
SetTargetId(aSubData.attacker);
end;
end
else begin
if Bo is TUser then begin
{
boname := TUser (Bo).Name;
if IsSysopName(boname) = TRUE then begin
// 巩颇包府磊俊霸 嘎疽阑锭俊绰 泪矫 巩林狼 馆措规氢栏肺 雀乔
if (BasicData.X < TUser(Bo).BasicData.X) and (BasicData.Y < TUser(Bo).BasicData.Y) then begin
TargetX := BasicData.X - 6; TargetY := BasicData.Y - 6;
end else if (BasicData.X = TUser(Bo).BasicData.X) and (BasicData.Y < TUser(Bo).BasicData.Y) then begin
TargetX := BasicData.X + 0; TargetY := BasicData.Y - 6;
end else if (BasicData.X > TUser(Bo).BasicData.X) and (BasicData.Y < TUser(Bo).BasicData.Y) then begin
TargetX := BasicData.X + 6; TargetY := BasicData.Y - 6;
end else if (BasicData.X > TUser(Bo).BasicData.X) and (BasicData.Y = TUser(Bo).BasicData.Y) then begin
TargetX := BasicData.X + 6; TargetY := BasicData.Y + 0;
end else if (BasicData.X > TUser(Bo).BasicData.X) and (BasicData.Y > TUser(Bo).BasicData.Y) then begin
TargetX := BasicData.X + 6; TargetY := BasicData.Y + 6;
end else if (BasicData.X = TUser(Bo).BasicData.X) and (BasicData.Y > TUser(Bo).BasicData.Y) then begin
TargetX := BasicData.X + 0; TargetY := BasicData.Y + 6;
end else if (BasicData.X < TUser(Bo).BasicData.X) and (BasicData.Y > TUser(Bo).BasicData.Y) then begin
TargetX := BasicData.X - 6; TargetY := BasicData.Y + 6;
end else if (BasicData.X < TUser(Bo).BasicData.X) and (BasicData.Y = TUser(Bo).BasicData.Y) then begin
TargetX := BasicData.X - 6; TargetY := BasicData.Y + 0;
end;
LifeObjectState := los_rest;
end else begin
SetTargetId (aSubData.attacker);
end;
}
SetTargetId (aSubData.attacker);
end else begin
SetTargetId (aSubData.attacker);
end;
end;
end;
end;
end;
FM_DEADHIT :
begin
CurLife := 0;
CommandChangeCharState (wfs_die);
end;
FM_SAY:
begin
if FboAllowDelete then exit;
if SenderInfo.id = BasicData.id then exit;
if TargetId <> 0 then begin
if (TargetID <> TGuildObject(ParentGuildObject).BasicData.ID) and
(LifeObjectState = los_attack) then exit;
end;
if LifeObjectState = los_escape then exit;
str := GetWordString (aSubData.SayString);
if ReverseFormat (str, '%s: ', sayer, objectname, gradename, 1) then begin
if (IsSysopName(sayer) = FALSE) and (SysopClass.GetSysopScope (sayer) < 100) then begin
exit;
end;
end;
if ReverseFormat (str, '%s: 巩颇公傍阑 %s丛俊霸 傈荐茄促', sayer, objectname, gradename, 2) then begin
if boMagicNpc then begin
// 2000.09.18 NPC狼 捞抚苞 User狼 捞抚捞 鞍阑锭 八祸坷幅滚弊 荐沥 by Lee.S.G
// 巩颇公傍 傈荐绰 RACE_HUMAN俊辑父 蜡瓤窍促
Bo := GetViewObjectByName (objectname, RACE_HUMAN);
if Bo = nil then begin BocSay (format ('%s丛篮 绝嚼聪促.',[objectname])); exit; end;
if not (Bo is TUser) then begin BocSay (format ('%s丛篮 荤侩磊啊 酒凑聪促.',[objectname])); exit; end;
if TUser(Bo).GuildName = '' then begin BocSay ('巩盔捞 酒凑聪促.'); exit; end;
if TUser(Bo).GuildName <> TGuildObject(ParentGuildObject).GuildName then begin
BocSay (format ('%s丛篮 促弗巩颇 涝聪促.',[objectname]));
exit;
end;
if StrPas (@GuildMagicData.rName) = '' then begin BocSay ('巩颇公傍捞 绝嚼聪促.'); exit; end;
if GuildMagicData.rcSkillLevel < 5000 then begin BocSay ('历狼 荐访档啊 何练钦聪促.'); exit; end;
MagicClass.GetMagicData (StrPas (@GuildMagicData.rName), MagicData, 0);
if TUser(Bo).AddMagic (@MagicData) then begin
BocSay ('巩颇公傍阑 傈荐 沁嚼聪促.');
GuildMagicData.rSkillExp := 0;
GuildMagicData.rcSkillLevel := GetLevel(GuildMagicData.rSkillExp);
end else BocSay ('巩颇公傍阑 傈荐甫 角菩沁嚼聪促.');
end;
exit;
end;
if ReverseFormat (str, '%s: %s狼 捞抚篮 %s捞促', sayer, objectname, gradename, 3) then begin
// objectname := copy (objectname, 1, Length(objectname)-2);
if objectname = GuildNpcName then begin
for i := 0 to MAX_GUILDNPC_COUNT - 1 do begin
if TGuildObject (ParentGuildObject).IsGuildNpc (gradename) then begin
BocSay ('捞固 鞍篮 捞抚捞 乐嚼聪促.');
exit;
end;
end;
if (not isFullHangul (gradename)) or (not isGrammarID(gradename)) then begin
BocSay ('捞抚捞 肋给登菌嚼聪促.');
exit;
end;
if (Length (gradename) <= 1) or (Length(gradename) > 10) then begin
BocSay ('捞抚捞 肋给登菌嚼聪促.');
exit;
end;
TGuildObject (ParentGuildObject).ChangeGuildNpcName (GuildNpcName, GradeName);
StrPCopy (@BasicData.Name, gradename);
StrPCopy (@BasicData.ViewName, gradename);
GuildNpcName := GradeName;
BocChangeProperty;
BocSay (format ('历狼 捞抚篮 %s啊 登菌嚼聪促.',[GuildNpcName]));
exit;
end;
exit;
end;
if ReverseFormat (str, '%s: %s狼 困摹绰 咯扁促', sayer, objectname, gradename, 2) then begin
// objectname := copy (objectname, 1, Length(objectname)-2);
if objectname = GuildNpcName then begin
if not TMaper(Manager.Maper).isObjectArea (BasicData.x, BasicData.y) then begin
StartX := BasicData.x; StartY := BasicData.y;
BocSay ('历绰 咯扁俊辑 矫累邓聪促.');
end else begin
BocSay ('捞镑俊 困摹甫 瘤沥且 荐 绝嚼聪促');
end;
end;
exit;
end;
if ReverseFormat (str, '%s: %s篮 蝶扼柯促', sayer, objectname, gradename, 2) or
ReverseFormat (str, '%s: %s绰 蝶扼柯促', sayer, objectname, gradename, 2) then begin
// objectname := copy (objectname, 1, Length(objectname)-2);
if objectname = GuildNpcName then begin
if BasicData.Feature.rfeaturestate = wfs_sitdown then begin
BasicData.Feature.rfeaturestate := wfs_normal;
BocChangeFeature;
end;
TargetId := SenderInfo.id;
LifeObjectState := los_follow;
end;
exit;
end;
if ReverseFormat (str, '%s: %s篮 沥瘤茄促', sayer, objectname, gradename, 2) or
ReverseFormat (str, '%s: %s绰 沥瘤茄促', sayer, objectname, gradename, 2) then begin
// objectname := copy (objectname, 1, Length(objectname)-2);
if objectname = GuildNpcName then LifeObjectState := los_stop;
exit;
end;
// 2000.09.16 巩颇器凉俊 措茄 老绢急促,旧绰促狼 悼累 昏力 by Lee.S.G
{
// if ReverseFormat (str, '%s: %s 老绢急促', sayer, objectname, gradename, 2) then begin
objectname := copy (objectname, 1, Length(objectname)-2);
if objectname = GuildNpcName then begin
if BasicData.Feature.rfeaturestate = wfs_sitdown then begin
BasicData.Feature.rfeaturestate := wfs_normal;
BocChangeFeature;
end;
end;
end;
// if ReverseFormat (str, '%s: %s 旧绰促', sayer, objectname, gradename, 2) then begin
objectname := copy (objectname, 1, Length(objectname)-2);
if objectname = GuildNpcName then begin
if BasicData.Feature.rfeaturestate = wfs_normal then begin
BasicData.Feature.rfeaturestate := wfs_sitdown;
BocChangeFeature;
LifeObjectState := los_stop;
end;
end;
end;
}
if ReverseFormat (str, '%s: %s篮 绒侥茄促', sayer, objectname, gradename, 2) or
ReverseFormat (str, '%s: %s绰 绒侥茄促', sayer, objectname, gradename, 2) then begin
// objectname := copy (objectname, 1, Length(objectname)-2);
if objectname = GuildNpcName then begin
if BasicData.Feature.rfeaturestate = wfs_sitdown then begin
BasicData.Feature.rfeaturestate := wfs_normal;
BocChangeFeature;
end;
RestX := BasicData.x;
RestY := BasicData.y;
LifeObjectState := los_rest;
BocSay ('历绰 咯扁俊辑 绒侥钦聪促.');
end;
exit;
end;
end;
end;
end;
procedure TGuildNpc.Update (CurTick: integer);
var
key : word;
Bo : TBasicObject;
i : integer;
begin
inherited UpDate (CurTick);
if (BasicData.Feature.rFeatureState = wfs_die) and (CurTick > DiedTick + 1600) then begin
FboAllowDelete := TRUE;
exit;
end;
case LifeObjectState of
los_none:
begin
if TargetPosTick + 3000 < CurTick then begin
TargetPosTick := Curtick;
TargetX := RestX - pGuildNpcData^.rActionWidth div 2 + Random (pGuildNpcData^.rActionWidth);
TargetY := RestY - pGuildNpcData^.rActionWidth div 2 + Random (pGuildNpcData^.rActionWidth);
exit;
end;
if WalkTick + 200 < CurTick then begin
Walktick := CurTick;
GotoXyStand (TargetX, TargetY);
end;
end;
los_die :;
los_follow:
begin
bo := TBasicObject (GetViewObjectById (TargetId));
if bo = nil then LifeObjectState := los_none
else begin
if GetLargeLength (BasicData.X, BasicData.Y, bo.PosX, bo.PosY) <= 2 then exit;
if WalkTick + 60 < CurTick then begin
Walktick := CurTick;
GotoXyStand (bo.Posx, bo.Posy);
end;
end;
end;
los_stop:
begin
end;
los_rest:
begin
if TargetPosTick + 3000 < CurTick then begin
TargetPosTick := Curtick;
TargetX := RestX - pGuildNpcData^.rActionWidth div 2 + Random (pGuildNpcData^.rActionWidth);
TargetY := RestY - pGuildNpcData^.rActionWidth div 2 + Random (pGuildNpcData^.rActionWidth);
exit;
end;
if WalkTick + 200 < CurTick then begin
Walktick := CurTick;
GotoXyStand (TargetX, TargetY);
end;
end;
los_attack:
begin
bo := TBasicObject (GetViewObjectById (TargetId));
if bo = nil then LifeObjectState := los_none
else begin
if GetLargeLength (BasicData.X, BasicData.Y, bo.PosX, bo.PosY) = 1 then begin
key := GetNextDirection (BasicData.X, BasicData.Y, bo.PosX, bo.PosY);
if key = DR_DONTMOVE then exit; // 困率捞 0 老锭狼 版快牢单 困率捞 1烙..
if key <> BasicData.dir then CommandTurn (key);
CommandHit (CurTick);
end else begin
if WalkTick + 35 < CurTick then begin
Walktick := CurTick;
GotoXyStand (bo.Posx, bo.Posy);
end;
end;
end;
end;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -