佳丽云

英雄无敌3-WoG中文站

 找回密码
 英雄注册|Register
查看: 3981|回复: 8

ERA插件编写--认识插件和SDK

[复制链接]

该用户从未签到

138

回帖

14万

金币

1

精华

4级 Famous Hero

Rank: 4

积分
1319

杰出贡献TE联赛殿军

发表于 2013-7-16 22:54:08 | 显示全部楼层 |阅读模式
从本篇开始讲解插件相关的编写,以及ExtendedErmFunction编写的实例。希望更多有编程基础的朋友对ERA插件编程有所了解,另外揭开插件的面纱,其实他并不神秘。
       插件其实是一个DLL文件,又叫动态库链接文件,这个不多说。ERA平台会遍历MOD目录里面的目录,在这些目录下的EraPlugins文件夹里面寻找.dll和.era扩展名的文件,尝试用LoadLibrary加载进进程空间。这里值得注意的是.era扩展名的文件,他是ERA2.3以后的标准扩展名,只是扩展名不同而已,他本身仍然是个DLL文件。
       也就是说,任何有效的DLL放到mod的EraPlugins目录下都会被加载,和编程语言无关。看到这里,学习VB的同学可以安心,如果你的DLL无法被加载,我立马给你50000WOG币的精神损失费。
       现在说说SDK,位于Tools\Era\SDK。这里以C语言对应的era.h为例。SDK的作用就是便于开发,提供了很多定义好的结构体,以及定义很多angel.dll中的函数,这个angel.dll是ERA提供的一个“桥梁”,里面导出函数可以方便得让我们控制ERA的方方面面。
       如果没有提供的SDK,比如VB编程的朋友,可以根据era.h变换成等效的VB代码,一样可以方便得链接ERA平台。本篇的目的是在于介绍插件和SDK,这里介绍使用SDK的第一步,以后的篇幅将逐步解析SDK的各个方面。
#include "Era.h"  //包含SDK头文件
using namespace Era; //使用SDK命名空间
extern "C" __declspec(dllexport) BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID lpReserved)
{
  if (reason == DLL_PROCESS_ATTACH)
  {
    ConnectEra(); //调用函数ConnectEra();连接ERA平台
    //做你想做的事情
  }
  return TRUE;
};
       基本来说,简单的几步,就可以使用SDK的函数、结构体了。对于VB而言,导出angel.dll的ConnectEra函数后用同样的方法,也可以开始插件的开发了。必须说明的时,不使用SDK也可以开发出插件,SDK只是一个方便得函数接口,而并非必须的,这个视你需要实现的功能而定。

评分

2

查看全部评分

  • TA的每日心情
    慵懒
    2019-8-17 09:46
  • 签到天数: 1158 天

    连续签到: 2 天

    [LV.10]圣龙

    2万

    回帖

    91万

    金币

    7

    精华

    论坛嘉宾

    守望论坛的稻草人

    Rank: 9Rank: 9Rank: 9

    积分
    87641

    社区QQ达人论坛守望者金牌裁判杰出贡献魅力之星TE联赛冠军

    发表于 2013-7-16 23:01:58 | 显示全部楼层

    如果你的DLL无法被加载,我立马给你50000WOG币的精神损失费。

    真是捡来的娃儿当脚踩!

    评分

    1

    查看全部评分

    该用户从未签到

    138

    回帖

    14万

    金币

    1

    精华

    4级 Famous Hero

    Rank: 4

    积分
    1319

    杰出贡献TE联赛殿军

     楼主| 发表于 2013-7-16 23:02:05 | 显示全部楼层
    对了,如果不是提问的帖子,我希望大家不要无意义插楼,这个对不起了,这个帖子我会继续完善下去,为方便查阅,所以希望大家理解。上面我师傅的算了,谁让他是我师傅呢。
  • TA的每日心情
    开心
    2021-11-13 16:41
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]投石矮人

    228

    回帖

    9942

    金币

    0

    精华

    2级 Adventuring Hero

    Rank: 2

    积分
    318
    发表于 2013-7-16 23:22:03 | 显示全部楼层
    原帖由 梦魇骑士 于 2013-7-16 23:02 发表
    对了,如果不是提问的帖子,我希望大家不要无意义插楼,这个对不起了,这个帖子我会继续完善下去,为方便查阅,所以希望大家理解。上面我师傅的算了,谁让他是我师傅呢。
    你先写好,然后一直粘贴复制,这样就可以避免别人插楼了!
  • TA的每日心情
    开心
    2021-2-18 14:28
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]投石矮人

    2623

    回帖

    1万

    金币

    21

    精华

    论坛嘉宾

    请叫我黑椒哥哥

    Rank: 9Rank: 9Rank: 9

    积分
    4827

    论坛元老退役版主

    QQ
    发表于 2013-7-16 23:25:10 | 显示全部楼层
    VB可以,意思就是JAVA和C也可以了?
  • TA的每日心情
    郁闷
    2015-6-6 16:12
  • 签到天数: 52 天

    连续签到: 1 天

    [LV.5]女巫

    4949

    回帖

    3万

    金币

    35

    精华

    超级版主

    Rank: 11Rank: 11Rank: 11Rank: 11

    积分
    34677

    论坛守望者论坛元老杰出贡献

    发表于 2013-7-16 23:35:38 | 显示全部楼层
    当我渐渐淡泊的时候,梦魇你又来催化了
    拿vb来搞插件,我看我真受不了

    该用户从未签到

    138

    回帖

    14万

    金币

    1

    精华

    4级 Famous Hero

    Rank: 4

    积分
    1319

    杰出贡献TE联赛殿军

     楼主| 发表于 2013-7-17 09:42:27 | 显示全部楼层

    回复 论坛兴旺玩家受益 5# 的帖子

    只要你能做出dll,就可以了。
  • TA的每日心情
    郁闷
    2015-6-6 16:12
  • 签到天数: 52 天

    连续签到: 1 天

    [LV.5]女巫

    4949

    回帖

    3万

    金币

    35

    精华

    超级版主

    Rank: 11Rank: 11Rank: 11Rank: 11

    积分
    34677

    论坛守望者论坛元老杰出贡献

    发表于 2013-7-17 10:15:46 | 显示全部楼层

    回复 7# 的帖子

    话说做出DLL和做出与H3关联的DLL不是那么一码事.
    看来有空得试试,来验证一下梦魇的描述.

    该用户从未签到

    138

    回帖

    14万

    金币

    1

    精华

    4级 Famous Hero

    Rank: 4

    积分
    1319

    杰出贡献TE联赛殿军

     楼主| 发表于 2013-7-17 23:36:21 | 显示全部楼层

    ERA插件编写--插件操作ERM变量

    承接上面一部分,这部分讲如何使用ERM中的变量。在插件里面,我们怎么使用v变量、z变量呢?答案是直接操作他们所在的内存。听起来似乎不容易,事实上SDK已经把这些地址给出来并且复制给了C变量,请看era.h以下部分:

    1.   /* WoG vars */
    2.   int*      v = (int*)      0x887664; // 1..10000
    3.   TErmZVar* z = (TErmZVar*) 0x9271E8; // 1..1000
    4.   int*      y = (int*)      0xA48D7C; // 1..100
    5.   int*      x = (int*)      0x91DA34; // 1..16
    6.   bool*     f = (bool*)     0x91F2DF; // 1..1000
    7.   float*    e = (float*)    0xA48F14; // 1..100
    复制代码

    为了编程不混淆,SDK使用了和erm一样的变量名字,用数组来对应erm变量。譬如说,我们在erm中使用VRv2:S7;让v2变量指为2,对应的,在插件里直接使用v[2] = 7;可以达到同样的目的。同理有一下几个例子:

    1. VRz900:S^fack 007^;  -> strcpy(z[900], "fack 007");  //注意给z变量“赋值”要把字符串复制过去
    2. VRv100:S89; -> v[100] = 89;
    复制代码

    可见,通过SDK定义好的变量,可以方便的使用和修改各erm变量的值,这样,就可以达到插件和erm的“沟通”。
    ahome_bigavatar:guest
    ahome_bigavatar:welcomelogin
    您需要登录后才可以回帖 登录 | 英雄注册|Register

    本版积分规则

    捐赠
    关注我们,英3Mod一网打尽!

    WoG中文站 ( 辽B2-20210485-10 )|辽公网安备 21128202000228 号

    GMT+8, 2024-11-22 23:19 , Processed in 0.368975 second(s), 13 queries , Gzip On, File On.

    Powered by Discuz! X3.4

    Copyright © 2004-2022, Beijing Second Sight Technology Co., LTD.

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