World-Builder - KimiorV - 14.04.2016
Code: enum COURSE
{
UP,
DOWN,
FRONT,
BACK,
RIGHT,
LEFT,
};
enum PACKET
{
WB_VOB_START,
WB_VOB_STOP,
WB_VOB,
};
class WorldBuilder
{
constructor(_maxVobs)
{
sendStart = false;
vobList = [];
scrollList = 0;
vobsWb = [];
maxVobs = _maxVobs;
wbStart = false;
controlVob = null;
collision = false;
speed = 50;
draws = {
wb = createDraw("World Builder v0.3.19", "FONT_OLD_10_WHITE_HI.TGA", 6150, 800, 255, 255, 255),
vob = createDraw("Wybrany vob: Brak", "FONT_OLD_10_WHITE_HI.TGA", 6150, 1000, 255, 255, 255),
vobLast = createDraw("Ostatni vob: Brak", "FONT_OLD_10_WHITE_HI.TGA", 6150, 1200, 255, 255, 255),
vobPos = createDraw("Pozycja", "FONT_OLD_10_WHITE_HI.TGA", 6150, 1500, 255, 255, 255),
vobPosX = createDraw("X: 0", "FONT_OLD_10_WHITE_HI.TGA", 6150, 1700, 255, 255, 255),
vobPosY = createDraw("Y: 0", "FONT_OLD_10_WHITE_HI.TGA", 6150, 1900, 255, 255, 255),
vobPosZ = createDraw("Z: 0", "FONT_OLD_10_WHITE_HI.TGA", 6150, 2100, 255, 255, 255),
vobCollision = createDraw("Kolizja aktywna: " + (collision?"Tak":"Nie"), "FONT_OLD_10_WHITE_HI.TGA", 6150, 2300, 255, 255, 255),
speedKeyBoard = createDraw("Szybkość poruszania: " + speed, "FONT_OLD_10_WHITE_HI.TGA", 6150, 2500, 255, 255, 255),
vobAmount = createDraw("Liczba VOBow: " + vobsWb.len() + "/" + maxVobs, "FONT_OLD_10_WHITE_HI.TGA", 6150, 2800, 255, 255, 255),
};
setTimer(function(WorldBuilder)
{
if(WorldBuilder.wbStart) {
local position = getVobPosition(WorldBuilder.controlVob);
setDrawText(WorldBuilder.draws.vobPosX, "X:" + position.x);
setDrawText(WorldBuilder.draws.vobPosY, "Y:" + position.y);
setDrawText(WorldBuilder.draws.vobPosZ, "Z:" + position.z);
}
}, 500, true, this);
};
function worldBuilder()
{
wbStart = wbStart?false:true;
checkControlVob(vobList[scrollList]);
foreach(i in draws)
setDrawVisible(i, wbStart);
setFreeze(wbStart);
};
function checkControlVob(vobName)
{
if(controlVob) {
setDefaultCamera(); destroyVob(controlVob);
controlVob = null;
} else
setCameraBehindVob(controlVob = createVob(vobName, getPosition().x, getPosition().y, getPosition().z, 0, 0, 0));
setDrawText(draws.vob, "Wybrany vob: " + vobName);
};
function scrollControlVob(value)
{
if(wbStart) {
local position = getVobPosition(controlVob); local rotation = getVobRotation(controlVob);
if (vobList.len() > (scrollList + value) && 0 <= (scrollList + value))
scrollList += value;
else
if((scrollList + value) >= vobList.len())
scrollList = 0; else scrollList = vobList.len() - 1;
destroyVob(controlVob);
setCameraBehindVob(controlVob = createVob(vobList[scrollList], position.x, position.y, position.z, rotation.x, rotation.y, rotation.z));
setDrawText(draws.vob, "Wybrany vob: " + vobList[scrollList]);
}
};
function setSpeed(value)
{
if(wbStart) {
if((speed + value) > 0)
speed += value;
setDrawText(draws.speedKeyBoard, "Szybkość poruszania: " + speed);
}
};
function checkCollsion()
{
if(wbStart) {
setDrawText(draws.vobCollision, "Kolizja aktywna: " + ((collision = collision?false:true)?"Tak":"Nie"));
}
};
function addVob()
{
if(wbStart) {
if((vobsWb.len() - 1) < maxVobs) {
vobsWb.push(controlVob);
setVobCollision(controlVob, collision);
local rotation = getVobRotation(controlVob); local position = getVobPosition(controlVob);
//sendPacket(RELIABLE_ORDERED, PACKET.WB_VOB + " " + vobList[scrollList] + " " + (collision?1:0).tostring() + " " + position.x + " " + position.y + " " + position.z + " " + rotation.x + " " + rotation.y + " " + rotation.z);
setCameraBehindVob(controlVob = createVob(vobList[scrollList], position.x, position.y, position.z, rotation.x, rotation.y, rotation.z));
setDrawText(draws.vobLast, "Ostatni vob: " + vobList[scrollList]);
}
setDrawText(draws.vobAmount, "Liczba VOBow: " + vobsWb.len() + "/" + maxVobs);
}
};
function removeLastVob()
{
local vobLen = vobsWb.len() - 1;
if(wbStart && vobLen >= 0) {
destroyVob(vobsWb[vobLen]);
vobsWb.remove(vobLen);
if(vobsWb.len() > 0)
setDrawText(draws.vobLast, "Ostatni vob: " + getVobFileName(vobsWb[vobsWb.len() - 1]));
else
setDrawText(draws.vobLast, "Ostatni vob: Brak");
}
setDrawText(draws.vobAmount, "Liczba VOBow: " + vobsWb.len() + "/" + maxVobs);
};
function keyBoardPos(course)
{
if(wbStart) {
local position = getVobPosition(controlVob); local rotation = getVobRotation(controlVob);
switch(course) {
case COURSE.UP:
setVobPosition(controlVob, position.x, position.y + speed, position.z);
break;
case COURSE.DOWN:
setVobPosition(controlVob, position.x, position.y - speed, position.z);
break;
case COURSE.LEFT:
setVobPosition(controlVob, position.x + (sin(((rotation.y - 90) - floor(rotation.y / 360) * 360) * 3.14 / 180.0) * speed), position.y, position.z + (cos(((rotation.y - 90) - floor(rotation.y / 360) * 360) * 3.14 / 180.0) * speed));
break;
case COURSE.RIGHT:
setVobPosition(controlVob, position.x + (sin(((rotation.y + 90) - floor(rotation.y / 360) * 360) * 3.14 / 180.0) * speed), position.y, position.z + (cos(((rotation.y + 90) - floor(rotation.y / 360) * 360) * 3.14 / 180.0) * speed));
break;
case COURSE.FRONT:
setVobPosition(controlVob, position.x + (sin(rotation.y * 3.14 / 180.0) * speed), position.y, position.z + (cos(rotation.y * 3.14 / 180.0) * speed));
break;
case COURSE.BACK:
setVobPosition(controlVob, position.x - (sin(rotation.y * 3.14 / 180.0) * speed), position.y, position.z - (cos(rotation.y * 3.14 / 180.0) * speed));
break;
}
}
};
function keyBoardRot(course = null)
{
if(wbStart) {
local rotation = getVobRotation(controlVob);
switch(course) {
case COURSE.UP:
setVobRotation(controlVob, rotation.x + ceil(speed / 10), rotation.y, rotation.z);
break;
case COURSE.DOWN:
setVobRotation(controlVob, rotation.x - ceil(speed / 10), rotation.y, rotation.z);
break;
case COURSE.RIGHT:
setVobRotation(controlVob, rotation.x, rotation.y + ceil(speed / 10), rotation.z);
break;
case COURSE.LEFT:
setVobRotation(controlVob, rotation.x, rotation.y - ceil(speed / 10), rotation.z);
break;
case COURSE.FRONT:
setVobRotation(controlVob, rotation.x, rotation.y, rotation.z + ceil(speed / 10));
break;
case COURSE.BACK:
setVobRotation(controlVob, rotation.x, rotation.y, rotation.z - ceil(speed / 10));
break;
default:
setVobRotation(controlVob, 0, 0, 0);
}
}
};
function switchSend(value = false)
{
if(value) {
for(local i = 0; i < vobsWb.len(); i++)
destroyVob(vobsWb[i]);
vobsWb.clear();
}
sendStart = value;
};
function readPackets(data)
{
if(sendStart) {
local packet = sscanf("dsdfffddd", data);
local vobPointer = createVob(packet[1], packet[3], packet[4], packet[5], packet[6], packet[7], packet[8])
setVobCollision(vobPointer, packet[2]);
vobsWb.push(vobPointer);
}
};
function sendPackets()
{
if(wbStart && vobsWb.len() > 0) {
sendPacket(RELIABLE_ORDERED, PACKET.WB_VOB_START.tostring());
for(local i = 0; i < vobsWb.len(); i++) {
local vobPointer = vobsWb[i]; local position = getVobPosition(vobPointer); local rotation = getVobRotation(vobPointer);
sendPacket(RELIABLE_ORDERED, PACKET.WB_VOB + " " + getVobFileName(vobPointer) + " " + (getVobCollision(vobPointer)?1:0).tostring() + " " + position.x + " " + position.y + " " + position.z + " " + rotation.x + " " + rotation.y + " " + rotation.z);
}
sendPacket(RELIABLE_ORDERED, PACKET.WB_VOB_STOP.tostring());
}
setDrawText(draws.vobAmount, "Liczba VOBow: " + vobsWb.len() + "/" + maxVobs);
};
sendStart = false;
vobList = null;
scrollList = 0;
vobsWb = null;
maxVobs = 0;
wbStart = false;
controlVob = null;
collision = false;
speed = 50;
draws = null;
};
arenaBuilder <- WorldBuilder(1000);
addEvent("onKey", function(key, letter)
{
switch(key) {
case KEY_F12: arenaBuilder.worldBuilder(); break;
case KEY_F5: playerList.toggle(); break;
case KEY_T: multiStats.hide(); break;
case KEY_RETURN: arenaBuilder.addVob(); break;
case KEY_INSERT: arenaBuilder.checkCollsion(); break;
case KEY_DELETE: arenaBuilder.removeLastVob(); break;
case KEY_HOME: arenaBuilder.keyBoardRot(); break;
case KEY_END: arenaBuilder.sendPackets(); break;
case KEY_PRIOR: arenaBuilder.setSpeed(1); break;
case KEY_NEXT: arenaBuilder.setSpeed(-1); break;
case KEY_I: arenaBuilder.scrollControlVob(1); break;
case KEY_U: arenaBuilder.scrollControlVob(-1); break;
case KEY_W: arenaBuilder.keyBoardPos(COURSE.FRONT); break;
case KEY_S: arenaBuilder.keyBoardPos(COURSE.BACK); break;
case KEY_K: arenaBuilder.keyBoardPos(COURSE.UP); break;
case KEY_M: arenaBuilder.keyBoardPos(COURSE.DOWN); break;
case KEY_A: arenaBuilder.keyBoardPos(COURSE.LEFT); break;
case KEY_D: arenaBuilder.keyBoardPos(COURSE.RIGHT); break;
case KEY_Q: arenaBuilder.keyBoardRot(COURSE.LEFT); break;
case KEY_E: arenaBuilder.keyBoardRot(COURSE.RIGHT); break;
case KEY_NUMPAD8: arenaBuilder.keyBoardRot(COURSE.UP); break;
case KEY_NUMPAD2: arenaBuilder.keyBoardRot(COURSE.DOWN); break;
case KEY_NUMPAD4: arenaBuilder.keyBoardRot(COURSE.FRONT); break;
case KEY_NUMPAD6: arenaBuilder.keyBoardRot(COURSE.BACK); break;
}
});
addEvent("onPacket", function(data)
{
local params = sscanf("d", data);
switch(params[0]) {
case PACKET.WB_VOB: arenaBuilder.readPackets(data); break;
case PACKET.WB_VOB_START: arenaBuilder.switchSend(true); break;
case PACKET.WB_VOB_STOP: arenaBuilder.switchSend(false); break;
}
});
Strona klienta: http://pastebin.com/s7Zv8PkB
Code: enum PACKET
{
WB_VOB_START,
WB_VOB_STOP,
WB_VOB,
};
class WorldBuilder
{
constructor(_path)
{
vobsWb = [];
path = _path;
readStart = false
local wbFile = io.file(_path, "r+");
foreach(value in wbFile.readLines())
vobsWb.push(value);
wbFile.close();
};
function switchRead(pid, value = false)
{
readStart = value;
if(value)
vobsWb.clear();
else {
sendPackets(0, getPlayersCount());
local wbFile = io.file(path, "w+");
for(local i = 0; i < vobsWb.len(); i++)
wbFile.write(vobsWb[i], true);
wbFile.close();
}
};
function readPackets(data)
{
if(readStart) {
vobsWb.push(data);
}
};
function sendPackets(idX, idY)
{
for(local i = idX; i < idY; i++)
{
sendPacket(i, RELIABLE_ORDERED, PACKET.WB_VOB_START.tostring());
for(local j = 0; j < vobsWb.len(); j++)
sendPacket(i, RELIABLE_ORDERED, vobsWb[j]);
sendPacket(i, RELIABLE_ORDERED, PACKET.WB_VOB_STOP.tostring());
}
};
vobsWb = null;
path = null;
readStart = false;
};
addEvent("onPacket", function(pid, data)
{
local params = sscanf("d", data);
switch(params[0]) {
case PACKET.WB_VOB: wb.readPackets(data); break;
case PACKET.WB_VOB_START: wb.switchRead(pid, true); break;
case PACKET.WB_VOB_STOP: wb.switchRead(pid, false); break;
}
});
Strona serwera: http://pastebin.com/bwV5pNFv
Jeśli będę miał czas to w przyszłości poprawię zapis WB i przesyłanie pakietów, które aktualnie jest ekhm, słabe.
RE: World-Builder - Quarchodron - 14.04.2016
Fajny. Gj.
RE: World-Builder - Ferios - 14.04.2016
Lepszy niż twój? ^^
RE: World-Builder - Quarchodron - 14.04.2016
Jasne.
RE: World-Builder - KimiorV - 14.04.2016
Taka uwaga co do tego WB żeby działało trzeba dodać ten skrypt do kodu: http://gothic-online.com.pl/forum/showthread.php?tid=1238
No i oczywiście trzeba załadować jakąś listę plików 3ds.
|