PDA

View Full Version : Tìm hiểu dữ liệu Database Item



ViperMUHN
26-12-09, 11:52 PM
Qua bài viết này, bạn sẽ có thêm hiểu biết về cách tối ưu dữ liệu Item rất thông minh của webzen khi lưu vào Database. Giúp bạn có thêm kiến thức để tự bạn có thể viết được phần mềm tạo đồ hay trang webshop, Xay đồ online ...

1. Đầu tiên, ta cần hiểu 1 số kiến thức cơ bản ^^
1 Byte = 8bit, ở đây chúng ta sẽ dùng rất nhiều liên quan đến bit
Giả sử, bạn có số 56 , OK máy sẽ ko hiểu là 56 mà nó hiểu là 111000
56 ở cơ số 10 đã chuyển thành 111000 ở cơ số 2

1.a Thuật toán dịch bit
Dịch trái <<


BYTE bt=1; //00000001
bt = bt<<2;//00000100
lúc này bt sẽ có giá trị là 100 (cơ số 2) = 4 (cơ số 10)

Dịch phải >>


BYTE bt=9; // 00001001
bt = bt>>1; // 00000100
lúc này bt sẽ có giá trị là 100 (cơ số 2) = 4 (cơ số 10)


1.b phép tính về bit cơ bản
AND (và): Trả kết quả bằng 1 khi cả 2 cùng bằng 1, còn lại trả về là 0
VD: 11000110 & 10100010 = 10000010

OR (hoặc): Trả về kết quả nằng 0 khi cả 2 cùng bằng không
VD: 11000110 | 10100010 = 11100110


e hèm, đến đây nhiều bạn sẽ thấy lằng nhằng, còn với những ai thông thạo về ASM chắc thấy đơn giản ^^, yên tâm, thử nhiều sẽ quen thôi, Dùng calc của window chuyền sang hệ Bin để thử nhé

2. Xem 1 ví dụ cơ bản
Giả sử, bạn có các giá trị quy định: Level item (0->13), Luck(có/không), Skill(có/không), Option(0/4/8/12/16)
Tất cả nhưng giá trị đó được webzen lưu trữ chỉ với 1 byte !
--------------------------
OK, 1 byte của chúng ta như sau: 00000000
Bây giờ chúng ta chia thành các khoảng: [0] [0000] [0] [00]
Đánh số thứ tự cho dễ nhìn nhé: 1.[0] 2.[0000] 3.[0] 4.[00]
Mỗi bit chỉ thể hiện được 2 giá trị 0 hoặc 1
1. Có Skill hay không (0>1)
2. Level của item (0000 -> 1111 tức 0->15, vì thế mới có level 14,15 ^^ mà không thể có level 16)
3. Có luck hay không
4. Option (00 -> 11 tức 0 -> 3) , thực ra Option được dặt trong 3 bit, còn bit thứ 3 đã được chuyển sang byte khác

Câu hỏi đặt ra là: làm sao ta có thể chuyển dữ liệu Item trên vào 1 Byte
Xem mã nguồn sau nhé: Giả sử ta có 1 item Luck+Skill+10+4op


BYTE output=0;
output |= 1<<7; // Skill
output |= (10&15)<<3; // level
output |= 1<<2;// Luck
output |= 1&3; // Option


Bây giờ là lấy dữ liệu ra khỏi 1 Byte


// bạn đang có output;
bool Skill= output>>7;
char level = (output>>3)&15;
bool luck = (output>>2)&1;
char option = (output)&3;


Xong rồi đó
Bây h tìm hiểu dữ liệu SQL nhé


//------------------------------------------------------------------------
// ITEM DATABASE
// Các BYTE, tổng độ dài 16 BYTE
// [01] [02] [03] [04 05 06 07] [08 09 10 11] [12 13 14 15 16]
// [04 05 06 07] Serial
// [12 13 14 15 16]: SocketItem
//
//
// [01]: Item Index (1[23456789])
// [02]: [1] [2345] [6] [78]
// 1 : Option1
// 2345 : level
// 6 : Option2
// 78 : Option3 (1[23])
// [03]: Durability
// [08]: [1] [2] [345678]
// 1 : Item Index ([1]23456789)
// 2 : Option3 ([1]23)
// 2345678 : NewOption
// [09]: SetOption (HION ITEM) ??
// [10] [1234] [5] 678
// 1234 : Item Type
// 5 : Is Item380
// [11]: JewelOfHarmonyOption ??
// [1234] [5678]
// 1234 : btOptionType
// 5678: : btOptionLevel
//
//----------------------------------------------------------------------------


2. Phần mềm tạo đồ cơ bản (Chưa hoàn thiện Socket Item), Mã nguồn đươc decode 85% từ GameServer 1.00.87
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b> (<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b> 2F%3F2jzzxx3zuy4)
Chúc bạn thành công

membering
27-12-09, 11:16 AM
thanks bạn đã giảng bài này rất chi tiết

viper9x
28-12-09, 06:50 PM
èo xem bài viết này của bạn chả hiểu gì hết trơn

Văn_Bờm
28-12-09, 08:57 PM
thanks bạn...nhân tiện bạn có thể nói qua về việc đồ đúp được không......

nghe nói là đồ đúp thì nó chùng serier thì phải....mình cũng chưa hiểu sâu về vụ đồ đúp này lắm.......mong bạn...cho ý kiến học hỏi tí...

ViperMUHN
29-12-09, 01:19 PM
thanks bạn...nhân tiện bạn có thể nói qua về việc đồ đúp được không......

nghe nói là đồ đúp thì nó chùng serier thì phải....mình cũng chưa hiểu sâu về vụ đồ đúp này lắm.......mong bạn...cho ý kiến học hỏi tí...

Khi một đồ được tạo (Bằng cách đánh quái rơi đồ, xay đồ, ....) Server sẽ cấp 1 serial vào Item đó, tổng cộng là 4 Byte (0 -> 4294967295), tức mỗi đồ có 1 ID (gọi là serial hay số thứ tự) riêng. ID này tự động tăng và gán vào đồ để ko có đồ nào trùng sẻial cả nhưng nếu dupe đồ thì 2 đồ dupe sẽ giống nhau vì đồ không được cấp ID mới!

Destruct
29-12-09, 01:40 PM
Cái trên thì Des đã biết rồi, là kiến thức cơ bản về hệ đếm thập phân và nhị phân. Cái này cần cho những ai làm về lập trình và cần có óc khái quát cao để phân tích ^^ ViperMUHN nên giảng giải thêm cách làm thế nào để convert từ hệ nhị phân sang hệ thập phân và ngược lại.

Thanks!

ViperMUHN
29-12-09, 01:59 PM
Cái trên thì Des đã biết rồi, là kiến thức cơ bản về hệ đếm thập phân và nhị phân. Cái này cần cho những ai làm về lập trình và cần có óc khái quát cao để phân tích ^^ ViperMUHN nên giảng giải thêm cách làm thế nào để convert từ hệ nhị phân sang hệ thập phân và ngược lại.

Thanks!


Máy chỉ hiểu dạng nhị phân, dù bạn có nhập gì đi nữa, việc bạn tự chuyển đổi hệ là không cần thiết vì cuối cùng nó đều chuyển sang nhị phân ! Tuy vậy ta là người, không phải là máy :D !



Giờ này ai tính bằng tay để chuyển đổi nhỉ, bắt đầu với calc của Win thôi !

1. Start/run/calc Enter
2. Vào menu View/Scientific

Đó, giờ thấy rộng hơn rồi, cái bạn càn chú ý là : Hex(16) Dec(10) Oct(8) Bin(2)
Bạn chọn Dec rồi nhập bừa 1 số nhé, ấn dáu = và chọn Bin , hehe, số đã đc chuyển sang bin, còn lại tự suy luận

Ngoài ra còn có phép tính mới: And,Xor,Not .....

Destruct
29-12-09, 02:17 PM
Des chưa hiểu vì sao 1111 = 15. Cái này ngày xưa xem kĩ lắm ^^!

ViperMUHN
29-12-09, 06:34 PM
Des chưa hiểu vì sao 1111 = 15. Cái này ngày xưa xem kĩ lắm ^^!

Xem kĩ hướng dẫn vừa rồi, chọn Dec, nhập 15 rồi ấn = ,chọn Bin !

Van_Bom
29-12-09, 10:53 PM
cám ơn bạn....vụ này xem ra còn dài quá...mình nghe cứ như là vịt nghe karaoke ý..

Văn_Bờm
30-12-09, 06:41 AM
À quên còn vụ này mình nghĩ mãi cả đêm mà không tài nào hiểu được: Ví dụ bờm có 1 cái kiếm rồng Full và bờm vào hòm đồ rồi đúp 1 phát ra 2 cái mới nhé:

1, Đặt 2 cái kiếm mới đúp gần nhau thì không làm sao cả, và không hề bị disconnect, Nhưng nếu đặt 1 trong 2 cái gần cái gốc đầu tiên thì bị disconnect . Vậy câu hỏi ở đây là rõ ràng cái kiếm gốc đầu tiên nó phải có cái gì đó khác 2 cái mới đúp ra chứ..để cho GS nó phân biệt đâu là gốc và đâu là cái mới đúp ra để còn làm Disconnect chứ đúng ko..

2, Mấy món đồ như vé BC, Dv, rồi là bịch máu mới bịch mana thì đúp tệt ga và có đặt gần nhau với cái gốc cũng không bị Disconnect...

- Mong các pro giải thích dùm 2 cái thắc mắc trên với..

I'mBack
30-12-09, 11:26 PM
Có mỗi cái nhị phân mà cũng dài dòng. Ai đi lên từ cơ bản sẽ rõ.

xom1b
31-12-09, 05:38 PM
À quên còn vụ này mình nghĩ mãi cả đêm mà không tài nào hiểu được: Ví dụ bờm có 1 cái kiếm rồng Full và bờm vào hòm đồ rồi đúp 1 phát ra 2 cái mới nhé:

1, Đặt 2 cái kiếm mới đúp gần nhau thì không làm sao cả, và không hề bị disconnect, Nhưng nếu đặt 1 trong 2 cái gần cái gốc đầu tiên thì bị disconnect . Vậy câu hỏi ở đây là rõ ràng cái kiếm gốc đầu tiên nó phải có cái gì đó khác 2 cái mới đúp ra chứ..để cho GS nó phân biệt đâu là gốc và đâu là cái mới đúp ra để còn làm Disconnect chứ đúng ko..

2, Mấy món đồ như vé BC, Dv, rồi là bịch máu mới bịch mana thì đúp tệt ga và có đặt gần nhau với cái gốc cũng không bị Disconnect...

- Mong các pro giải thích dùm 2 cái thắc mắc trên với..

hehe chắc là GS bản cũ nên bị
chứ theo lí thuyết là Serial như nhau là bị dis và mình cũng làm thử như bờm -> dis

Van_Bom
31-12-09, 07:17 PM
Không ai đọc kỹ câu này à đúng là chỉ nhìn qua tiếc thật......

Vậy câu hỏi ở đây là rõ ràng cái kiếm gốc đầu tiên nó phải có cái gì đó khác 2 cái mới đúp ra chứ..để cho GS nó phân biệt đâu là gốc và đâu là cái mới đúp ra để còn làm Disconnect chứ đúng ko..

Van_Bom
31-12-09, 07:21 PM
Có mỗi cái nhị phân mà cũng dài dòng. Ai đi lên từ cơ bản sẽ rõ.


KHông spam ở đây nha bạn.....hê hê...đi nên từ cơ bản nói thì nghe hay lắm..nhưng không đơn giản đâu bạn à...với lại cứ dấu dốt thì lại càng ngu thôi..........dài dòng thì mới dễ hiểu chứ.......có biết vì sao mình dài dòng không...

vì 1 số bạn đọc hướng dẫn rồi mà lại cứ hỏi là ơ tại sao nó thế này ơ tại sao nó thế kia...rồi là ...sao tôi làm ko được.........vì thế chúng ta nên dài dòng 1 tí cũng tốt mà...

viper9x
01-01-10, 09:59 AM
Des chưa hiểu vì sao 1111 = 15. Cái này ngày xưa xem kĩ lắm ^^!


1111=2^3 + 2^2 + 2^1 + 2°=8+4+2+1=15 >>hiểu chưa bạn=))

viper9x
01-01-10, 10:05 AM
KHông spam ở đây nha bạn.....hê hê...đi nên từ cơ bản nói thì nghe hay lắm..nhưng không đơn giản đâu bạn à...
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>

Destruct
01-01-10, 10:12 AM
1111=2^3 + 2^2 + 2^1 + 2°=8+4+2+1=15 >>hiểu chưa bạn=))Ừ nhỉ, ngu thật Đãng trí bác học. Khổ ^^!

viper9x
01-01-10, 01:12 PM
Ừ nhỉ, ngu thật Đãng trí bác học. Khổ ^^!


Èo hiểu mà không thanks mình fát >>rõ khổ~X(

Destruct
01-01-10, 09:59 PM
Thông cảm. Des xài Chrome xoá hết hình ảnh nên chẳng có cái nút nào hiện ra nữa rồi ^^!

NetBanBe.Net
01-01-10, 10:29 PM
Sử dụng hệ cơ số 2 thì rất khó vì hầu hết tools hỗ trợ sử dụng hệ cơ số 16 (Ví dụ như MuMaker).

1 Item, Database MU sử dụng 32 kí tự trong hệ cơ số 16 để biểu diễn:

[01-02] [03-04] [05-06] [07->14] [15-16] [17-18] [19-20] [21-32]
Trong đó:
[01-02] : Item ID
[03-04] : Item Level/Skill/Option Data
[05-06] : Item Durability
[07->14] : Serial
[15-16] : Item Excellent Info/ Option
[17-18] : Ancient data
[19-20] : Item Type
[21-32] : 6 socket

Tách 32 mã cơ số 16 ra thành từng đoạn theo chức năng trên sau đó chuyển sang hệ cơ số 10 sẽ cho được các thông số cần lấy:
- Item ID, Item Type : Tra trong Item(Kor).txt
- Item Durability : Độ bền Item
- Item Level/Skill/Option Data : được phân tích:
+ Nếu < 128 : Item không có skill
+ Nếu > 128 : Item có skill . Sau đó lấy phần dư (gọi là phần dư 1) khi trừ cho 120.
+ Level Item = phần nguyên của phép chia phần dư 1 cho 8
+ phần dư của phép chia phần dư 1 cho 8 : gọi là phần dư 2
+ Phần dư 2 < 4 : Không có luck
+ Phần dư 2 > 4 : có luck

Phân tích phần Item Excellent Info/ Option hơi phức tạp chút. Diễn giải khó quá ~X(
Thui để lần sau nói típ \:D/

Văn_Bờm
01-01-10, 11:01 PM
Vậy câu hỏi ở đây là rõ ràng cái kiếm gốc đầu tiên nó phải có cái gì đó khác 2 cái mới đúp ra chứ..để cho GS nó phân biệt đâu là gốc và đâu là cái mới đúp ra để còn làm Disconnect chứ đúng ko..

Hix ko ai giải thích cho bờm hiểu cái vụ này à...không tài nào nghĩ ra được...

NetBanBe.Net
02-01-10, 12:44 AM
Vậy câu hỏi ở đây là rõ ràng cái kiếm gốc đầu tiên nó phải có cái gì đó khác 2 cái mới đúp ra chứ..để cho GS nó phân biệt đâu là gốc và đâu là cái mới đúp ra để còn làm Disconnect chứ đúng ko..

Hix ko ai giải thích cho bờm hiểu cái vụ này à...không tài nào nghĩ ra được...
Khi Dupe thì Item Dupe và Item gốc giống nhau hoàn toàn, không khác nhau 1 tí gì cả.
Server sẽ không phân biệt được đâu là Item gốc, đâu là Item Dupe.
Còn vấn đề Server của bạn lại không nhận ra Item gốc với Item Dupe giống nhau khi đặt gần nhau thì không thể lý giải :-ss

Van_Bom
02-01-10, 08:27 AM
Thôi thế để bờm nói rõ lại cái này nha...

Có nghĩa là theo như lý thuyết là ta đúp item thì sẽ tạo các item giống nhau y đúc ko khác tí gì cả..đúng ko..và bi giờ giả dụ bờm có 1 cái kiếm rồng và bờm đúp ra 2 cái mới nữa như vậy là bờm có 3 cái...và sau đây là cái khó hiểu..

Bờm đặt 2 cái mới đúp ra ( 2 cái mới đó...) đặt cạnh nhau thì ko làm sao cả....cầm rồi là chơi tệt ga...

Tiếp đó bờm thử nghiệm lấy cái gốc đầu tiên ra đặt cạnh 1 cái mới đúp ra thì lập tức bị disconnect như vậy là có nghĩa..GS nó cũng phân biệt được đâu là cái gốc và đâu là cái mới đúp ra ....vậy tại sao 2 cái mới đúp ra kia nó cũng giống nhau mà tại sao nó đặt cạnh nhau lại ko disconnect mà phải đặt gần cái gốc đầu tiên mới disconnect.........Cái gốc đầu tiên phải có cái gì đó khác với 2 cái mới đúp ra chứ...vậy thì khác ở đâu đây..

Bờm thử nghiệm với các bản từ 0.97 -> 1.0 đều như thế cả.....

Destruct
02-01-10, 12:42 PM
Tạo ra các mã Item giống nhau là ban đầu, còn các Items hiện sau này đều từ 1 mã Item mà hiển thị nhiều hình ảnh, mà các hình ảnh của 1 mã để cạnh nhau thì chả sao cả. Nhưng nếu 2 mã giống nhau để cạnh nhau thì khi GS thực thi sẽ báo lỗi và phần CheckSerial sẽ tự động ngắt kết nối. Nói đơn giản là thế!

viper9x
02-01-10, 01:51 PM
Thông cảm. Des xài Chrome xoá hết hình ảnh nên chẳng có cái nút nào hiện ra nữa rồi ^^!

ừhm không sao cốt ở tấm lòng=;

Văn_Bờm
02-01-10, 05:26 PM
Pro Des có thể giải thích 1 cách nào đó dễ hiểu và rõ ràng với được ko...theo lý thuyết là đúp ra item thì giống nhau i đúc và ko khác cái gì cơ mà...thế rốt cuộc cái mã hình ảnh nó là mã gì thế..nó ko phải là serier à...........

Destruct
02-01-10, 09:52 PM
Nghĩa là quá trình Dupe đã tạo ra 2 Serials giống nhau và chỉ 2 mà thôi, trong đó một cái là Serial ảo. Từ cái Serial ảo đó nếu người ta Dupe thêm nữa cũng chỉ có cái Serial ảo lúc đầu còn thứ được tạo ra được coi như là một hình ảnh khác cũng của cái Serial đó. Nghĩa là tạo thêm bao nhiêu Items ảo thì trên Server cũng chỉ hiện diện 1 Serial ảo mà thôi. Khi để gần nhau, có một công đoạn Check Serial thì các Items ảo có để gần nhau nhưng Server chỉ có 1 Serial ảo thôi (tương tự như là 1 người mà chụp nhiều ảnh ấy ^^!) và nó cho rằng chỉ có 1 Items mà thôi. Nhưng khi đặt Item thật và Item ảo gần nhau nghĩa là Serial thật và Serial ảo nằm bên cạnh nhau và chúng giống nhau thì hệ thống Scan sẽ làm Dis

Văn_Bờm
02-01-10, 11:36 PM
cám ơn pro des bờm cũng hiểu phần nào...để đợt này phải test kỹ vụ đúp đồ mới được...đang thử nghiệm với cái 99B đúp dễ ợt

viper9x
03-01-10, 08:36 PM
cám ơn pro des bờm cũng hiểu phần nào...để đợt này phải test kỹ vụ đúp đồ mới được...đang thử nghiệm với cái 99B đúp dễ ợt

Đúp thì dễ nhưng chống đup lại là 1 vấn đề:((

xom1b
04-01-10, 03:36 AM
SCFMT dupe finder :)) chống đc phần nào

Destruct
04-01-10, 10:13 PM
Đúng là hiện nay chỉ có biện pháp sử dụng Dupe Finder định kì là hiệu quả nhất

NetBanBe.Net
04-01-10, 10:48 PM
Nghĩa là quá trình Dupe đã tạo ra 2 Serials giống nhau và chỉ 2 mà thôi, trong đó một cái là Serial ảo. Từ cái Serial ảo đó nếu người ta Dupe thêm nữa cũng chỉ có cái Serial ảo lúc đầu còn thứ được tạo ra được coi như là một hình ảnh khác cũng của cái Serial đó. Nghĩa là tạo thêm bao nhiêu Items ảo thì trên Server cũng chỉ hiện diện 1 Serial ảo mà thôi. Khi để gần nhau, có một công đoạn Check Serial thì các Items ảo có để gần nhau nhưng Server chỉ có 1 Serial ảo thôi (tương tự như là 1 người mà chụp nhiều ảnh ấy ^^!) và nó cho rằng chỉ có 1 Items mà thôi. Nhưng khi đặt Item thật và Item ảo gần nhau nghĩa là Serial thật và Serial ảo nằm bên cạnh nhau và chúng giống nhau thì hệ thống Scan sẽ làm Dis
Thật ra với Database MU thì không có việc Serial ảo với Serial thật.
1 Item trong Database MU được biểu thị bởi 32 kí tự hệ hexa hoàn toàn là các thông tin về Item như LV, các OP.
Hệ thống tìm đồ Dupe của MU là theo dõi tất cả các Item trên người, hòm đồ của 1 nhân vật, nếu 2 Item có số Serial giống nhau thì phát hiện Dupe.
Không có 1 thông tin nào khác về thời gian có Item đó hay Item đó là gốc hay ảo.
Bạn có thể kiểm tra bằng cách : Dùng MuMaker tạo 2 Item khác nhau hoàn toàn nhưng giống nhau phần Serial. Dĩ nhiên là phải bật chức năng ItemSerialCheck=1 trong commonserver.cfg. 2 Item đó sẽ bị phát hiện là Dupe ngay.

Văn_Bờm
04-01-10, 11:02 PM
theo như lời bạn nói thì cũng có cái đúng và có cái sai ở đây là..bờm đã lấy ví dụ rồi đó là 99B chẳng hạn..........2 cái mới đúp ra đấy..tại sao đặt nó gần nhau lại ko dis..mà đặt 1 trong 2 cái gần cái gốc đầu tiên thì lại dis...........đúng là ...đau tim quá...bờm thấy quá rắc rối vụ này..........

masterqm
02-02-10, 02:47 PM
Mình nghĩ là do thời gian xuất hiện trước sau nên sever có thể phát hiện được đồ thật và đô dupe

Văn_Bờm
10-02-10, 08:32 PM
quên mất còn vụ này nữa...

tại sao ta dup các loại item như là bình máu với lại các loại vé blood rồi là vé devin
thì lại ko bị dis nhỉ...sao lại thế nhỉ...

KhongGianOL
23-02-10, 12:07 PM
quên mất còn vụ này nữa...

tại sao ta dup các loại item như là bình máu với lại các loại vé blood rồi là vé devin
thì lại ko bị dis nhỉ...sao lại thế nhỉ...

Cái này cũng đơn giản thui Bờm à, KGO đã thử rùi...ss5 lun...Bờm thêm đoạn code tìm tất cả item đi...và set là 1, đừng set 0...

Reload lại sever thử hack dup xem...out sever lun...:))=))

Văn_Bờm
25-02-10, 08:01 PM
hi hi...thì cái dòng đó...là ItemSerialCheck = 1 chứ gì..cho rồi đó...

cái này nó chỉ có tác dụng với các loại vũ khí và đồ đạc thôi...

chứ còn với các loại bịch máu và bịch mana rồi là vé blood rồi là sách rồng thì ko hề bị dis...

đã thử nghiệm trên phiên bản 99B và các loại 1.0 trở xuống...thế là thế nào nhỉ...

shock_boy
04-03-10, 06:22 PM
mấy cái này em chả hiểu gì cả
các anh giúp đỡ giùm

daodinhlong
08-05-10, 10:25 PM
Cái này dễ hiểu mừ, thanks bac phát, bác hãy nói rõ hơn về item trong thùng đồ và item mang theo như lọ thuốc và ngọc

xom1b
16-05-10, 12:34 AM
Cái này dễ hiểu mừ, thanks bac phát, bác hãy nói rõ hơn về item trong thùng đồ và item mang theo như lọ thuốc và ngọc

Lọ thuốc và ngọc bạn mua trong shop luôn có Serial = 0 mà server ko check Serial 0. đó là lí do mà dupe mấy thứ đó ko bị dis :D

Van_Bom
18-05-10, 06:06 AM
hà hà hay vãi hàng nhỉ...vậy thế còn cái vụ mờ tớ nói là 1 cái kiếm rồng gốc...đúp ra 2 cái mới đó thì sao..

tại sao 2 cái mới đó đặt gần nhau thì lại ko bị dis là sao nhỉ...vậy thì thế nào ta...chả hiểu cái này lắm..

royal
18-05-10, 08:10 AM
Qua bài viết này, bạn sẽ có thêm hiểu biết về cách tối ưu dữ liệu Item rất thông minh của webzen khi lưu vào Database. Giúp bạn có thêm kiến thức để tự bạn có thể viết được phần mềm tạo đồ hay trang webshop, Xay đồ online ...

1. Đầu tiên, ta cần hiểu 1 số kiến thức cơ bản ^^
1 Byte = 8bit, ở đây chúng ta sẽ dùng rất nhiều liên quan đến bit
Giả sử, bạn có số 56 , OK máy sẽ ko hiểu là 56 mà nó hiểu là 111000
56 ở cơ số 10 đã chuyển thành 111000 ở cơ số 2

1.a Thuật toán dịch bit
Dịch trái <<


BYTE bt=1; //00000001
bt = bt<<2;//00000100
lúc này bt sẽ có giá trị là 100 (cơ số 2) = 4 (cơ số 10)

Dịch phải >>


BYTE bt=9; // 00001001
bt = bt>>1; // 00000100
lúc này bt sẽ có giá trị là 100 (cơ số 2) = 4 (cơ số 10)


1.b phép tính về bit cơ bản
AND (và): Trả kết quả bằng 1 khi cả 2 cùng bằng 1, còn lại trả về là 0
VD: 11000110 & 10100010 = 10000010

OR (hoặc): Trả về kết quả nằng 0 khi cả 2 cùng bằng không
VD: 11000110 | 10100010 = 11100110


e hèm, đến đây nhiều bạn sẽ thấy lằng nhằng, còn với những ai thông thạo về ASM chắc thấy đơn giản ^^, yên tâm, thử nhiều sẽ quen thôi, Dùng calc của window chuyền sang hệ Bin để thử nhé

2. Xem 1 ví dụ cơ bản
Giả sử, bạn có các giá trị quy định: Level item (0->13), Luck(có/không), Skill(có/không), Option(0/4/8/12/16)
Tất cả nhưng giá trị đó được webzen lưu trữ chỉ với 1 byte !
--------------------------
OK, 1 byte của chúng ta như sau: 00000000
Bây giờ chúng ta chia thành các khoảng: [0] [0000] [0] [00]
Đánh số thứ tự cho dễ nhìn nhé: 1.[0] 2.[0000] 3.[0] 4.[00]
Mỗi bit chỉ thể hiện được 2 giá trị 0 hoặc 1
1. Có Skill hay không (0>1)
2. Level của item (0000 -> 1111 tức 0->15, vì thế mới có level 14,15 ^^ mà không thể có level 16)
3. Có luck hay không
4. Option (00 -> 11 tức 0 -> 3) , thực ra Option được dặt trong 3 bit, còn bit thứ 3 đã được chuyển sang byte khác

Câu hỏi đặt ra là: làm sao ta có thể chuyển dữ liệu Item trên vào 1 Byte
Xem mã nguồn sau nhé: Giả sử ta có 1 item Luck+Skill+10+4op


BYTE output=0;
output |= 1<<7; // Skill
output |= (10&15)<<3; // level
output |= 1<<2;// Luck
output |= 1&3; // Option


Bây giờ là lấy dữ liệu ra khỏi 1 Byte


// bạn đang có output;
bool Skill= output>>7;
char level = (output>>3)&15;
bool luck = (output>>2)&1;
char option = (output)&3;


Xong rồi đó
Bây h tìm hiểu dữ liệu SQL nhé


//------------------------------------------------------------------------
// ITEM DATABASE
// Các BYTE, tổng độ dài 16 BYTE
// [01] [02] [03] [04 05 06 07] [08 09 10 11] [12 13 14 15 16]
// [04 05 06 07] Serial
// [12 13 14 15 16]: SocketItem
//
//
// [01]: Item Index (1[23456789])
// [02]: [1] [2345] [6] [78]
// 1 : Option1
// 2345 : level
// 6 : Option2
// 78 : Option3 (1[23])
// [03]: Durability
// [08]: [1] [2] [345678]
// 1 : Item Index ([1]23456789)
// 2 : Option3 ([1]23)
// 2345678 : NewOption
// [09]: SetOption (HION ITEM) ??
// [10] [1234] [5] 678
// 1234 : Item Type
// 5 : Is Item380
// [11]: JewelOfHarmonyOption ??
// [1234] [5678]
// 1234 : btOptionType
// 5678: : btOptionLevel
//
//----------------------------------------------------------------------------


2. Phần mềm tạo đồ cơ bản (Chưa hoàn thiện Socket Item), Mã nguồn đươc decode 85% từ GameServer 1.00.87
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b> (<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b> 2F%3F2jzzxx3zuy4)
Chúc bạn thành công
chà admin Mu gamethuvn đây à ..................

cuteoteo
21-05-14, 06:08 PM
Xem kĩ hướng dẫn vừa rồi, chọn Dec, nhập 15 rồi ấn = ,chọn Bin !

15 = 2^0 + 2^1 + 2^2 + 2^3 đó thím (1111 trong nhị phân quy đổi ra DEC ( hệ thập phân ) -> 15 )

misago
27-06-14, 09:27 AM
15 = 2^0 + 2^1 + 2^2 + 2^3 đó thím (1111 trong nhị phân quy đổi ra DEC ( hệ thập phân ) -> 15 )

hệ thập phân ra nhị phân nhé.
15 ta đổi ra nhị phân như sau
15 chia 2 = 7 dư 1
7 chia 2 = 3 dư 1
3 chia 2 = 1 dư 1
1 chia 2 = 0 dư 1
kết quả hệ nhị phân của 15 là 1111

misago
27-06-14, 09:38 AM
cũng như số 56 của VipPer
56 chia 2 =28 dư 0
28 chia 2 = 14 dư 0
14 chia 2 = 7 dư 0
7 chia 2 = 3 dư 1
3 chia 2 = 1 dư 1
1 chia 2 = 0 dư 1

ra 111000. lấy số từ dưới lên trên