Thread Rating:
  • 1 Vote(s) - 5 Average
  • 1
  • 2
  • 3
  • 4
  • 5
World-Builder
#1
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.
Reply
#2
Fajny. Gj.
Reply
#3
Lepszy niż twój? ^^
[Image: Ru8zE9Y.png]
Reply
#4
Jasne.
Reply
#5
Taka uwaga co do tego WB żeby działało trzeba dodać ten skrypt do kodu: http://gothic-online.com.pl/forum/showth...p?tid=1238
No i oczywiście trzeba załadować jakąś listę plików 3ds.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)