void CLevel::saveNpcs() { return; CStringList npcData; //printf("SAVING NPCS\n"); for(int i = 0; i < npcs.count(); i++) { CNpc* npc = (CNpc*)npcs[i]; if(npc == NULL) continue; npcData.add(CString() << "REPLACENPC " << toString(i)); CPacket props; for(int ii = 0; ii < npcpropcount; ii++) { if(ii != ACTIONSCRIPT) props << (char) ii << npc->getProperty(ii); } npcData.add(props); npcData.add("REPLACENPCEND\r\n"); } CString fName; fName << "npcprops" << fSep << fileName << ".code"; npcData.save(fName.text()); }
void shutdownServer( int signal ) { if(hasShutdown) return; hasShutdown = true; serverRunning = false; serverSock.disconnect(); saveWeapons("weapons.txt"); serverFlags.save("serverflags.txt"); for(int i = playerList.count()-1; i >= 0; i--) delete ((CPlayer*)playerList[i]); if(lsConnected) ListServer_End(); for(int i = 0; i < levelList.count(); i++) { CLevel* level = (CLevel*)levelList[i]; level->saveNpcs(); delete level; } for(int i = 0; i < CMap::mapList.count(); i++) delete((CMap*)CMap::mapList[i]); for(int i = 0; i < weaponList.count(); i++) delete ((CWeapon*)weaponList[i]); errorOut("serverlog.txt", "Server shutdown."); #ifdef PSPSDK sceKernelExitGame(); #endif }
void saveWeapons(char* pFile) { CStringList weaponData; for(int i = 0; i < weaponList.count(); i++) { CString code; char modTime[30]; int index; CWeapon* weapon = (CWeapon*)weaponList[i]; index = weaponData.add("NEWWEAPON "); sprintf(modTime, "%li", (long int)weapon->modTime); // Save name. weaponData[index] << weapon->name << ","; // If the NPC doesn't have an image, write a hyphen. if ( weapon->image.length() == 0 ) weaponData[index] << "-" << ","; else weaponData[index] << weapon->image << ","; // Write the modification time. weaponData[index] << modTime; code = weapon->code; char* line = strtok(code.text(), "\xa7"); while(line != NULL) { weaponData.add(line); line = strtok(NULL, "\xa7"); } weaponData.add("ENDWEAPON\r\n"); } weaponData.save(pFile); }
int main(int argc, char *argv[]) { #ifdef PSPSDK pspDebugScreenInit(); SetupCallbacks(); #else // Shut down the server if we get a kill signal. signal( SIGINT, (sighandler_t) shutdownServer ); signal( SIGTERM, (sighandler_t) shutdownServer ); #endif /* Setup Data-Directory */ dataDir = CBuffer(argv[0]).replaceAll("\\", "/"); dataDir = dataDir.copy(0, dataDir.findl('/') + 1); programDir = dataDir; dataDir << "world/"; /* Main Initiating */ adminNames.load( __admin, sizeof(__admin) / sizeof(const char*) ); colourNames.load( __colours, sizeof(__colours) / sizeof(const char*) ); clothCommands.load( __cloths, sizeof(__cloths) / sizeof(const char*) ); defaultFiles.load( __defaultfiles, sizeof(__defaultfiles) / sizeof(const char*) ); playerIds.add(0); playerIds.add(0); npcIds.add(0); srand((int)time(NULL)); /* Load Important Files */ updateFile("rchelp.txt"); updateFile("rcmessage.txt"); updateFile("rules.txt"); updateFile("serverflags.txt"); updateFile("servermessage.html"); updateFile("foldersconfig.txt"); /* Load Settings */ if (!loadSettings("serveroptions.txt")) { errorOut("errorlog.txt", "Unable to load server settings.."); return 1; } /* Load Weapons */ if (!loadWeapons("weapons.txt")) { errorOut("errorlog.txt", "Unable to load weapons from weapons.txt.."); return 1; } /* Initialize Sockets */ serverSock.setType( SOCKET_TYPE_SERVER ); serverSock.setProtocol( SOCKET_PROTOCOL_TCP ); serverSock.setOptions( SOCKET_OPTION_NONBLOCKING ); serverSock.setDescription( "serverSock" ); CString empty; if ( serverSock.init( empty, serverPort ) ) return 1; // Connect server socket. if ( serverSock.connect() ) { errorOut("errorlog.txt", CString() << "SOCK ERROR: Unable to listen on port: " << serverPort); return 1; } /* Server Finished Loading */ printf("GServer 2 by 39ster\nSpecial thanks to Marlon, Agret, Pac300, 39ster and others for porting the \noriginal 1.39 gserver to 2.1\nServer listening on port: %s\nServer version: Build %s\n\n", serverPort.text(), listServerFields[3].text()); errorOut("serverlog.txt", "Server started"); if ( listServerFields[5] == "localhost" ) errorOut("serverlog.txt", "[DEBUG_LOCALHOSTMODE] Localhost mode is activated.\nListserver communication & account authentication are disabled.", true); serverRunning = true; if ( !(listServerFields[5] == "localhost") ) if (!lsConnected) ListServer_Connect(); while (serverRunning) { long long second = time(NULL); while (second == time(NULL)) { acceptNewPlayers(serverSock); for (int i = 0; i < newPlayers.count(); i ++) { CPlayer* player = (CPlayer*)newPlayers[i]; player->main(); if (player->deleteMe) { delete player; i--; } } for(int i = 0; i < playerList.count(); i++) { CPlayer* player = (CPlayer*)playerList[i]; player->main(); if(player->deleteMe) { delete player; i--; } } // Was moved so it can process faster. - Joey ListServer_Main(); wait(10); } doTimer(); gameTime ++; NOLEVEL->reset(); // Every 30 seconds if (gameTime % 30 == 0) { ListServer_Send(CPacket() << (char)SLSPING << "\n"); } // Every 10 seconds if (gameTime % 10 == 0) { CPacket pPacket; CString file; for (int i = 0; i < playerList.count(); i++) { CPlayer *player = (CPlayer *)playerList[i]; file << player->accountName << "," << player->nickName << "," << player->levelName << "," << toString(player->x) << "," << toString(player->y) << "," << toString(player->ap) << "\n"; } file.save("logs/playerlist.txt"); serverFlags.save("serverflags.txt"); } //Every 5 seconds? int current = getNWTime(); if (nwTime != current) { nwTime = current; for (int i = 0; i < playerList.count(); i++) { CPacket out; out << (char)NEWWORLDTIME; out.writeByte4(current); ((CPlayer*)playerList[i])->sendPacket(out); } } } }