Archive

Archive for the ‘技術文件’ Category

Autohotkey – 熱鍵取代九宮格數字鍵

April 12th, 2010

對於我這個魔獸新手來說..那個九宮格在右邊的熱鍵實在是有夠難按的..

真不知道當初怎麼會設計成這樣..

我們就用簡單的Autohotkey來製作一個簡單的小程式吧!!

Read more…

Squall Programming, 技術文件

[教學] 如何實作Yahoo Pipes (一)

April 9th, 2010

Yahoo Pipes

上次看到這篇Google 採用 HTML5 製作手機應用程式(老新聞)文章後,就覺得Yahoo Pipes實作應該不是太難! (當然是不考慮畫面的部分XD)

但是要如何畫出優美的線條呢? 直覺告訴我應該可以使用貝茲曲線來畫出漂亮的曲線

Read more…

Squall Javascript, Web Programming, web, 技術文件 , ,

Ultraedit 32 for 64bit

September 22nd, 2009

灌了64bit的作業系統後,發現右鍵選單中的Ultraedit不見了>”<

把底下的內容存成.reg執行就好囉!

要注意的就是最後一行的路徑,可能會因為你安裝的位置不同而有所差異 :)

REGEDIT4

[HKEY_CLASSES_ROOT\*\shell\UltraEdit]
@="UltraEdit"

[HKEY_CLASSES_ROOT\*\shell\UltraEdit\command]
@="\"C:\\Program Files (x86)\\IDM Computer Solutions\\UltraEdit-32\\uedit32.exe\" %1"

Squall 技術文件 , ,

BIG-5編碼~許功蓋

June 13th, 2009

已經好久沒有遇到類似的問題了:P 現在都改用UTF-8了啊!

不過既然遇到了就來說明一下我的解決方法,個人覺得處理的有點怪

我是透過php去讀取Windows下的資料夾,但是當路徑中有 “許” 的字樣時竟然會出現錯誤

後來發現是多了一條斜線,因此無法正常開啟資料夾

許\錯誤

因此利用取代的方式,把\取代掉就好囉!

$address = iconv("utf-8","big-5",str_replace("\\","",iconv("big5","utf-8",$address)));

不過因為網頁是UTF-8,讀取檔案總管是BIG-5,所以才要這樣轉來轉去的!

感覺有點蠢 :P

Squall php, 技術文件

快速變更網路設定

June 13th, 2009

以前常到處跑來跑去,又要改網路設定真的很麻煩,所以寫個簡單的批次檔來設定 :P

雖然我知道有很多現成又好用的軟體,不過不想裝那些程式的可以試試這個

DHCP:

netsh interface ip set address “區域連線” dhcp
netsh interface ip set dns “區域連線” dhcp

Static IP:

netsh interface ip set address “區域連線” static 192.168.0.33 255.255.255.0 192.168.0.254 1
netsh interface ip set dns “區域連線” static 168.95.1.1

區域連線的名稱為你網路連線設定的名稱,若你想修改的網路卡為”區域連線1″,那就把上述的”區域連線”改成”區域連線1″即可!

將上述的內容存到.bat檔中即可使用:)

Squall 技術文件

[Perl] Parser dir list

February 12th, 2009

Dir sample:


 D:\[01] Music\[01] 國語流行\1990\1984-08-01-陳慧嫻-故事的感覺 的目錄

2008/07/28  上午 01:57    <DIR>          .
2008/07/28  上午 01:57    <DIR>          ..
2004/02/11  上午 02:17         4,621,084 01.mp3
2004/02/11  上午 02:23         2,858,968 02.mp3
2004/02/11  上午 02:29         3,052,483 03.mp3
2004/02/11  上午 02:36         3,541,496 04.mp3
2004/02/11  上午 02:44         3,757,163 05.mp3
2004/02/11  上午 02:50         2,690,531 06.mp3
2004/02/11  上午 02:58         4,202,707 07.mp3
2004/02/11  上午 03:03         2,392,944 08.mp3
2004/02/11  上午 03:11         3,396,046 09.mp3
2004/02/11  上午 03:21         5,205,809 10.mp3
              10 個檔案      35,719,231 位元組

 D:\[01] Music\[01] 國語流行\1990\1987-05-01-張學友-在我心深處(國) 的目錄

2008/07/28  上午 01:57    <DIR>          .
2008/07/28  上午 01:57    <DIR>          ..
1999/12/24  上午 03:30         4,154,096 01_藍雨.MP3
1999/12/24  上午 03:30               496 01_藍雨.TXT
1999/12/24  上午 03:30         3,126,334 02_在我心深處.MP3
1999/12/24  上午 03:30               406 02_在我心深處.TXT
1999/12/24  上午 03:30         2,928,640 03_夢.MP3
1999/12/24  上午 03:31               392 03_夢.TXT
1999/12/24  上午 03:31         4,374,360 04_思念.MP3
1999/12/24  上午 03:31               421 04_思念.TXT
1999/12/24  上午 03:31         4,765,152 05_繫情.MP3
1999/12/24  上午 03:31               367 05_繫情.TXT
1999/12/24  上午 03:32         4,009,064 06_別戀.MP3
1999/12/24  上午 03:32               346 06_別戀.TXT
1999/12/24  上午 03:32         4,052,532 07_是悲是喜.MP3
1999/12/24  上午 03:32               276 07_是悲是喜.TXT
1999/12/24  上午 03:32         3,457,358 08_二人世界.MP3
1999/12/24  上午 03:32               458 08_二人世界.TXT
1999/12/24  上午 03:32         3,067,296 09_狂傲.MP3
              17 個檔案      33,937,994 位元組

把dir匯出的資料輸出成特定的格式 :)

#!/usr/bin/perl
$x="2008-12-30.txt";

if (-e $x) {
    open(RF, "$x");

    @list = <RF>;
    printf("INSERT INTO `music`.`musiclist` (`location` ,`filename` ,`filesize`) VALUES ");

    foreach $thing (@list)
    {
        chomp($thing);
        $check = substr $thing, 1,3;
        if( $check eq "D:\\" )
        {
            $fileDirector = substr $thing,0,length($thing)-7;
            $fileDirector =~ s/^\s+|\s+$//g;
        }
        else
        {
            $createDate = substr $thing, 0, 22;
            $fileSize = substr $thing, 22, 18;
            $fileSize =~ s/^\s+|\s+$//g;
            $fileName = substr $thing, 40;
            $fileName =~ s/^\s+|\s+$//g;
            if($fileName ne "位元組" &amp;amp;&amp;amp; $fileName ne "." &amp;amp;&amp;amp; $fileName ne ".." &amp;amp;&amp;amp; $fileName ne "" &amp;amp;&amp;amp; $fileSize ne "<DIR>")
            {
                printf("('".$fileDirector."','".$fileName."','".$fileSize."'),\n");
            }
        }
    }

    close($x);

} else {
    printf "文件不存在。\n";
}  

Squall Perl, 技術文件

ASUS U6 SATA2 install Windows XP

January 10th, 2009

很高興的買了一台U6回來,找好了一堆for XP的Driver

沒想到重灌XP就卡住了=.=

舊版的XP竟然不支援SATA2…

幸好BIOS裡面有選項可以改..Orz

進入BIOS之後選 Advanced >> IDE Configuration >> SATA Operation Mode >> Compatible/Enhanced

將原來的 Enhanced (增強模式式) 改為 Compatible (相容模式)

儲存離開~

希望接下來能順利的灌好XP! 哈哈

Squall 技術文件 , , ,

Autohotkey – 滑鼠控制音量程式

August 2nd, 2008

每次調整音量大小都要打開工作列上的音量調整音量大小

真的是很麻煩~~~ (雖然說現在很多鍵盤上面都有這功能啦)

用簡單的Autohotkey來製作一個快速調整音量的程式吧!

使用說明:

ctrl + 滑鼠滾輪 調整音量控制大小
alt + 滑鼠滾輪 調整Wave音量大小

軟體下載:原始碼,執行檔

程式碼:


~Lcontrol & WheelUP::
SoundSet +2.8
return

~Lcontrol & WheelDown::
SoundSet -2.5
return

~Lalt & WheelUP::
SoundSetWaveVolume, +10
return

~Lalt & WheelDown::
SoundSetWaveVolume, -10
return

如果大家使用上有甚麼問題,在跟我說囉:)

Squall 技術文件 ,

[JS] Prototype Window

April 30th, 2008

簡單又好用的Prototype Window

該如何使用呢? 首先要引用下列幾個js及css (選擇你要的樣板)


<script type="text/javascript" src="/javascripts/prototype.js"></script>
<script type="text/javascript" src="/javascripts/window.js"> </script>
<link href="/stylesheets/themes/default.css" rel="stylesheet" type="text/css"/>
<!-- Add this to have a specific theme-->
<link href="themes/mac_os_x.css" rel="stylesheet" type="text/css"/>

使用的方法如下,宣告一個新的視窗!


win = new Window({className: "mac_os_x", title: "Sample", width:200, height:150,
destroyOnClose: true, recenterAuto:false}); win.getContent().update("<h1>Hello
world !!</h1>");
win.showCenter();

非常簡單吧!

原文出處:prototype-window 官方網站

Squall Javascript, 技術文件 ,

[PHP] number_format

April 28th, 2008

當你計算依些數值的時候,有些時候會想要取到小數點第二位之類的

就可以使用number_format囉! 之前我都是使用printf(“%.2f”,$num);

最近發現 number_format 也很好用喔!!

而且還可以設定自己想要的格式,如果我要取到小數點第二位的話

number_format($num,2);

其他相關用法:

$number = 1234.56;

// 預設
$english_format_number = number_format($number);
// 印出 1,235

// French notation
$nombre_format_francais = number_format($number, 2, ',', ' ');
// 1 234,56

$number = 1234.5678;

// english notation without thousands seperator
$english_format_number = number_format($number, 2, '.', '');
// 1234.57

?>

更多bumber_format相關教學

Squall php, 技術文件 ,

[T007] 修正eyes錯誤

April 22nd, 2008

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

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

(略) 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個..當然會出現錯誤囉!

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

Squall 技術文件

如何自己新增NPC

April 17th, 2008

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/

Squall 技術文件

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

April 17th, 2008

方法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; i inv->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; i inv->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; i inv->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; i skills->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; i skills->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; i skills->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; i skills->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()); 這段程式碼刪掉即可!

Squall 技術文件

SQL SERVER 交易紀錄檔

March 30th, 2008

關於sql server的一個問題,很幸運的我遇到了這個問題..

資料庫使用很久以後..應該都會遇到的問題!

雖然我是第一次遇到..

不過我想是因為以往的硬碟夠大,資料量少的關係吧!

寫IPMAP的時候..發現自己硬碟空間越來越少,

而且少得離譜..然後會出現 “交易紀錄檔已滿” 請備份資料

並刪除log檔..後來發現log檔..檔案超大…不過要刪log檔,

也不是那麼的方便….

不過只要只要下sql command > dbcc shrinkdatabase(dbname)

就可以順利解決了!

當然還有其他方法..不過我想這是最方便的

Squall SQL Server, 技術文件

[OWC] about clsid

March 30th, 2008

關於owc元件..找到很多教學網站都是舊的資訊!

所以常常會無法顯示圖片..
後來發現是classid的關係!

目前只測試兩個!
ChartSpace1->clsid:0002E556
Spreadsheet1->clsid:0002E551

繼續研究下一個部份囉!

Squall 技術文件