2008年4月21日 星期一

[T007] 修正eyes錯誤

不知道為什麼這一系列的都出現了這樣的錯誤,令人不解

這邊只舉一個地方來做修改,如果有遇到相關的錯誤,可以自行運用 :)

(略) plasticsurgery.cpp(135) : warning C4700: 使用了未初始化的區域變數 'eyes'

原始程式碼:

void NPCsScripts::npc_1052005(NPC* npc){
int eyes[] = {20000, 20001, 20002, 20003, 20004, 20006, 20007, 20008, 20012, 20013};
int state = npc->getState();
if(state == 0){
npc->addText("If you use the regular coupon, your face may transform into a random new look. ");
npc->addText("Do you still want to use the #bHenesys Face Coupon (REG)#k?");
npc->sendYesNo();
}
if(state == 1){
if(npc->getSelected() == YES){
if(npc->getItemNum(5152000) >= 1){
npc->giveItem(5152000, -1);
int random = rand()% 10 + 1;
if(random == 1){
npc->setStyle(eyes[20000]);} <---135行
if(random == 2){
npc->setStyle(eyes[20001]);}
if(random == 3){
npc->setStyle(eyes[20002]);}
if(random == 4){
npc->setStyle(eyes[20003]);}
if(random == 5){
npc->setStyle(eyes[20004]);}
if(random == 6){
npc->setStyle(eyes[20006]);}
if(random == 7){
npc->setStyle(eyes[20007]);}
if(random == 8){
npc->setStyle(eyes[20008]);}
if(random == 9){
npc->setStyle(eyes[20012]);}
if(random == 10){
npc->setStyle(eyes[20013]);}
npc->end();
}
else{
npc->addText("Hmm ... it looks like you don't have the coupon specifically for this place...sorry to say this, but without the coupon, there's no plastic surgery for you.");
npc->sendNext();
npc->end();
}
}



顧名思義,問題出在eyes[]這個地方,所以我們稍加修改


3>
void NPCsScripts::npc_1052005(NPC* npc){
int eyes[] = {20000, 20001, 20002, 20003, 20004, 20006, 20007, 20008, 20012, 20013};
int state = npc->getState();
if(state == 0){
npc->addText("If you use the regular coupon, your face may transform into a random new look. ");
npc->addText("Do you still want to use the #bHenesys Face Coupon (REG)#k?");
npc->sendYesNo();
}
if(state == 1){
if(npc->getSelected() == YES){
if(npc->getItemNum(5152000) >= 1){
npc->giveItem(5152000, -1);
int random = rand()% 10 + 1;
if(random == 1){
npc->setStyle(eyes[0]);}
if(random == 2){
npc->setStyle(eyes[1]);}
if(random == 3){
npc->setStyle(eyes[2]);}
if(random == 4){
npc->setStyle(eyes[3]);}
if(random == 5){
npc->setStyle(eyes[4]);}
if(random == 6){
npc->setStyle(eyes[5]);}
if(random == 7){
npc->setStyle(eyes[6]);}
if(random == 8){
npc->setStyle(eyes[7]);}
if(random == 9){
npc->setStyle(eyes[8]);}
if(random == 10){
npc->setStyle(eyes[9]);}
npc->end();
}

else{
npc->addText("Hmm ... it looks like you don't have the coupon specifically for this place...sorry to say this, but without the coupon, there's no plastic surgery for you.");
npc->sendNext();
npc->end();
}
}


看出來了嗎?

由於我們宣告的時候是 int eyes[] = {20000, 20001, 20002, 20003, 20004, 20006, 20007, 20008, 20012, 20013};

所以使用的時候應該針對每個位置 eyes[0] (代表20000),eyes[1] (代表(20001)....依此類推

而不是使用 eyes[20000],eyes[20001] ,這樣他會去尋找eyes的第20000個..當然會出現錯誤囉!

如果還有遇到類似的相關問題,可以自己修改囉!

[T007] 修正變換髮型造成當機的錯誤

針對[T007] 讓倉庫管理員變成造型師 這篇作修正的!

原本的code裡面不小心寫到不存在的"髮型",所以當你選到那個地方的時候,就會造成錯誤囉!
只要把下面紅色的地方修正即可!


// add by squall 2008-08-04-14
void NPCsScripts::npc_1002005(NPC* npc){
int state = npc->getState();
int skins[] = {0, 1, 2, 3, 4};
int hairs[] = {31000, 31010, 31020, 31030, 31040, 31050, 31060, 31070, 31080, 31090, 31100, 31110, 31120, 31130, 31140, 31150, 31160, 31170, 31180, 31190, 31200, 31210, 31220, 31230, 31240, 31250, 31260, 31270, 31280, 31290, 31300, 31310, 31320, 31330, 31340, 31350, 31400, 31410, 31420, 31430, 31440, 31450, 31460, 31470, 31480, 31490, 31510, 31520, 31530, 31540, 31550, 31560, 31570, 31580, 31590, 31600, 31610, 31620, 31630, 31640, 31650, 31680, 31690, 31700, 31710, 31720, 31730};
int hairscolor[] = {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8};

int eyes[] = {21000, 21001, 21002, 21003, 21004, 21005, 21006, 21007, 21008, 21009, 21010, 21011, 21012, 21013, 21014, 21016, 21017, 21018, 21019, 21020, 21022};
if(state == 0){
npc->addText("#L0#變換膚色#l\r\n#L1#變換髮型#l\r\n#L2#變換髮型顏色#l\r\n#L3#變換眼睛#l\r\n#L4#變換眼睛顏色#l");
npc->sendSimple();
}
else if(state == 1){
int type = npc->getSelected();
npc->setVariable("type", type);
if(type == 0){
npc->sendStyle(skins, 5);
}
else if(type == 1){
npc->sendStyle(hairs, 67);
}
else if(type == 2){
int cur = npc->getPlayerHair()/10*10;
int colors[] = {cur, cur+1, cur+2, cur+3, cur+4, cur+5, cur+6, cur+7};
npc->sendStyle(colors, hairscolor[npc->getPlayerHair()%1000/10]);
}
else if(type == 3){
npc->sendStyle(eyes, 21);
}
else if(type == 4){
int cur = npc->getPlayerEyes()%100+20000;
int colors[] = {cur, cur+100, cur+200, cur+300, cur+400, cur+500, cur+600, cur+700};
npc->sendStyle(colors, 8);
}
else{
npc->end();
}
}
else if(state == 2){
npc->end();
int type = npc->getVariable("type");
if(type == 0){
npc->setStyle(skins[npc->getSelected()]);
}
else if(type == 1){
npc->setStyle(hairs[npc->getSelected()]);
}
else if(type == 2){
npc->setStyle(npc->getPlayerHair()/10*10 + npc->getSelected());
}
else if(type == 3){
npc->setStyle(eyes[npc->getSelected()]);
}
else if(type == 4){
npc->setStyle(20000+npc->getPlayerEyes()%100 + npc->getSelected()*100);
}
else
npc->setStyle(eyes[npc->getSelected()]);
}

}

2008年4月17日 星期四

如何自己新增NPC

Step 1. 首先要建立一個新的CPP-> cody.cpp

Step 2.在cody.cpp中,我們首先要插入下列這段程式碼

#include "NPCs.h"
#include "NPCsScripts.h"


3.我們接下來要著手比較困難的部分,我們必須在NPCsScripts中宣告一個void的function,如下

void NPCsScripts::npc_2100(NPC* npc){

}



現在也許你會擔心,我該如何取得npc_2100這代碼呢?
非常簡單,你可以到這網站尋找所有的NPC代碼

Step 4. 我們必須宣告state及map
state-> Current State
map-> Game map..

所以我們必須在下列這段程式碼這裡面

void NPCsScripts::npc_2100(NPC* npc){

}


新增這段程式碼

int state = npc->getState();
int map = npc->getPlayerMap();



所以看起來會像

void NPCsScripts::npc_2100(NPC* npc){
int state = npc->getState();
int map = npc->getPlayerMap();
}


Step5. 現在我們需要在我們的地圖上新增檢查

這段程式碼之後

int state = npc->getState();
int map = npc->getPlayerMap();


新增這段

if(npc->getPlayerMap() == 100000000){

}


也許你不知道地圖的代碼,所以可以到這查詢地圖代碼

Step6. 這裡可能會讓你造成困惑,但是在後面我會有更詳細的介紹,state[0]代表開始對話,state[1]代表選擇[是/否] (記住這邊只是範例而已!! 詳細的用法需要到程式碼中查詢)
接下來我們在

if(npc->getPlayerMap() == 100000000){

}

裡面新增

if(state == 0){

}


所以我們現在的程式碼看起來會像

void NPCsScripts::npc_2100(NPC* npc){
int state = npc->getState();
int map = npc->getPlayerMap();
if(npc->getPlayerMap() == 100000000){
if(state == 0){

}
}


這樣我們就完成啦!!

接下來我們只需要設定何時使用這個NPC就好了,接下來是實際新增NPC的例子


#include "NPCs.h"
#include "NPCsScripts.h"

void NPCsScripts::npc_2100(NPC* npc){
int state = npc->getState();
int map = npc->getPlayerMap();
if(npc->getPlayerMap() == 100000000){
if(state == 0){

npc->addText("");//Send Text For Cody To Output
npc->sendNext();//Just think of this to enable you to Click "next" button for continuing....
npc->addText("Good Bye");
npc->sendOK();//Think of this to Enable click "ok" before continuing...
npc->end();//You should know what this is.....Quit Talking to NPC...?

}
}


現在讓我們把NPC ID換成9200000


void NPCsScripts::npc_2100(NPC* npc)


換成

void NPCsScripts::npc_9200000(NPC* npc)


接著開啟NPCsScripts.h,你應該可以看到下列這兩段程式碼


switch(npcid){
case 2100: npc_2100(npc); break;
case 2101: npc_2101(npc); break;
case 2020005: npc_2020005(npc); break;
case 9101001: npc_9101001(npc); break;
case 9900000: npc_9900000(npc); break;
default: npc->end(); break;
}



private:
static void npc_2100(NPC* npc);
static void npc_2101(NPC* npc);
static void npc_2020005(NPC* npc);
static void npc_9101001(NPC* npc);
static void npc_9900000(NPC* npc);


將下列兩個程式碼加進去即可

static void npc_9200000(NPC* npc);



case 9900000: npc_9200000(npc); break;


這樣就完成啦! 非常簡單吧~ 只是過程瑣碎XD

底下是npc的一些指令


npc->addChar(char cha);
npc->addQuest(int QuestID);
npc->addText(char string);
npc->cend();
npc->end();
npc->endQuest();
npc->getItemNum(int itemid);
npc->getMesos();
npc->getNpcID();
npc->getnum();
npc->getNumber();
npc->getPlayer();
npc->getPlayerEyes();
npc->getPlayerHP();
npc->getPlayerMap();
npc->getSelected();
npc->getState();
npc->getState();
npc->getText();
npc->gettext();
npc->getVariable(char *name);
npc->giveEXP(int exp);
npc->giveItem(int itemid,short amount);
npc->giveMesos(int amount);
npc->isEnd();//bool
npc->isQuest();//bool
npc->isquest();
npc->isStart();//bool
npc->isstart();
npc->npcid();
npc->npcPacket(char type);
npc->player();//More to come....
npc->selected();
npc->sendAcceptDecline();
npc->sendBackNext();
npc->sendOK();
npc->sendBackOK();
npc->sendGetNumber(int def,int min,int max);
npc->sendGetText();
npc->sendOK();
npc->sendNext();
npc->sendSimple();
npc->sendStyle();
npc->sendYesNo();
npc->setGetNumber(int num);
npc->setGetText(char *text);
npc->setIsStart(bool what);
npc->setPlayerHP(short hp);
npc->setSelected(int selected);
npc->setState(int state);
npc->setStyle(int id);
npc->setVariable(char *name,int val);
npc->showShop();
npc->state();
npc->teleport(int mapid);
npc->text();
npc->vars();
npc->~NPC();


原文網址:http://forum.ragezone.com/f428/guide-scripting-your-npc-381658/

[T007] 修正使用四轉技能無法登入的問題

方法1 跟 方法2 的結果是一樣的! 所以請選擇其中一種方法就可以囉!! ^^

方法 1. 請開啟你的PlayerPacket.cpp,並將下面程式碼全部取代
#include "PlayerPacket.h"
#include "PacketCreator.h"
#include "Player.h"
#include "Inventory.h"
#include "Skills.h"
#include "SkillsPacket.h" //for 4th job skills error 38 fix

void PlayerPacket::connectData(Player* player){
Packet packet = Packet();
packet.addHeader(0x4D);
packet.addInt(0); // Channel
packet.addBytes("0101853D4B11F4836B3DBA9A4FA1");
packet.addShort(-1);
packet.addInt(player->getPlayerid());
packet.addString(player->getName(), 12);
packet.addByte(0);
packet.addByte(player->getGender());
packet.addByte(player->getSkin());
packet.addInt(player->getEyes());
packet.addInt(player->getHair());
packet.addInt(0);
packet.addInt(0);
packet.addByte(player->getLevel());
packet.addShort(player->getJob());
packet.addShort(player->getStr());
packet.addShort(player->getDex());
packet.addShort(player->getInt());
packet.addShort(player->getLuk());
packet.addShort(player->getHP());
packet.addShort(player->getMHP());
packet.addShort(player->getMP());
packet.addShort(player->getMMP());
packet.addShort(player->getAp());
packet.addShort(player->getSp());
packet.addInt(player->getExp());
packet.addShort(player->getFame());
packet.addInt(player->getMap());
packet.addByte(player->getMappos());
packet.addByte(0x14);
packet.addInt(player->inv->getMesos());
packet.addByte(100);
packet.addByte(100);
packet.addByte(100);
packet.addByte(100);
packet.addByte(100);
for(int i=0; iinv->getEquipNum(); i++){
Equip* equip = player->inv->getEquip(i);
if(equip->pos<0){>type);
packet.addByte(1);
packet.addInt(equip->id);
packet.addShort(0);
packet.addBytes("8005BB46E61702");
packet.addShort(equip->slots); // slots
packet.addShort(equip->istr); // STR
packet.addShort(equip->idex); // DEX
packet.addShort(equip->iint); // INT
packet.addShort(equip->iluk); // LUK
packet.addShort(equip->ihp); // HP
packet.addShort(equip->imp); // MP
packet.addShort(equip->iwatk); // W.Atk
packet.addShort(equip->imatk); // M.Atk
packet.addShort(equip->iwdef); // W.def
packet.addShort(equip->imdef); // M.Def
packet.addShort(equip->iacc); // Acc
packet.addShort(equip->iavo); // Avo
packet.addShort(equip->ihand); // Hands
packet.addShort(equip->ispeed); // Speed
packet.addShort(equip->ijump); // Jump
packet.addShort(0);
packet.addShort(0);
packet.addShort(0);
packet.addShort(0);
packet.addShort(0);
packet.addShort(0);
}
}
packet.addShort(0);
for(int i=0; iinv->getEquipNum(); i++){
Equip* equip = player->inv->getEquip(i);
if(equip->pos>0){
packet.addByte((char)equip->pos);
packet.addByte(1);
packet.addInt(equip->id);
packet.addShort(0);
packet.addBytes("8005BB46E61702");
packet.addShort(equip->slots); // slots
packet.addShort(equip->istr); // STR
packet.addShort(equip->idex); // DEX
packet.addShort(equip->iint); // INT
packet.addShort(equip->iluk); // LUK
packet.addShort(equip->ihp); // HP
packet.addShort(equip->imp); // MP
packet.addShort(equip->iwatk); // W.Atk
packet.addShort(equip->imatk); // M.Atk
packet.addShort(equip->iwdef); // W.def
packet.addShort(equip->imdef); // M.Def
packet.addShort(equip->iacc); // Acc
packet.addShort(equip->iavo); // Avo
packet.addShort(equip->ihand); // Hands
packet.addShort(equip->ispeed); // Speed
packet.addShort(equip->ijump); // Jump
packet.addShort(0);
packet.addShort(0);
packet.addShort(0);
packet.addShort(0);
packet.addShort(0);
packet.addShort(0);
}
}
packet.addByte(0);
for(int j=2; j<=5; j++){ for(int i=0; iinv->getItemNum(); i++){
Item* item = player->inv->getItem(i);
if(item->inv == j){
packet.addByte((char)item->pos);
packet.addByte(2);
packet.addInt(item->id);
packet.addShort(0);
packet.addBytes("8005BB46E61702");
packet.addShort(item->amount); // slots
packet.addInt(0);
if(ISSTAR(item->id)){
packet.addInt(2);
packet.addShort(0x54);
packet.addByte(0);
packet.addByte(0x34);
}
}
}
packet.addByte(0);

}
packet.addShort(0); //Skills
packet.addInt(0);
packet.addInt(0);
packet.addInt(0);
packet.addShort(0);
for(int i=0; i<15; i="0;">skills->getSkillsNum(); i++){
SkillsPacket::addSkill(player, player->skills->getSkillID(i), player->skills->getSkillLevel(player->skills->getSkillID(i)));
}
}

void PlayerPacket::newHP(Player* player, short hp){
Packet packet = Packet();
packet.addHeader(0x23);
packet.addByte(0);
packet.addShort(0);
packet.addShort(4);
packet.addByte(0);
packet.addShort(hp);
packet.packetSend(player);
}

void PlayerPacket::newMP(Player* player, short mp, bool is){
Packet packet = Packet();
packet.addHeader(0x23);
packet.addByte(is);
packet.addShort(0);
packet.addShort(0x10);
packet.addByte(0);
packet.addShort(mp);
packet.packetSend(player);
}

void PlayerPacket::newEXP(Player* player, int exp){
Packet packet = Packet();
packet.addHeader(0x23);
packet.addShort(0);
packet.addShort(0);
packet.addShort(1);
packet.addInt(exp);
packet.packetSend(player);
}


void PlayerPacket::showKeys(Player* player, int keys[90]){
Packet packet = Packet();
packet.addHeader(0xf6);
packet.addByte(0);
for(int i=0; i<90; packet =" Packet();">getSp());
packet.packetSend(player);
}

void PlayerPacket::setJob(Player* player){
Packet packet = Packet();
packet.addHeader(0x23);
packet.addShort(0);
packet.addInt(0x20);
packet.addShort(player->getJob());
packet.packetSend(player);
}

void PlayerPacket::newHair(Player* player){
Packet packet = Packet();
packet.addHeader(0x23);
packet.addShort(0);
packet.addInt(0x4);
packet.addInt(player->getHair());
packet.packetSend(player);
}

void PlayerPacket::newEyes(Player* player){
Packet packet = Packet();
packet.addHeader(0x23);
packet.addShort(0);
packet.addInt(0x2);
packet.addInt(player->getEyes());
packet.packetSend(player);
}

void PlayerPacket::newSkin(Player* player){
Packet packet = Packet();
packet.addHeader(0x23);
packet.addShort(0);
packet.addInt(0x1);
packet.addByte(player->getSkin());
packet.packetSend(player);
}


方法 2:

自己動手修改囉!
Step 1.首先在最放上方新增一個,原作者建議放在 #include "Skills.h" 後面 (基本上沒差)
#include "SkillsPacket.h"

Step 2.將下面這五行程式碼刪除
packet.addShort(player->skills->getSkillsNum());
for(int i=0; iskills->getSkillsNum(); i++){
packet.addInt(player->skills->getSkillID(i));
packet.addInt(player->skills->getSkillLevel(player->skills->getSkillID(i)));
}
並取代成packet.addShort(0);Step 3. 在 packet.addBytes("90633A0DC55DC801");
packet.packetSend(player);
的後面新增 for(int i=0; iskills->getSkillsNum(); i++){
SkillsPacket::addSkill(player, player->skills->getSkillID(i), player->skills->getSkillLevel(player->skills->getSkillID(i)));
}


基本上就修改這幾個地方囉! :)

所以最後看起來應該會像下面這樣
//Skills
/*
packet.addShort(player->skills->getSkillsNum());
for(int i=0; iskills->getSkillsNum(); i++){
packet.addInt(player->skills->getSkillID(i));
packet.addInt(player->skills->getSkillLevel(player->skills->getSkillID(i)));
}

*/
//End 以上皆刪除

packet.addShort(0); // 我們新增的code
packet.addInt(0);
packet.addInt(0);
packet.addInt(0);
packet.addShort(0);
for(int i=0; i<15; color="blue">for(int i=0; iskills->getSkillsNum(); i++){
SkillsPacket::addSkill(player, player->skills->getSkillID(i), player->skills->getSkillLevel(player->skills->getSkillID(i)));
}
這個版本的好處就是,下次登入時四轉技能還在喔~^^ 比起我上個版本要好得多了!

原文網址:http://forum.ragezone.com/f427/release-fix-logging-characters-have-4th-job-skills-386505/
附註:如果有使用我之前解決無法登入的方法,請至Player.cpp中將 MySQL::delete4thSkills(getPlayerid()); 這段程式碼刪掉即可!

[T007] 讓倉庫管理員變成造型師

每次變換髮型,眼睛都要到各地的城市去,還要買卷..實在是太麻煩啦!!

所以我把倉庫管理員變成造型師囉! 哈哈

首先確定版本是否吻合喔! 需要修改三個地方 :)

NPCsScript.h
需要新增下列這兩行程式碼,至於加在哪呢? 看起來跟他一樣的地方就是啦!
隨便找地方插進去!:P

case 1002005: npc_1002005(npc); break;
static void npc_1002005(NPC* npc);

switch(npcid){

// add by squall (change eyes/hair)
case 1002005: npc_1002005(npc); break; // 把我這行加進去喔~~~

case 2100: npc_2100(npc); break;
case 2101: npc_2101(npc); break;
case 2020005: npc_2020005(npc); break;
另外一段在下面~]private:
static void npc_1002005(NPC* npc); // 把我這行加進去喔~~~
static void npc_2100(NPC* npc);
static void npc_2101(NPC* npc);
把下面程式碼整段貼到PlasticSurgery.cpp// add by squall 2008-08-04-14
void NPCsScripts::npc_1002005(NPC* npc){
int state = npc->getState();
int skins[] = {0, 1, 2, 3, 4};
int hairs[] = {31000, 31010, 31020, 31030, 31040, 31050, 31060, 31070, 31080, 31090, 31100, 31110, 31120, 31130, 31140, 31150, 31160, 31170, 31180, 31190, 31200, 31210, 31220, 31230, 31240, 31250, 31260, 31270, 31280, 31290, 31300, 31310, 31320, 31330, 31340, 31350, 31360, 31370, 31380, 31390, 31400, 31410, 31420, 31430, 31440, 31450, 31460, 31470, 31480, 31490, 31500, 31510, 31520, 31530, 31540, 31550, 31560, 31570, 31580, 31590, 31600, 31610, 31620, 31630, 31640, 31650, 31660, 31670, 31680, 31690, 31700, 31710, 31720, 31730};
int hairscolor[] = {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8};
int eyes[] = {21000, 21001, 21002, 21003, 21004, 21005, 21006, 21007, 21008, 21009, 21010, 21011, 21012, 21013, 21014, 21016, 21017, 21018, 21019, 21020, 21022};
if(state == 0){
npc->addText("#L0#變換膚色#l\r\n#L1#變換髮型#l\r\n#L2#變換髮型顏色#l\r\n#L3#變換眼睛#l\r\n#L4#變換眼睛顏色#l");
npc->sendSimple();
}
else if(state == 1){
int type = npc->getSelected();
npc->setVariable("type", type);
if(type == 0){
npc->sendStyle(skins, 5);
}
else if(type == 1){
npc->sendStyle(hairs, 74);
}
else if(type == 2){
int cur = npc->getPlayerHair()/10*10;
int colors[] = {cur, cur+1, cur+2, cur+3, cur+4, cur+5, cur+6, cur+7};
npc->sendStyle(colors, hairscolor[npc->getPlayerHair()%1000/10]);
}
else if(type == 3){
npc->sendStyle(eyes, 21);
}
else if(type == 4){
int cur = npc->getPlayerEyes()%100+20000;
int colors[] = {cur, cur+100, cur+200, cur+300, cur+400, cur+500, cur+600, cur+700};
npc->sendStyle(colors, 8);
}
else{
npc->end();
}
}
else if(state == 2){
npc->end();
int type = npc->getVariable("type");
if(type == 0){
npc->setStyle(skins[npc->getSelected()]);
}
else if(type == 1){
npc->setStyle(hairs[npc->getSelected()]);
}
else if(type == 2){
npc->setStyle(npc->getPlayerHair()/10*10 + npc->getSelected());
}
else if(type == 3){
npc->setStyle(eyes[npc->getSelected()]);
}
else if(type == 4){
npc->setStyle(20000+npc->getPlayerEyes()%100 + npc->getSelected()*100);
}
else
npc->setStyle(eyes[npc->getSelected()]);
}

}

更新版:

// add by squall 2008-08-04-14
void NPCsScripts::npc_1002005(NPC* npc){
int state = npc->getState();
int skins[] = {0, 1, 2, 3, 4};
int hairs[] = {31000, 31010, 31020, 31030, 31040, 31050, 31060, 31070, 31080, 31090, 31100, 31110, 31120, 31130, 31140, 31150, 31160, 31170, 31180, 31190, 31200, 31210, 31220, 31230, 31240, 31250, 31260, 31270, 31280, 31290, 31300, 31310, 31320, 31330, 31340, 31350, 31400, 31410, 31420, 31430, 31440, 31450, 31460, 31470, 31480, 31490, 31510, 31520, 31530, 31540, 31550, 31560, 31570, 31580, 31590, 31600, 31610, 31620, 31630, 31640, 31650, 31680, 31690, 31700, 31710, 31720, 31730};
int hairscolor[] = {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8};
int eyes[] = {21000, 21001, 21002, 21003, 21004, 21005, 21006, 21007, 21008, 21009, 21010, 21011, 21012, 21013, 21014, 21016, 21017, 21018, 21019, 21020, 21022};
if(state == 0){
npc->addText("#L0#變換膚色#l\r\n#L1#變換髮型#l\r\n#L2#變換髮型顏色#l\r\n#L3#變換眼睛#l\r\n#L4#變換眼睛顏色#l");
npc->sendSimple();
}
else if(state == 1){
int type = npc->getSelected();
npc->setVariable("type", type);
if(type == 0){
npc->sendStyle(skins, 5);
}
else if(type == 1){
npc->sendStyle(hairs, 67);
}
else if(type == 2){
int cur = npc->getPlayerHair()/10*10;
int colors[] = {cur, cur+1, cur+2, cur+3, cur+4, cur+5, cur+6, cur+7};
npc->sendStyle(colors, hairscolor[npc->getPlayerHair()%1000/10]);
}
else if(type == 3){
npc->sendStyle(eyes, 21);
}
else if(type == 4){
int cur = npc->getPlayerEyes()%100+20000;
int colors[] = {cur, cur+100, cur+200, cur+300, cur+400, cur+500, cur+600, cur+700};
npc->sendStyle(colors, 8);
}
else{
npc->end();
}
}
else if(state == 2){
npc->end();
int type = npc->getVariable("type");
if(type == 0){
npc->setStyle(skins[npc->getSelected()]);
}
else if(type == 1){
npc->setStyle(hairs[npc->getSelected()]);
}
else if(type == 2){
npc->setStyle(npc->getPlayerHair()/10*10 + npc->getSelected());
}
else if(type == 3){
npc->setStyle(eyes[npc->getSelected()]);
}
else if(type == 4){
npc->setStyle(20000+npc->getPlayerEyes()%100 + npc->getSelected()*100);
}
else
npc->setStyle(eyes[npc->getSelected()]);
}

}

這樣就完成啦,以後只要找到倉庫管理員,就可以變換造型囉!

版權聲明

未註明出處的文章皆為原創,請勿任意轉載,如需轉載也請跟我說一聲

非原創文章,會加上原出處,如果有任何侵犯到的地方請馬上告知,我會在第一時間撤除

Blog內容僅供學術用途,請勿作任何非法使用

2008年4月15日 星期二

[T007] 解決四轉技能無法重登的問題 (治標不治本)

相信大家都想要擁有四轉技能...不過偏偏伺服器不夠完整!

每次玩完就要刪除..實在是很麻煩!!

所以啦~在還沒真正解決四轉技能為何會造成無法登入之前..先簡單寫個鳥程式來解決吧!XD

首先開啟MySQLM.cpp,找個你喜歡的地方將下面的程式碼貼上
//add by squall
void MySQL::delete4thSkills(int id){
char query[500];
sprintf_s(query, 500, "DELETE FROM skills WHERE charid='%d' AND (skillid LIKE '%s' OR skillid LIKE '%s' OR skillid LIKE '%s' OR skillid LIKE '%s' OR skillid LIKE '%s' OR skillid LIKE '%s' OR skillid LIKE '%s' OR skillid LIKE '%s' OR skillid LIKE '%s' OR skillid LIKE '%s');", id, "112%","122%","132%","212%","222%","232%","312%","412%","422%");
mysql_real_query(&maple_db, query, strlen(query));
}


在MySQLM.h加入
static void delete4thSkills(int id);

最後在Player.cpp中加入
//add by squall (delete 4thJob Skills)
MySQL::delete4thSkills(getPlayerid());


這邊有一個地方要注意的,必須放在取得技能之前,所以建議放在[color=Red]int skill[200][2];[/color]的下面一行...
看起來如下
int skill[200][2];
//add by squall (delete 4thJob Skills)
MySQL::delete4thSkills(getPlayerid()); // 這段是新加進去的唷!!
many = MySQL::getSkills(getPlayerid(), skill);
好啦~這樣每次玩遊戲都可以放心的玩四轉技能囉! 不過還是希望盡快找出四轉技能會當機的問題...囧!


==================補充說明==================

看樣子大家似乎都有遇到類似的問題

是Player.CPP不是Players.CPP

所以可能要請大家找 many = MySQL::getSkills(getPlayerid(), skill); 或是 getSkills

只要把MySQL::delete4thSkills(getPlayerid()); 這段放在取得技能之前即可

類似這樣...大家在努力試試看吧! :) for(int i=0; i Item* item = new Item;
item->id = items[i][0];
item->inv = items[i][1];
item->pos = items[i][2];
item->amount = items[i][3];
inv->addItem(item);
}
int skill[200][2];

//add by squall (delete 4thJob Skills)
MySQL::delete4thSkills(getPlayerid());


many = MySQL::getSkills(getPlayerid(), skill);

for(int i=0; i skills->addSkillLevel(skill[i][0], skill[i][1]);
//SkillsPacket::addSkill(this, skill[i][0] , skills->getSkillLevel(skill[i][0]));
}