- 精华
- 阅读权限
- 180
- 好友
- 相册
- 分享
- 听众
- 收听
- 注册时间
- 2008-11-1
- 在线时间
- 小时
- 最后登录
- 1970-1-1
|
[77M2] 传奇引擎 废旧物品回收 脚本
给会使用的朋友. 我不做任何解答. 77M2上手难度++++++
引擎的链接具体大家可以搜索一下 就不发类似广告的链接了.
unit Q36;
interface
uses Classes, SysUtils, DefiniensConst;
procedure Main(Npc: TNormNpc; Player: TPlayObject; Args: TArgs);
procedure FastRecover(Npc: TNormNpc; Player: TPlayObject; Args: TArgs); //一键回收
procedure ViewInfo(Npc: TNormNpc; Player: TPlayObject; Args: TArgs); //查看可用的回收信息
implementation
var
NameList,
GoldList,
ExpList: TStrings;
procedure Main(Npc: TNormNpc; Player: TPlayObject; Args: TArgs);
const
S=
[[
你好,你想获得更多的金币和经验值吗?哪就将你不要的装备\
都拿我这里回收吧。\\
<查看可回收装备信息/@ViewInfo(0)>\
<一键回收/@@Question(你是否将不需要回收的物品存放好,确定要执行一键回收吗?,@FastRecover)>\\\\
<离开/@exit>
]];
begin
Npc.Say(Player, S);
end;
procedure FastRecover(Npc: TNormNpc; Player: TPlayObject; Args: TArgs);
var
I, Idx, AGold, AExp: Integer;
begin
AGold := 0;
AExp := 0;
for I := Player.ItemSize - 1 downto 0 do //循环处理包裹物品
begin
if Player.BagItem[I] <> nil then //如果该包裹为不为空
begin
Idx := NameList.IndexOf(Player.BagItem[I].Name); //查看是否有和该物品对应的回收信息
if Idx >= 0 then
begin
AGold := AGold + StrToIntDef(GoldList[Idx], 0); //取出对应的金币
AExp := AExp + StrToIntDef(ExpList[Idx], 0); //取出对应的经验值
Player.DeleteItem(Player.BagItem[I]); //删除背包物品
end;
end;
end;
if (AGold > 0) or (AExp > 0) then
begin
Player.Gold := Player.Gold + AGold; //增加金币
Player.GoldChanged; //更新金币信息
Player.AddExp(AExp); //增加经验值
Player.SendCenterMessage(Format('本次回收装备共获得金币{S=%d;C=249} 经验值{S=%d;C=249}', [AGold, AExp]), 0); //发送回收信息
end
else
Npc.MessageBox(Player, '你身上毛都没有一根,想回收点撒呢?');
end;
procedure ViewInfo(Npc: TNormNpc; Player: TPlayObject; Args: TArgs);
const
S=
[[
{S=【物品回收信息】;C=254}\
{S=物品名 回收金币 回收经验值;C=243}\
$INFO$
<{S=第一页;Y=130}/@ViewInfo(0)> <{S=上一页;Y=130}/@ViewInfo(1,$ForwardPage$)> <{S=下一页;Y=130}/@ViewInfo(2,$NextPage$)> <{S=末尾页;Y=130}/@ViewInfo(3)> <{S=返回;Y=130}/@main>
]];
LINESTR = '{S=$Name$}{S=$Gold$;X=162}{S=$Exp$;X=258}\';
var
Message, InfoStr, ANodeStr: String;
nForwardPage,
nNextPage,
nPage,
I, nStart, nEnd, nIndex: Integer;
begin
nPage := Args.Int[1]; //取出当前点击的页
case Args.Int[0] of //根据类型获得当前要返回的页
0: nPage := 0;
1: nPage := nPage - 1;
2: nPage := nPage + 1;
3: nPage := NameList.Count div 6; //最大页
end;
//取出将要返回的页信息
nForwardPage := nPage - 1;
nNextPage := nPage + 1;
if nForwardPage < 0 then
nForwardPage := 0;
if nNextPage > (NameList.Count div 6) then
nNextPage := NameList.Count div 6;
if nPage < 0 then
nPage := 0;
if nPage > (NameList.Count div 6) then
nPage := NameList.Count div 6;
InfoStr := '';
nStart := nPage * 6; //要取的物品位置为 页*12
nEnd := nStart + 5; //在当前位置上+11表示一共循环12个物品
for I := nStart to nEnd do
begin
if I < NameList.Count then
begin
//如果位置没超出回收表
ANodeStr := LINESTR;
ANodeStr := ReplaceStr(ANodeStr, '$Name$', NameList[I]); //替换物品名称
ANodeStr := ReplaceStr(ANodeStr, '$Gold$', GoldList[I]); //替换物品可兑换的荣誉点数
ANodeStr := ReplaceStr(ANodeStr, '$Exp$', ExpList[I]); //设置每行的第一个物品名称的X坐标
InfoStr := InfoStr + ANodeStr;
end;
end;
Message := S;
Message := ReplaceStr(Message, '$INFO$', InfoStr);
Message := ReplaceStr(Message, '$ForwardPage$', IntToStr(nForwardPage));
Message := ReplaceStr(Message, '$NextPage$', IntToStr(nNextPage));
Npc.Say(Player, Message);
end;
//解析一行数据
function ParseItem(const Value: String; var ItemName: String; var Gold, Exp: Integer): Boolean;
var
List: TStrings;
begin
Result := False;
List := TStringList.Create;
try
ExtractStrings([','], [], Value, List);
if List.Count = 3 then
begin
ItemName := List[0];
Gold := StrToIntDef(List[1], 0);
Exp := StrToIntDef(List[2], 0);
Result := True;
end;
finally
List.Free;
end;
end;
procedure ReadNationRecover;
var
List: TStrings;
ALine, AName, APoint: String;
I, AGold, AExp: Integer;
begin
{
另外一种方式(将物品列表保存在外部文本文件):
List := TStringList.Create;
try
List.LoadFrom('.\普通金币回收.txt');
//加载列表
finally
List.Free;
end;
}
List := Gamelib.TryGetResource('普通金币回收'); //从版本文件中查找回收表,Gamelib.TryGetResource返回的对象永远不要自己去释放
if List <> nil then //如果找到了回收表
begin
for I := 0 to List.Count - 1 do
begin
ALine := Trim(List[I]); //取出一行
if (ALine <> '') and (ALine[1] <> ';') then //如果行不为空,并且第一个字符不是“;”
begin
if ParseItem(ALine, AName, AGold, AExp) then
begin
NameList.Add(AName);
GoldList.Add(IntToStr(AGold));
ExpList.Add(IntToStr(AExp));
end;
end;
end;
end;
end;
initialization
NameList := TStringList.Create;
GoldList := TStringList.Create;
ExpList := TStringList.Create;
ReadNationRecover; //初始化的时候就加载回收表
finalization
FreeAndNil(NameList);
FreeAndNil(GoldList);
FreeAndNil(ExpList);
end.
|
|