Сообщений: 376
Тем: 12
Зарегистрирован: Jul 2012
Репутация:
1,000
Категорически приветствую!
Может кому пригодится, выкладываю систему сериализациию
Принцип
Есть файл структур который содержит расширяемые типы.
struct
struct HitCondBonus {
byte ahead;
byte side;
byte back;
byte high;
byte low;
byte dark;
byte rain;
}
Есть файл данных...
файл
float[] level_bonus = (0.9,0.91,0.92,0.93,0.94,0.95,0.96,0.97,0.98,0.99,1,1.01,1.02,1.03,1.04,1.05,1.06,1.07,1.08,1.09,1.1,1.11,1.12,1.13,1.14,1.15,1.16,1.17,1.18,1.19,1.2,1.21,1.22,1.23,1.24,1.25,1.26,1.27,1.28,1.29,1.3,1.31,1.32,1.33,1.34,1.35,1.36,1.37,1.38,1.39,1.4,1.41,1.42,1.43,1.44,1.45,1.46,1.47,1.48,1.49,1.5,1.51,1.52,1.53,1.54,1.55,1.56,1.57,1.58,1.59,1.6,1.61,1.62,1.63,1.64,1.65,1.66,1.67,1.68,1.69,1.7,1.71,1.72,1.73,1.74,1.75,1.76,1.77,1.78,1.79,1.8,1.81,1.82,1.83,1.84,1.85,1.86,1.87,1.88);
HitCondBonus hit_cond_bouns = {0,5,10,3,-3,-10,-3};
Файлы считываются, затем происходит сериализация.
В проекте, есть пример
Вообщем если у кого-то будут интересные предложения...
На данный момент система не устойчива к ошибкам синтаксиса.
И модель является не оптимальной
http://dump.ru/file/5812675
Сообщений: 1,912
Тем: 56
Зарегистрирован: Jan 2009
Репутация:
12,921
08-03-2012, 01:09 PM
(Сообщение последний раз редактировалось: 08-03-2012, 02:58 PM VISTALL.)
в яве нету struct
Добавлено через 1 час 49 минут
http://habrahabr.ru/post/60317/
почитайте
Сообщений: 376
Тем: 12
Зарегистрирован: Jul 2012
Репутация:
1,000
VISTALL Написал:в яве нету struct
Добавлено через 1 час 49 минут
http://habrahabr.ru/post/60317/
почитайте а вы откройте архив и посмотрите хД
если так наугад кидать, то все таки промахнетесь
Цитата:Сериализация (в программировании) — процесс перевода какой-либо структуры данных в последовательность битов. Обратной к операции сериализации является операция десериализации — восстановление начального состояния структуры данных из битовой последовательности.
Сообщений: 1,912
Тем: 56
Зарегистрирован: Jan 2009
Репутация:
12,921
08-03-2012, 06:25 PM
(Сообщение последний раз редактировалось: 08-03-2012, 06:26 PM VISTALL.)
я видел ваш код - но там много кода , нужно просто writeObjectStream писать в обьекте а не то что вы сделали
Добавлено через 1 минуту
ах да
Цитата:Форум администраторов игровых серверов > Полезное > Программирование > Java
если б делать так как вы - эт неюзабельно)
Сообщений: 376
Тем: 12
Зарегистрирован: Jul 2012
Репутация:
1,000
Вы немного о другом думаете.
файл struct
struct
struct OrgHpRegenTable {
string class_name;
float[] ;
}
struct OrgMpRegenTable {
string class_name;
float[] org_mp;
}
struct OrgCpRegenTable {
string class_name;
float[] org_cp;
}
struct HpTable {
string class_name;
float[] hp;
}
struct MpTable {
string class_name;
float[] mp;
}
struct CpTable {
string class_name;
float[] cp;
}
struct CollisionBox {
float radius;
float height;
}
struct NoiseMoveMode {
byte sit;
byte stand;
byte low;
byte high;
}
struct HitCondBonus {
byte ahead;
byte side;
byte back;
byte high;
byte low;
byte dark;
byte rain;
}
struct BaseStats {
byte INT;
byte STR;
byte CON;
byte MEN;
byte DEX;
byte WIT;
}
struct Defend {
byte body;
byte legs;
byte helmet;
byte boots;
byte glovers;
}
struct MagicDefend {
byte left_earring;
byte right_erring;
byte left_ring;
byte rigth_ring;
byte neck;
}
struct MovingSpeed {
short walk_ground;
short run_ground;
short walk_sweem;
short run_sweem;
}
struct ClassBaseStats {
string class_name;
BaseStats base_stats;
Defend defend;
MagicDefend magic_defend;
CollisionBox collision_box;
MovingSpeed moving_speed;
string attack_type;
short attack_speed;
byte attack_range;
byte physical_attack;
byte rand_dam;
byte can_penetrate;
byte critical;
byte magic_attack;
short breath_bonus;
short safe_fall_height;
}
файл player.config.txt
player config txt
float[] level_bonus = (0.9,0.91,0.92,0.93,0.94,0.95,0.96,0.97,0.98,0.99,1,1.01,1.02,1.03,1.04,1.05,1.06,1.07,1.08,1.09,1.1,1.11,1.12,1.13,1.14,1.15,1.16,1.17,1.18,1.19,1.2,1.21,1.22,1.23,1.24,1.25,1.26,1.27,1.28,1.29,1.3,1.31,1.32,1.33,1.34,1.35,1.36,1.37,1.38,1.39,1.4,1.41,1.42,1.43,1.44,1.45,1.46,1.47,1.48,1.49,1.5,1.51,1.52,1.53,1.54,1.55,1.56,1.57,1.58,1.59,1.6,1.61,1.62,1.63,1.64,1.65,1.66,1.67,1.68,1.69,1.7,1.71,1.72,1.73,1.74,1.75,1.76,1.77,1.78,1.79,1.8,1.81,1.82,1.83,1.84,1.85,1.86,1.87,1.88);
short[] str_bonus = (-70,-69,-68,-66,-65,-64,-63,-61,-60,-58,-57,-55,-54,-52,-50,-49,-47,-45,-43,-41,-39,-37,-34,-32,-29,-27,-24,-22,-19,-16,-13,-10,-6,-3,1,4,8,12,16,20,24,29,33,38,43,48,54,59,65,71,77,83,90,97,104,111,119,127,135,143,152,161,171,180,191,201,212,223,235,247,259,272,286,299,314,329,344,360,377,394,412,430,449,469,489,511,533,555,579,603,629,655,682,710,739,770,801,833,867);
.....
ClassBaseStats[] class_base_stats_list = (
{FIGHTER, {21,40,43,25,30,11}, {31,18,12,7,8}, {9,9,5,5,13}, {8.0,23.5}, {80,115,50,50}, fist, 300, 20, 4, 10, 0, 4, 6, 100, 270},
{MAGE, {41,22,27,39,21,20}, {15,8,12,7,8}, {9,9,5,5,13}, {6.5,22.5}, {78,120,50,50}, fist, 300, 20, 3, 10, 0, 4, 6, 100, 220},
{ELVEN_FIGHTER, {23,36,36,26,35,14}, {31,18,12,7,8}, {9,9,5,5,13}, {7.5,23}, {90,125,50,50}, fist, 300, 20, 4, 10, 0, 4, 6, 150, 380},
{ELVEN_MAGE, {37,21,25,40,24,23}, {15,8,12,7,8}, {9,9,5,5,13}, {7.5,23}, {85,122,50,50}, fist, 300, 20, 3, 10, 0, 4, 6, 150, 330},
{DARK_FIGHTER, {25,41,32,26,34,12}, {31,18,12,7,8}, {9,9,5,5,13}, {7.0,23.5}, {85,122,50,50}, fist, 300, 20, 4, 10, 0, 4, 6, 150, 380},
{DARK_MAGE, {44,23,24,37,23,19}, {15,8,12,7,8}, {9,9,5,5,13}, {7.0,23.5}, {85,122,50,50}, fist, 300, 20, 3, 10, 0, 4, 6, 150, 330},
{ORC_FIGHTER, {18,40,47,27,26,12}, {31,18,12,7,8}, {9,9,5,5,13}, {7,27.0}, {70,117,50,50}, fist, 300, 25, 4, 10, 0, 4, 6, 90, 220},
{ORC_MAGE, {31,27,31,42,24,15}, {15,8,12,7,8}, {9,9,5,5,13}, {8.0,25.5}, {70,121,50,50}, fist, 300, 25, 3, 10, 0, 4, 6, 90, 280},
{DWARVEN_FIGHTER, {20,39,45,27,29,10}, {31,18,12,7,8}, {9,9,5,5,13}, {5.0,19.0}, {80,115,50,50}, fist, 300, 20, 4, 10, 0, 4, 6, 80, 200}
);
из этих двух получаем бинарный файл
заголовок
таблицу типов
таблицу данных
таблица типов содержит имя типа
и набор полей
file
header {
int signature = 'd','a','t','a',0,0,0,0;
}
TypeTable {
int count;
for(int i = 0 ; i < count ; i++) {
string name;
int field_count;
for(int i = 0 ; i < field_count ; i++) {
Index type;
zero_string name;
}
}
}
DataTable {
int count;
for(int i = 0 ; i < count ; i++) {
String name;
Index index;
byte[?] serialized_data
}
}
file {
header;
TypeTable;
DataTable;
}
Потом можно оперировать этими данными через SerializeReader
PlayerConfig
PHP код: <?php
public class PlayerConfig {
public final float[] level_bonus;
public final short[] str_bonus;
public final short[] int_bonus;
public final short[] con_bonus;
public final short[] men_bonus;
public final short[] dex_bonus;
public final short[] wit_bonus;
public PlayerConfig(String file) throws IOException {
SerializeReader reader = new SerializeReader(file);
reader.read();
DataTable table = reader.getDataTable();
//load level bonus
level_bonus = table.get("level_bonus").toFloatArray();
//stats bonus
str_bonus = table.get("str_bonus").toShortArray();
int_bonus = table.get("int_bonus").toShortArray();
con_bonus = table.get("con_bonus").toShortArray();
men_bonus = table.get("men_bonus").toShortArray();
dex_bonus = table.get("dex_bonus").toShortArray();
wit_bonus = table.get("wit_bonus").toShortArray();
//load org hp table
for(int i = 0 ; i < table.get("org_hp_table").size() ; i++) {
DataType data = table.get("org_hp_table").get(i);
PlayerClass.get(data.get("class_name").getString()).setOrgHpTable(data.get("org_hp").toFloatArray());
}
//load org mp table
for(int i = 0 ; i < table.get("org_mp_table").size() ; i++) {
DataType data = table.get("org_mp_table").get(i);
PlayerClass.get(data.get("class_name").getString()).setOrgMpTable(data.get("org_mp").toFloatArray());
}
//load org cp table
for(int i = 0 ; i < table.get("org_cp_table").size() ; i++) {
DataType data = table.get("org_cp_table").get(i);
PlayerClass.get(data.get("class_name").getString()).setOrgCpTable(data.get("org_cp").toFloatArray());
}
//load hp table
for(int i = 0 ; i < table.get("hp_table").size() ; i++) {
DataType data = table.get("hp_table").get(i);
PlayerClass.get(data.get("class_name").getString()).setOrgCpTable(data.get("hp").toFloatArray());
}
//load mp table
for(int i = 0 ; i < table.get("mp_table").size() ; i++) {
DataType data = table.get("mp_table").get(i);
PlayerClass.get(data.get("class_name").getString()).setOrgCpTable(data.get("mp").toFloatArray());
}
//load cp table
for(int i = 0 ; i < table.get("cp_table").size() ; i++) {
DataType data = table.get("cp_table").get(i);
PlayerClass.get(data.get("class_name").getString()).setOrgCpTable(data.get("cp").toFloatArray());
}
}
}
Тут сериализации java классов нету и не пахнет ими, только слово сериализации есть
ПС Где-то по такому принципу сериализация объектов в UE
Сообщений: 1,660
Тем: 9
Зарегистрирован: Feb 2009
Репутация:
10,142
Спасибо конечно за старания но все же, можно обойтись кодом в несколько строк с помощью Field f, f.set(null,null).
P.S. Если я правильно понял предназначение кода:redlol:
open-team.ru - Freya, HighFive...
|