1178 lines
25 KiB
C
1178 lines
25 KiB
C
#include <string.h>
|
|
#include "common.h"
|
|
#include "char_base.h"
|
|
#include "item.h"
|
|
#include "configfile.h"
|
|
#include "battle.h"
|
|
#include "mylua/base.h"
|
|
#include "version.h"
|
|
#include "lua.h"
|
|
#include "lauxlib.h"
|
|
#include "lualib.h"
|
|
#include "mylua/mylua.h"
|
|
#include "mylua/function.h"
|
|
#include "char.h"
|
|
|
|
|
|
#ifdef _ALLBLUES_LUA
|
|
extern MY_Lua MYLua;
|
|
|
|
//lua_State *M_Script_Lua = NULL; //实例句柄
|
|
|
|
lua_State *FindLua(char *filename)
|
|
{
|
|
MY_Lua *mylua = &MYLua;
|
|
char newfilename[256];
|
|
while(mylua->next != NULL){
|
|
if(strcmptail( mylua->luapath, ".allblues" ) == 0 ){
|
|
sprintf(newfilename, "%s.allblues", filename);
|
|
}else{
|
|
sprintf(newfilename, "%s", filename);
|
|
}
|
|
|
|
if(strcmp(newfilename, mylua->luapath) == 0){
|
|
return mylua->lua;
|
|
}
|
|
mylua = mylua->next;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
#ifdef _ALLBLUES_LUA_1_9
|
|
BOOL EquipEffectFunction( int charaindex, int id )
|
|
{
|
|
static lua_State *lua;
|
|
|
|
if (lua == NULL){
|
|
lua = FindLua("data/ablua/equipeffectfunction.lua");
|
|
if (lua == NULL)return TRUE;
|
|
}
|
|
|
|
lua_getglobal(lua, "EquipEffectFunction");
|
|
|
|
if (!lua_isfunction(lua, -1)) {
|
|
lua_pop(lua, 1);
|
|
return TRUE;
|
|
}
|
|
|
|
//依次放入二个参数
|
|
lua_pushnumber(lua,charaindex);
|
|
lua_pushnumber(lua,id);
|
|
|
|
if (lua_pcall(lua, 2, 1, 0) != 0)
|
|
error(lua, "error running function `f': %s", lua_tostring(lua, -1));
|
|
|
|
if (!lua_isnumber(lua, -1))
|
|
error(lua, "function `f' must return a number");
|
|
|
|
int ret = lua_tonumber(lua, -1);
|
|
lua_pop(lua, 1);
|
|
return ret;
|
|
}
|
|
|
|
BOOL WalkFunction( int charaindex )
|
|
{
|
|
MY_Lua *mylua = &MYLua;
|
|
while(mylua->lua != NULL){
|
|
lua_getglobal(mylua->lua, "WalkFunction");
|
|
|
|
if (!lua_isfunction(mylua->lua, -1)) {
|
|
lua_pop(mylua->lua, 1);
|
|
mylua = mylua->next;
|
|
continue;
|
|
}
|
|
|
|
lua_pushnumber(mylua->lua,charaindex);
|
|
|
|
if (lua_pcall(mylua->lua, 1, 1, 0) != 0)
|
|
error(mylua->lua, "error running function `f': %s", lua_tostring(mylua->lua, -1));
|
|
|
|
if (!lua_isnumber(mylua->lua, -1))
|
|
error(mylua->lua, "function `f' must return a number");
|
|
|
|
int ret = lua_tonumber(mylua->lua, -1);
|
|
lua_pop(mylua->lua, 1);
|
|
if(ret == TRUE){
|
|
return TRUE;
|
|
}
|
|
|
|
mylua = mylua->next;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
#ifdef _ITEM_OVER_LAP
|
|
BOOL ItemOverlapFunction( int charindex, int fromitemindex, int toitemindex )
|
|
{
|
|
MY_Lua *mylua = &MYLua;
|
|
while(mylua->lua != NULL){
|
|
lua_getglobal(mylua->lua, "ItemOverlapFunction");
|
|
|
|
if (!lua_isfunction(mylua->lua, -1)) {
|
|
lua_pop(mylua->lua, 1);
|
|
mylua = mylua->next;
|
|
continue;
|
|
}
|
|
//依次放入二个参数
|
|
lua_pushnumber(mylua->lua,charindex);
|
|
lua_pushnumber(mylua->lua,fromitemindex);
|
|
lua_pushnumber(mylua->lua,toitemindex);
|
|
|
|
lua_pcall(mylua->lua, 3, 1, 0);
|
|
|
|
lua_isnumber(mylua->lua, -1);
|
|
|
|
int ret = lua_tonumber(mylua->lua, -1);
|
|
lua_pop(mylua->lua, 1);
|
|
if(ret == 1){
|
|
mylua = mylua->next;
|
|
continue;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL ItemOverlapedFunction( int charindex, int fromitemindex, int fromid, int toitemindex, int toid)
|
|
{
|
|
MY_Lua *mylua = &MYLua;
|
|
while(mylua->lua != NULL){
|
|
lua_getglobal(mylua->lua, "ItemOverlapedFunction");
|
|
|
|
if (!lua_isfunction(mylua->lua, -1)) {
|
|
lua_pop(mylua->lua, 1);
|
|
mylua = mylua->next;
|
|
continue;
|
|
}
|
|
//依次放入二个参数
|
|
lua_pushnumber(mylua->lua,charindex);
|
|
lua_pushnumber(mylua->lua,fromitemindex);
|
|
lua_pushnumber(mylua->lua,fromid);
|
|
lua_pushnumber(mylua->lua,toitemindex);
|
|
lua_pushnumber(mylua->lua,toid);
|
|
|
|
docall(mylua->lua, 5, 1);
|
|
mylua = mylua->next;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
#endif
|
|
|
|
BOOL BattleFinishFunction( int charaindex, int battletime, int battleturn, int battletype )
|
|
{
|
|
static lua_State *lua;
|
|
|
|
if (lua == NULL){
|
|
lua = FindLua("data/ablua/battlefinishfunction.lua");
|
|
if (lua == NULL)return TRUE;
|
|
}
|
|
|
|
lua_getglobal(lua, "BattleFinishFunction");
|
|
|
|
if (!lua_isfunction(lua, -1)) {
|
|
lua_pop(lua, 1);
|
|
return TRUE;
|
|
}
|
|
|
|
//依次放入二个参数
|
|
lua_pushnumber(lua,charaindex);
|
|
lua_pushnumber(lua,battletime);
|
|
lua_pushnumber(lua,battleturn);
|
|
lua_pushnumber(lua,battletype);
|
|
|
|
docall(lua, 4, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL SetBattleEnmeyFunction(int meindex, int enemyindex, int id )
|
|
{
|
|
lua_State *lua = CHAR_getLUAFunction(meindex, CHAR_BATTLESETFUNC);
|
|
if ( lua == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
//依次放入二个参数
|
|
lua_pushnumber(lua, meindex);
|
|
lua_pushnumber(lua, enemyindex);
|
|
lua_pushnumber(lua, id);
|
|
docall(lua, 3, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef _ALLBLUES_LUA_1_8
|
|
BOOL CaptureOkFunction( int attackindex, int defindex )
|
|
{
|
|
MY_Lua *mylua = &MYLua;
|
|
while(mylua->lua != NULL){
|
|
lua_getglobal(mylua->lua, "CaptureOkFunction");
|
|
|
|
if (!lua_isfunction(mylua->lua, -1)) {
|
|
lua_pop(mylua->lua, 1);
|
|
mylua = mylua->next;
|
|
continue;
|
|
}
|
|
//依次放入二个参数
|
|
lua_pushnumber(mylua->lua,attackindex);
|
|
lua_pushnumber(mylua->lua,defindex);
|
|
|
|
docall(mylua->lua, 2, 1);
|
|
mylua = mylua->next;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CaptureCheckFunction( int attackindex, int defindex )
|
|
{
|
|
static lua_State *lua;
|
|
|
|
if (lua == NULL){
|
|
lua = FindLua("data/ablua/capturefunction.lua");
|
|
if (lua == NULL)return TRUE;
|
|
}
|
|
|
|
lua_getglobal(lua, "CaptureCheckFunction");
|
|
|
|
if (!lua_isfunction(lua, -1)) {
|
|
lua_pop(lua, 1);
|
|
return TRUE;
|
|
}
|
|
|
|
//依次放入二个参数
|
|
lua_pushnumber(lua,attackindex);
|
|
lua_pushnumber(lua,defindex);
|
|
|
|
if (lua_pcall(lua, 2, 1, 0) != 0)
|
|
error(lua, "error running function `f': %s", lua_tostring(lua, -1));
|
|
|
|
if (!lua_isnumber(lua, -1))
|
|
error(lua, "function `f' must return a number");
|
|
|
|
int ret = lua_tonumber(lua, -1);
|
|
lua_pop(lua, 1);
|
|
return ret;
|
|
}
|
|
#endif
|
|
|
|
#ifdef _ALLBLUES_LUA_1_7
|
|
BOOL CharVsEnemyFunction( int charaindex )
|
|
{
|
|
MY_Lua *mylua = &MYLua;
|
|
while(mylua->lua != NULL){
|
|
lua_getglobal(mylua->lua, "CharVsEnemyFunction");
|
|
|
|
if (!lua_isfunction(mylua->lua, -1)) {
|
|
lua_pop(mylua->lua, 1);
|
|
mylua = mylua->next;
|
|
continue;
|
|
}
|
|
|
|
lua_pushnumber(mylua->lua,charaindex);
|
|
|
|
if (lua_pcall(mylua->lua, 1, 1, 0) != 0)
|
|
error(mylua->lua, "error running function `f': %s", lua_tostring(mylua->lua, -1));
|
|
|
|
if (!lua_isnumber(mylua->lua, -1))
|
|
error(mylua->lua, "function `f' must return a number");
|
|
|
|
int ret = lua_tonumber(mylua->lua, -1);
|
|
lua_pop(mylua->lua, 1);
|
|
if(ret == TRUE){
|
|
return TRUE;
|
|
}
|
|
|
|
mylua = mylua->next;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
#endif
|
|
|
|
#ifdef _ALLBLUES_LUA_1_6
|
|
BOOL CharTalkFunction( int charaindex, char *message, int color )
|
|
{
|
|
static lua_State *lua;
|
|
|
|
if (lua == NULL){
|
|
lua = FindLua("data/ablua/chartalkfunction.lua");
|
|
if (lua == NULL)return FALSE;
|
|
}
|
|
|
|
lua_getglobal(lua, "CharTalkFunction");
|
|
|
|
if (!lua_isfunction(lua, -1)) {
|
|
lua_pop(lua, 1);
|
|
return FALSE;
|
|
}
|
|
|
|
//依次放入二个参数
|
|
lua_pushnumber(lua,charaindex);
|
|
lua_pushstring(lua,message);
|
|
lua_pushnumber(lua,color);
|
|
|
|
if (lua_pcall(lua, 3, 1, 0) != 0)
|
|
error(lua, "error running function `f': %s", lua_tostring(lua, -1));
|
|
|
|
if (!lua_isnumber(lua, -1))
|
|
error(lua, "function `f' must return a number");
|
|
|
|
int ret = lua_tonumber(lua, -1);
|
|
lua_pop(lua, 1);
|
|
return ret;
|
|
}
|
|
|
|
BOOL FamilyRideFunction( int meindex, int petindex, int petid )
|
|
{
|
|
static lua_State *lua;
|
|
|
|
if (lua == NULL){
|
|
lua = FindLua("data/ablua/familyridefunction.lua");
|
|
if (lua == NULL)return FALSE;
|
|
}
|
|
|
|
lua_getglobal(lua, "FamilyRideFunction");
|
|
|
|
if (!lua_isfunction(lua, -1)) {
|
|
lua_pop(lua, 1);
|
|
return FALSE;
|
|
}
|
|
|
|
//依次放入二个参数
|
|
lua_pushnumber(lua,meindex);
|
|
lua_pushnumber(lua,petindex);
|
|
lua_pushnumber(lua,petid);
|
|
|
|
if (lua_pcall(lua, 3, 1, 0) != 0)
|
|
error(lua, "error running function `f': %s", lua_tostring(lua, -1));
|
|
|
|
if (!lua_isnumber(lua, -1))
|
|
error(lua, "function `f' must return a number");
|
|
|
|
int ret = lua_tonumber(lua, -1);
|
|
lua_pop(lua, 1);
|
|
return ret;
|
|
}
|
|
#endif
|
|
|
|
#ifdef _ALLBLUES_LUA_1_5
|
|
BOOL NetLoopFunction( void )
|
|
{
|
|
MY_Lua *mylua = &MYLua;
|
|
while(mylua->lua != NULL){
|
|
lua_getglobal(mylua->lua, "NetLoopFunction");
|
|
|
|
if (!lua_isfunction(mylua->lua, -1)) {
|
|
lua_pop(mylua->lua, 1);
|
|
mylua = mylua->next;
|
|
continue;
|
|
}
|
|
docall(mylua->lua, 0, 1);
|
|
mylua = mylua->next;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL FreeCharCreate( int charaindex )
|
|
{
|
|
static lua_State *lua;
|
|
|
|
|
|
if (lua == NULL){
|
|
lua = FindLua("data/ablua/freecharcreate.lua");
|
|
if (lua == NULL)return FALSE;
|
|
}
|
|
|
|
lua_getglobal(lua, "FreeCharCreate");
|
|
|
|
if (!lua_isfunction(lua, -1)) {
|
|
lua_pop(lua, 1);
|
|
return FALSE;
|
|
}
|
|
//依次放入二个参数
|
|
lua_pushnumber(lua,charaindex);
|
|
|
|
docall(lua, 1, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL FreeCharLogin( int charaindex )
|
|
{
|
|
static lua_State *lua;
|
|
|
|
|
|
if (lua == NULL){
|
|
lua = FindLua("data/ablua/freecharlogin.lua");
|
|
if (lua == NULL)return FALSE;
|
|
}
|
|
|
|
lua_getglobal(lua, "FreeCharLogin");
|
|
|
|
if (!lua_isfunction(lua, -1)) {
|
|
lua_pop(lua, 1);
|
|
return FALSE;
|
|
}
|
|
//依次放入二个参数
|
|
lua_pushnumber(lua,charaindex);
|
|
|
|
docall(lua, 1, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL FreeVsPlayer( int charaindex, int toindex )
|
|
{
|
|
static lua_State *lua;
|
|
|
|
if (lua == NULL){
|
|
lua = FindLua("data/ablua/freevsplayer.lua");
|
|
if (lua == NULL)return FALSE;
|
|
}
|
|
|
|
lua_getglobal(lua, "FreeVsPlayer");
|
|
|
|
if (!lua_isfunction(lua, -1)) {
|
|
lua_pop(lua, 1);
|
|
return FALSE;
|
|
}
|
|
//依次放入二个参数
|
|
lua_pushnumber(lua,charaindex);
|
|
lua_pushnumber(lua,toindex);
|
|
|
|
if (lua_pcall(lua, 2, 1, 0) != 0)
|
|
error(lua, "error running function `f': %s", lua_tostring(lua, -1));
|
|
|
|
if (!lua_isnumber(lua, -1))
|
|
error(lua, "function `f' must return a number");
|
|
|
|
int ret = lua_tonumber(lua, -1);
|
|
lua_pop(lua, 1);
|
|
return ret;
|
|
}
|
|
|
|
BOOL FreePartyJoin( int charaindex, int toindex )
|
|
{
|
|
MY_Lua *mylua = &MYLua;
|
|
while(mylua->lua != NULL){
|
|
lua_getglobal(mylua->lua, "FreePartyJoin");
|
|
|
|
if (!lua_isfunction(mylua->lua, -1)) {
|
|
lua_pop(mylua->lua, 1);
|
|
mylua = mylua->next;
|
|
continue;
|
|
}
|
|
//依次放入二个参数
|
|
lua_pushnumber(mylua->lua,charaindex);
|
|
lua_pushnumber(mylua->lua,toindex);
|
|
|
|
if (lua_pcall(mylua->lua, 2, 1, 0) != 0)
|
|
error(mylua->lua, "error running function `f': %s", lua_tostring(mylua->lua, -1));
|
|
|
|
|
|
if (!lua_isnumber(mylua->lua, -1))
|
|
error(mylua->lua, "function `f' must return a number");
|
|
|
|
int ret = lua_tonumber(mylua->lua, -1);
|
|
lua_pop(mylua->lua, 1);
|
|
if(ret == FALSE){
|
|
return FALSE;
|
|
}
|
|
|
|
mylua = mylua->next;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
#endif
|
|
|
|
#ifdef _ALLBLUES_LUA_1_4
|
|
|
|
BOOL RunCharLogOutEvent( int charaindex)
|
|
{
|
|
lua_State *lua = CHAR_getLUAFunction(charaindex, CHAR_LOGINOUTFUNC);
|
|
if ( lua == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
//依次放入二个参数
|
|
lua_pushnumber(lua, charaindex);
|
|
|
|
docall(lua, 1, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL BattleFinish( int battleindex, int charaindex)
|
|
{
|
|
lua_State *lua = BATTLE_getLUAFunction(battleindex, BATTLE_FINISH);
|
|
if ( lua == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
//依次放入二个参数
|
|
lua_pushnumber(lua, charaindex);
|
|
|
|
docall(lua, 1, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL BattleEscape( int battleindex, int charaindex)
|
|
{
|
|
lua_State *lua = BATTLE_getLUAFunction(battleindex, BATTLE_ESCAPE);
|
|
if ( lua == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
//依次放入二个参数
|
|
lua_pushnumber(lua, charaindex);
|
|
|
|
docall(lua, 1, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
#endif
|
|
/*
|
|
#ifdef _OFFLINE_SYSTEM
|
|
BOOL OffLineCommand( int battleindex, int charaindex, int side)
|
|
{
|
|
static lua_State *lua;
|
|
|
|
if (lua == NULL){
|
|
lua = FindLua("data/ablua/offlinecommand.lua");
|
|
if (lua == NULL)return FALSE;
|
|
}
|
|
|
|
lua_getglobal(lua, "OffLineCommand");
|
|
|
|
if (!lua_isfunction(lua, -1)) {
|
|
lua_pop(lua, 1);
|
|
return TRUE;
|
|
}
|
|
//依次放入三个参数
|
|
lua_pushnumber(lua,battleindex);
|
|
lua_pushnumber(lua,charaindex);
|
|
lua_pushnumber(lua,side);
|
|
|
|
docall(lua, 3, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
#endif
|
|
*/
|
|
#ifdef _PETSKILL_SHOP_LUA
|
|
BOOL FreePetSkillShop( int talkerindex, int petindex, int oldSkillID, int newSkillID)
|
|
{
|
|
static lua_State *lua;
|
|
|
|
if (lua == NULL){
|
|
lua = FindLua("data/ablua/freepetskillshop.lua");
|
|
if (lua == NULL)return TRUE;
|
|
}
|
|
|
|
lua_getglobal(lua, "FreePetSkillShop");
|
|
|
|
if (!lua_isfunction(lua, -1)) {
|
|
return TRUE;
|
|
}
|
|
//依次放入三个参数
|
|
lua_pushnumber(lua,talkerindex);
|
|
lua_pushnumber(lua,petindex);
|
|
lua_pushnumber(lua,oldSkillID);
|
|
lua_pushnumber(lua,newSkillID);
|
|
|
|
if (lua_pcall(lua, 4, 1, 0) != 0)
|
|
error(lua, "error running function `f': %s", lua_tostring(lua, -1));
|
|
|
|
if (!lua_isnumber(lua, -1))
|
|
error(lua, "function `f' must return a number");
|
|
|
|
int ret = lua_tonumber(lua, -1);
|
|
lua_pop(lua, 1);
|
|
return ret;
|
|
}
|
|
#endif
|
|
|
|
#ifdef _ALLBLUES_LUA_1_2
|
|
BOOL RunUseChatMagic( int charaindex, char *data, lua_State *lua)
|
|
{
|
|
if(lua == NULL)return FALSE;
|
|
|
|
//依次放入二个参数
|
|
lua_pushnumber(lua, charaindex);
|
|
lua_pushstring(lua, data);
|
|
|
|
docall(lua, 2, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL RunItemUseEvent( int itemindex, int charaindex, int toindex, int haveitemindex )
|
|
{
|
|
lua_State *lua = ITEM_getLUAFunction(itemindex, ITEM_USEFUNC);
|
|
if ( lua == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
//依次放入四个参数
|
|
lua_pushnumber(lua, itemindex);
|
|
lua_pushnumber(lua, charaindex);
|
|
lua_pushnumber(lua, toindex);
|
|
lua_pushnumber(lua, haveitemindex);
|
|
|
|
docall(lua, 4, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL RunItemDieReLifeEvent( int charaindex, int itemindex, int haveitemindex )
|
|
{
|
|
lua_State *lua = ITEM_getLUAFunction(itemindex, ITEM_DIERELIFEFUNC);
|
|
if ( lua == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
//依次放入三个参数
|
|
lua_pushnumber(lua, charaindex);
|
|
lua_pushnumber(lua, itemindex);
|
|
lua_pushnumber(lua, haveitemindex);
|
|
|
|
docall(lua, 3, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL RunItemDetachEvent( int charaindex, int itemindex )
|
|
{
|
|
lua_State *lua = ITEM_getLUAFunction(itemindex, ITEM_DETACHFUNC);
|
|
if ( lua == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
//依次放入二个参数
|
|
lua_pushnumber(lua, charaindex);
|
|
lua_pushnumber(lua, itemindex);
|
|
|
|
docall(lua, 2, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL RunItemAttachEvent( int charaindex, int itemindex )
|
|
{
|
|
lua_State *lua = ITEM_getLUAFunction(itemindex, ITEM_ATTACHFUNC);
|
|
if ( lua == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
//依次放入二个参数
|
|
lua_pushnumber(lua, charaindex);
|
|
lua_pushnumber(lua, itemindex);
|
|
|
|
docall(lua, 2, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL RunItemPickupEvent( int charaindex, int itemindex )
|
|
{
|
|
lua_State *lua = ITEM_getLUAFunction(itemindex, ITEM_PICKUPFUNC);
|
|
if ( lua == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
//依次放入二个参数
|
|
lua_pushnumber(lua, charaindex);
|
|
lua_pushnumber(lua, itemindex);
|
|
|
|
docall(lua, 2, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL RunItemPostOverEvent( int itemindex, int charaindex )
|
|
{
|
|
lua_State *lua = ITEM_getLUAFunction(itemindex, ITEM_POSTOVERFUNC);
|
|
if ( lua == NULL) {
|
|
return FALSE;
|
|
}
|
|
//依次放入二个参数
|
|
lua_pushnumber(lua, charaindex);
|
|
lua_pushnumber(lua, itemindex);
|
|
|
|
docall(lua, 2, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL RunItemPreOverEvent( int itemindex, int charaindex )
|
|
{
|
|
lua_State *lua = ITEM_getLUAFunction(itemindex, ITEM_PREOVERFUNC);
|
|
if ( lua == NULL) {
|
|
return FALSE;
|
|
}
|
|
//依次放入二个参数
|
|
lua_pushnumber(lua, charaindex);
|
|
lua_pushnumber(lua, itemindex);
|
|
|
|
docall(lua, 2, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL RunItemDropEvent( int charaindex, int itemindex )
|
|
{
|
|
lua_State *lua = ITEM_getLUAFunction(itemindex, ITEM_DROPFUNC);
|
|
if ( lua == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
//依次放入二个参数
|
|
lua_pushnumber(lua, charaindex);
|
|
lua_pushnumber(lua, itemindex);
|
|
|
|
docall(lua, 2, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
BOOL RunCharTalkedEvent(int meindex, int toindex, char *messageeraseescape, int color, int channel)
|
|
{
|
|
lua_State *lua = CHAR_getLUAFunction(meindex, CHAR_TALKEDFUNC);
|
|
if ( lua == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
//依次放入五个参数
|
|
lua_pushnumber(lua,meindex);
|
|
lua_pushnumber(lua,toindex);
|
|
lua_pushstring(lua,messageeraseescape);
|
|
lua_pushnumber(lua,color);
|
|
lua_pushnumber(lua,channel);
|
|
|
|
docall(lua, 5, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL RunCharLoopEvent(int meindex)
|
|
{
|
|
lua_State *lua = CHAR_getLUAFunction(meindex, CHAR_LOOPFUNC);
|
|
if ( lua == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
//依次放入一个参数
|
|
lua_pushnumber(lua,meindex);
|
|
docall(lua, 1, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL RunCharOverlapEvent( int meindex, int toindex)
|
|
{
|
|
lua_State *lua = CHAR_getLUAFunction(meindex, CHAR_OVERLAPEDFUNC);
|
|
if ( lua == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
//依次放入二个参数
|
|
lua_pushnumber(lua, meindex);
|
|
lua_pushnumber(lua, toindex);
|
|
docall(lua, 2, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL RunCharBattleOverEvent( int meindex, int battleindex, int iswin)
|
|
{
|
|
lua_State *lua = CHAR_getLUAFunction(meindex, CHAR_BATTLEOVERDFUNC);
|
|
if ( lua == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
//依次放入三个参数
|
|
lua_pushnumber(lua, meindex);
|
|
lua_pushnumber(lua, battleindex);
|
|
lua_pushnumber(lua, iswin);
|
|
docall(lua, 3, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL RunCharWindowTalked( int meindex, int talkerindex, int seqno, int select, char *data)
|
|
{
|
|
lua_State *lua = CHAR_getLUAFunction(meindex, CHAR_WINDOWTALKEDFUNC);
|
|
if ( lua == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
//依次放入五个参数
|
|
lua_pushnumber(lua, meindex);
|
|
lua_pushnumber(lua, talkerindex);
|
|
lua_pushnumber(lua, seqno);
|
|
lua_pushnumber(lua, select);
|
|
lua_pushstring(lua, data);
|
|
|
|
docall(lua, 5, 1);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL fameButton( int index)
|
|
{
|
|
static lua_State *lua;
|
|
|
|
if (lua == NULL){
|
|
lua = FindLua("data/ablua/fameButton.lua");
|
|
if (lua == NULL)return FALSE;
|
|
}
|
|
|
|
lua_getglobal(lua, "fameButton");
|
|
|
|
if (!lua_isfunction(lua, -1)) {
|
|
lua_pop(lua, 1);
|
|
return FALSE;
|
|
}
|
|
//依次放入1个参数
|
|
lua_pushnumber(lua,index);
|
|
|
|
if (lua_pcall(lua, 1, 1, 0) != 0)
|
|
error(lua, "error running function `f': %s", lua_tostring(lua, -1));
|
|
|
|
BOOL ret = (BOOL)lua_toboolean(lua, -1);
|
|
lua_pop(lua, 1);
|
|
return ret;
|
|
|
|
}
|
|
|
|
#ifdef _ALLBLUES_LUA_2_0
|
|
|
|
BOOL FreeModeExp(int charaindex, int exp )
|
|
{
|
|
//printf("exp【1】 = %d \n",exp);
|
|
static lua_State *lua;
|
|
if (lua == NULL){
|
|
lua = FindLua("data/ablua/freemodeexp.lua");
|
|
if (lua == NULL)return FALSE;
|
|
}
|
|
lua_getglobal(lua, "FreeModeExp");
|
|
|
|
if (!lua_isfunction(lua, -1)) {
|
|
lua_pop(lua, 1);
|
|
return TRUE;
|
|
}
|
|
int TM_Ret = 0;
|
|
|
|
lua_pushnumber(lua,charaindex);
|
|
lua_pushinteger(lua, (lua_Integer)exp);
|
|
|
|
TM_Ret = lua_pcall(lua, 2, 0, 0);
|
|
if(TM_Ret != 0)
|
|
{
|
|
print("FreeCharExpSave Lua Err :%d(%s)\n", TM_Ret, lua_tostring(lua, -1));
|
|
lua_pop(lua, 1);
|
|
|
|
exp = &TM_Ret;
|
|
return exp;
|
|
|
|
}
|
|
}
|
|
|
|
/*
|
|
BOOL FreeModeExp(int charaindex,int* addexp, int getexp, int modexp )
|
|
{
|
|
static lua_State *lua;
|
|
if (lua == NULL){
|
|
lua = FindLua("data/ablua/freemodeexp.lua");
|
|
if (lua == NULL)return FALSE;
|
|
}
|
|
|
|
lua_getglobal(lua, "FreeModeExp");
|
|
|
|
if (!lua_isfunction(lua, -1)) {
|
|
lua_pop(lua, 1);
|
|
return TRUE;
|
|
}
|
|
lua_pushnumber(lua,charaindex);
|
|
lua_pushnumber(lua,getexp);
|
|
lua_pushnumber(lua,modexp);
|
|
|
|
if (lua_pcall(lua, 3, 1, 0) != 0)
|
|
error(lua, "error running function `f': %s", lua_tostring(lua, -1));
|
|
|
|
if (!lua_isnumber(lua, -1))
|
|
error(lua, "function `f' must return a number");
|
|
|
|
int ret = -1;
|
|
ret = lua_tonumber(lua, -1);
|
|
|
|
lua_pop(lua, 1);
|
|
if(ret == -1 || ret == 0 ) return FALSE;
|
|
else{
|
|
addexp = &ret;
|
|
return TRUE;
|
|
}
|
|
}
|
|
*/
|
|
/*BOOL FreeLoginCheck(int fd)
|
|
{
|
|
static lua_State *lua;
|
|
if (lua == NULL){
|
|
lua = FindLua("data/ablua/freelogincheck.lua");
|
|
if (lua == NULL)return FALSE;
|
|
}
|
|
|
|
lua_getglobal(lua, "FreeLoginCheck");
|
|
|
|
if (!lua_isfunction(lua, -1)) {
|
|
lua_pop(lua, 1);
|
|
return FALSE;
|
|
}
|
|
lua_pushnumber(lua,fd);
|
|
|
|
if (lua_pcall(lua, 1, 1, 0) != 0)
|
|
error(lua, "error running function `f': %s", lua_tostring(lua, -1));
|
|
|
|
BOOL ret = (BOOL)lua_toboolean(lua, -1);
|
|
lua_pop(lua, 1);
|
|
return ret;
|
|
}
|
|
*/
|
|
|
|
#ifdef _CAX_ESC_REPORT
|
|
void report1( int charaindex ){
|
|
int fd,itemindex,emptyitemindexinchara,count,countReport = 0,i;
|
|
char token[256];
|
|
if( (fd = getfdFromCharaIndex( charaindex)) == -1 ) return;
|
|
if(CHAR_getInt(charaindex,CHAR_TRANSMIGRATION) < getReportTa() ||
|
|
(CHAR_getInt(charaindex,CHAR_TRANSMIGRATION) >= getReportTa() && CHAR_getInt(charaindex,CHAR_LV) < getReportLv())){
|
|
sprintf( token, "\n\n\n 每日签到只针对于%d转%d级以上的玩家开放。", getReportTa(),getReportLv());
|
|
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,WINDOW_BUTTONTYPE_OK,-1,-1,token);
|
|
return;
|
|
}
|
|
//判断是否签到
|
|
int day;
|
|
time_t t;
|
|
struct tm *local;
|
|
t=time(NULL);
|
|
local=localtime(&t);
|
|
day = (local->tm_year+1900) * 10000 + (local->tm_mon+1) * 100 + local->tm_mday;
|
|
if(CHAR_getInt(charaindex,CHAR_REPORT) == day){//已经签到
|
|
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,WINDOW_BUTTONTYPE_OK,-1,-1,"\n\n\n 你今天已经签到过了,请明天再来。");
|
|
return;
|
|
}
|
|
|
|
//========普通玩家签到=========
|
|
if(CHAR_getInt( charaindex , CHAR_VIPRIDE)== 0){
|
|
//获得玩家背包空格数
|
|
count = CHAR_findSurplusItemBox( charaindex );
|
|
//获得赠送物品数
|
|
for (i = 0; i < 10; i++) {
|
|
if(getReportItem(i) !=-1){
|
|
countReport++;
|
|
}
|
|
}
|
|
if(count < countReport){
|
|
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,WINDOW_BUTTONTYPE_OK,-1,-1,"\n\n\n 空间栏位不足。");
|
|
return;
|
|
}
|
|
for (i = 0; i < 10; i++) {
|
|
if(getReportItem(i) !=-1){
|
|
#ifdef _ITEM_UP
|
|
itemindex = ITEM_makeItemAndRegist( getReportItem(i) , charaindex);//获取一个道具索引
|
|
#else
|
|
itemindex = ITEM_makeItemAndRegist( getReportItem(i) );//获取一个道具索引
|
|
#endif
|
|
if( itemindex != -1 ){
|
|
emptyitemindexinchara = CHAR_findEmptyItemBox( charaindex );//获取背包空间
|
|
if( emptyitemindexinchara < 0 ){
|
|
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,WINDOW_BUTTONTYPE_OK,-1,-1,"\n\n\n 空间栏位不足。");
|
|
return;
|
|
}
|
|
CHAR_setItemIndex(charaindex, emptyitemindexinchara, itemindex );
|
|
ITEM_setWorkInt(itemindex, ITEM_WORKOBJINDEX,-1);
|
|
ITEM_setWorkInt(itemindex, ITEM_WORKCHARAINDEX,charaindex);
|
|
CHAR_sendItemDataOne( charaindex, emptyitemindexinchara);
|
|
sprintf( token, "获得%s。", ITEM_getChar( itemindex, ITEM_NAME));
|
|
CHAR_talkToCli( charaindex, -1, token, CHAR_COLORYELLOW);
|
|
CHAR_setInt(charaindex,CHAR_REPORT,day);
|
|
}
|
|
}
|
|
}
|
|
}else{
|
|
//========VIP玩家签到=========
|
|
//获得玩家背包空格数
|
|
count = CHAR_findSurplusItemBox( charaindex );
|
|
//获得赠送物品数
|
|
for (i = 0; i < 10; i++) {
|
|
if(getVipReportItem(i) !=-1){
|
|
countReport++;
|
|
}
|
|
}
|
|
if(count < countReport){
|
|
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,WINDOW_BUTTONTYPE_OK,-1,-1,"\n\n\n 空间栏位不足。");
|
|
return;
|
|
}
|
|
for (i = 0; i < 10; i++) {
|
|
if(getVipReportItem(i) !=-1){
|
|
#ifdef _ITEM_UP
|
|
itemindex = ITEM_makeItemAndRegist( getVipReportItem(i) , charaindex );//获取一个道具索引
|
|
#else
|
|
itemindex = ITEM_makeItemAndRegist( getVipReportItem(i) );//获取一个道具索引
|
|
#endif
|
|
if( itemindex != -1 ){
|
|
emptyitemindexinchara = CHAR_findEmptyItemBox( charaindex );//获取背包空间
|
|
if( emptyitemindexinchara < 0 ){
|
|
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,WINDOW_BUTTONTYPE_OK,-1,-1,"\n\n\n 空间栏位不足。");
|
|
return;
|
|
}
|
|
CHAR_setItemIndex(charaindex, emptyitemindexinchara, itemindex );
|
|
ITEM_setWorkInt(itemindex, ITEM_WORKOBJINDEX,-1);
|
|
ITEM_setWorkInt(itemindex, ITEM_WORKCHARAINDEX,charaindex);
|
|
CHAR_sendItemDataOne( charaindex, emptyitemindexinchara);
|
|
sprintf( token, "拿到%s。", ITEM_getChar( itemindex, ITEM_NAME));
|
|
CHAR_talkToCli( charaindex, -1, token, CHAR_COLORYELLOW);
|
|
CHAR_setInt(charaindex,CHAR_REPORT,day);
|
|
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,WINDOW_BUTTONTYPE_OK,-1,-1,"\n\n\n 签到成功,欢迎你明天再来签到。");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
CHAR_charSaveFromConnect(fd,FALSE);
|
|
}
|
|
#endif
|
|
|
|
#ifdef _CAX_ESC_SAVE_DATA
|
|
void SaveData(int charaindex){
|
|
int fd;
|
|
if( (fd = getfdFromCharaIndex( charaindex)) == -1 ) return;
|
|
//int ownerindex = CHAR_getWorkInt(petindex, CHAR_WORKPLAYERINDEX);
|
|
CHAR_charSaveFromConnect(charaindex,FALSE);
|
|
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,WINDOW_BUTTONTYPE_OK,-1,-1,"\n\n自动存档成功。");
|
|
}
|
|
#endif
|
|
|
|
BOOL FreeSamenu(int* function,int id, int charaindex )
|
|
{
|
|
static lua_State *lua;
|
|
|
|
if (lua == NULL){
|
|
lua = FindLua("data/ablua/freesamenu.lua");
|
|
if (lua == NULL)return TRUE;
|
|
}
|
|
|
|
lua_getglobal(lua, "ESC_Recv");
|
|
|
|
if (!lua_isfunction(lua, -1)) {
|
|
lua_pop(lua, 1);
|
|
return TRUE;
|
|
}
|
|
int TM_Ret = 0;
|
|
#ifdef _CAX_ESC_REPORT
|
|
if ( id == 6){
|
|
report1(charaindex);
|
|
//CHAR_talkToCli(charaindex,-1,"测试是否可以内部执行",CHAR_COLORRED);
|
|
return;
|
|
}
|
|
#endif
|
|
#ifdef _CAX_ESC_SAVE_DATA
|
|
if ( id == 7){
|
|
SaveData(charaindex);
|
|
//CHAR_talkToCli(charaindex,-1,"测试是否可以内部执行",CHAR_COLORRED);
|
|
return;
|
|
}
|
|
#endif
|
|
//依次放入二个参数
|
|
//lua_pushstring(lua,message);
|
|
lua_getglobal(lua, (const char*)function);
|
|
lua_pushinteger(lua, (lua_Integer)id);
|
|
lua_pushnumber(lua,charaindex);
|
|
TM_Ret = lua_pcall(lua, 2, 0, 0);
|
|
if(TM_Ret != 0)
|
|
{
|
|
print("NPC_Lua_ESC_Recv Lua Err :%d(%s)\n", TM_Ret, lua_tostring(lua, -1));
|
|
lua_pop(lua, 1);
|
|
return;
|
|
}
|
|
}
|
|
/*
|
|
BOOL TeacherButton(int* function,int charaindex )
|
|
{
|
|
static lua_State *lua;
|
|
|
|
if (lua == NULL){
|
|
lua = FindLua("data/ablua/TeacherButton.lua");
|
|
if (lua == NULL)return TRUE;
|
|
}
|
|
|
|
lua_getglobal(lua, "TeacherButton");
|
|
|
|
if (!lua_isfunction(lua, -1)) {
|
|
lua_pop(lua, 1);
|
|
return TRUE;
|
|
}
|
|
int TM_Ret = 0;
|
|
//依次放入二个参数
|
|
//lua_pushstring(lua,message);
|
|
lua_getglobal(lua, (const char*)function);
|
|
lua_pushinteger(lua, (lua_Integer)charaindex);
|
|
TM_Ret = lua_pcall(lua, 1, 0, 0);
|
|
if(TM_Ret != 0)
|
|
{
|
|
print("TeacherButton Lua Err :%d(%s)\n", TM_Ret, lua_tostring(lua, -1));
|
|
lua_pop(lua, 1);
|
|
return;
|
|
}
|
|
}
|
|
|
|
*/
|
|
|
|
BOOL FreeCharExpSave(int charaindex, int exp )
|
|
{
|
|
//printf("exp【1】 = %d \n",exp);
|
|
static lua_State *lua;
|
|
if (lua == NULL){
|
|
lua = FindLua("data/ablua/freecharexpsave.lua");
|
|
if (lua == NULL)return FALSE;
|
|
}
|
|
lua_getglobal(lua, "FreeCharExpSave");
|
|
|
|
if (!lua_isfunction(lua, -1)) {
|
|
lua_pop(lua, 1);
|
|
return TRUE;
|
|
}
|
|
int TM_Ret = 0;
|
|
|
|
lua_pushnumber(lua,charaindex);
|
|
lua_pushinteger(lua, (lua_Integer)exp);
|
|
|
|
TM_Ret = lua_pcall(lua, 2, 0, 0);
|
|
if(TM_Ret != 0)
|
|
{
|
|
print("FreeCharExpSave Lua Err :%d(%s)\n", TM_Ret, lua_tostring(lua, -1));
|
|
lua_pop(lua, 1);
|
|
return;
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|