查看: 190|回复: 1

Runuo开发教程之藏宝图脚本重写详细解析

[复制链接]

4

主题

4

帖子

29

积分

版主

Rank: 7Rank: 7Rank: 7

发表于 2017-2-5 18:22:17 | 显示全部楼层 |阅读模式
本例子以Runuo藏宝图脚本为基础进行解析,由eDev.Me-龙天炽撰写.
  1. /*******************************************************************
  2. *  Copyright(c) LongTianChi All rights reserved.
  3. *  
  4. *  作者: 龙天炽
  5. *  日期: 2017/2/5 18:12
  6. *  网站: http://www.edev.me/
  7. *
  8. *  藏宝图代码解析
  9. *  
  10. ******************************************************************/
  11. using System;
  12. using System.IO;
  13. using System.Collections.Generic;
  14. using Server.ContextMenus;

  15. namespace Server.Items
  16. {
  17.     public class ETreasureMap : MapItem
  18.     {
  19.         private int m_Level;
  20.         private Map m_Map;
  21.         private Point2D m_Location;

  22.         [CommandProperty(AccessLevel.GameMaster)]
  23.         public int Level { get { return m_Level; } set { m_Level = value; InvalidateProperties(); } }

  24.         [CommandProperty(AccessLevel.GameMaster)]
  25.         public Map ChestMap { get { return m_Map; } set { m_Map = value; InvalidateProperties(); } }

  26.         [CommandProperty(AccessLevel.GameMaster)]
  27.         public Point2D ChestLocation { get { return m_Location; } set { m_Location = value; } }

  28.         /// <summary>
  29.         /// 藏宝图种子坐标储存池
  30.         /// </summary>
  31.         private static Point2D[] m_Locations;
  32.         /// <summary>
  33.         /// 随机获取一个藏宝图种子坐标
  34.         /// </summary>
  35.         /// <returns></returns>
  36.         public static Point2D GetRandomLocation()
  37.         {
  38.             if (m_Locations == null)
  39.                 LoadLocations();

  40.             if (m_Locations.Length > 0)
  41.                 return m_Locations[Utility.Random(m_Locations.Length)];

  42.             return Point2D.Zero;
  43.         }
  44.         /// <summary>
  45.         /// 读取配置好的藏宝图种子坐标
  46.         /// </summary>
  47.         private static void LoadLocations()
  48.         {
  49.             string filePath = Path.Combine(Core.BaseDirectory, "Data/treasure.cfg");

  50.             List<Point2D> list = new List<Point2D>();

  51.             if (File.Exists(filePath))
  52.             {
  53.                 using (StreamReader ip = new StreamReader(filePath))
  54.                 {
  55.                     string line;

  56.                     while ((line = ip.ReadLine()) != null)
  57.                     {
  58.                         try
  59.                         {
  60.                             string[] split = line.Split(' ');

  61.                             int x = Convert.ToInt32(split[0]), y = Convert.ToInt32(split[1]);

  62.                             Point2D loc = new Point2D(x, y);
  63.                             list.Add(loc);
  64.                         }
  65.                         catch
  66.                         {
  67.                         }
  68.                     }
  69.                 }
  70.             }

  71.             m_Locations = list.ToArray();
  72.         }

  73.         [Constructable] //声明该项目可以创造
  74.         public ETreasureMap(int level, Map map)
  75.         {
  76.             m_Level = level;
  77.             m_Map = map;
  78.             //设置GUMP大小
  79.             Width = 300;
  80.             Height = 300;
  81.             //取藏宝图配置地点
  82.             m_Location = GetRandomLocation();
  83.             //设置随即范围
  84.             int width = 600;
  85.             int height = 600;

  86.             int x1 = m_Location.X - Utility.RandomMinMax(width / 4, (width / 4) * 3);
  87.             int y1 = m_Location.Y - Utility.RandomMinMax(height / 4, (height / 4) * 3);

  88.             if (x1 < 0)
  89.                 x1 = 0;

  90.             if (y1 < 0)
  91.                 y1 = 0;

  92.             int x2 = x1 + width;
  93.             int y2 = y1 + height;

  94.             if (x2 >= 5120)
  95.                 x2 = 5119;

  96.             if (y2 >= 4096)
  97.                 y2 = 4095;

  98.             x1 = x2 - width;
  99.             y1 = y2 - height;

  100.             Bounds = new Rectangle2D(x1, y1, width, height);
  101.             Protected = true;

  102.             //添加GUMP小指针的定位点
  103.             AddWorldPin(m_Location.X, m_Location.Y);
  104.         }
  105.         /// <summary>
  106.         /// 控制物品名字
  107.         /// </summary>
  108.         public override int LabelNumber
  109.         {
  110.             get
  111.             {
  112.                 if (m_Level == 6)
  113.                     return 1063452;
  114.                 else
  115.                     return 1041510 + m_Level;
  116.             }
  117.         }
  118.         /// <summary>
  119.         /// 添加藏宝图说明信息
  120.         /// </summary>
  121.         /// <param name="list"></param>
  122.         public override void GetProperties(ObjectPropertyList list)
  123.         {
  124.             base.GetProperties(list);

  125.             list.Add(m_Map == Map.Felucca ? 1041502 : 1041503); // 根据地图从本地语言包选择说明信息

  126.         }
  127.         /// <summary>
  128.         /// 左键单机时弹出菜单
  129.         /// </summary>
  130.         /// <param name="from"></param>
  131.         /// <param name="list"></param>
  132.         public override void GetContextMenuEntries(Mobile from, List<ContextMenuEntry> list)
  133.         {
  134.             base.GetContextMenuEntries(from, list);
  135.                     
  136.             list.Add(new OpenMapEntry(this));

  137.             //if(from.InRange(m_Location,5))
  138.                 list.Add(new DigEntry(this));
  139.         }

  140.         /// <summary>
  141.         /// 打开地图菜单
  142.         /// </summary>
  143.         private class OpenMapEntry : ContextMenuEntry
  144.         {
  145.             private ETreasureMap m_Map;

  146.             public OpenMapEntry(ETreasureMap map)
  147.                 : base(6150, 2)
  148.             {
  149.                 m_Map = map;
  150.             }

  151.             public override void OnClick()
  152.             {
  153.                 if (!m_Map.Deleted)
  154.                     m_Map.DisplayTo(Owner.From);
  155.             }
  156.         }
  157.         /// <summary>
  158.         /// 挖宝菜单
  159.         /// </summary>
  160.         private class DigEntry : ContextMenuEntry
  161.         {
  162.             private ETreasureMap m_Map;

  163.             public DigEntry(ETreasureMap map)
  164.                 : base(6148, 2)
  165.             {
  166.                 m_Map = map;
  167.             }

  168.             public override void OnClick()
  169.             {
  170.                 if (m_Map.Deleted)
  171.                     return;
  172.                 //取的菜单使用人
  173.                 Mobile from = Owner.From;
  174.                 //下面写挖图代码...
  175.             }
  176.         }
  177.         /// <summary>
  178.         /// 下面是序列化与反序列化.
  179.         /// </summary>
  180.         /// <param name="serial"></param>
  181.         public ETreasureMap(Serial serial) : base(serial)
  182.                 {
  183.                 }
  184.         public override void Serialize(GenericWriter writer)
  185.         {
  186.             base.Serialize(writer);

  187.             writer.Write((int)0);

  188.             writer.Write(m_Level);
  189.             writer.Write(m_Map);
  190.             writer.Write(m_Location);
  191.         }

  192.         public override void Deserialize(GenericReader reader)
  193.         {
  194.             base.Deserialize(reader);

  195.             int version = reader.ReadInt();
  196.             switch (version)
  197.             {
  198.                 case 0:
  199.                 {
  200.                     m_Level = (int)reader.ReadInt();
  201.                     m_Map = reader.ReadMap();
  202.                     m_Location = reader.ReadPoint2D();
  203.                     break;
  204.                 }
  205.             }
  206.         }
  207.     }
  208. }
复制代码
回复

使用道具 举报

0

主题

190

帖子

191

积分

注册会员

Rank: 2

发表于 2017-2-13 20:09:04 | 显示全部楼层
支持  看看  不错
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


快速回复 返回顶部 返回列表