summaryrefslogtreecommitdiff
path: root/src/server.h
Commit message (Collapse)AuthorAge
...
* Move tool definitions to scriptPerttu Ahola2011-11-29
|
* Tool definition transfer to clientPerttu Ahola2011-11-29
|
* GameDef compilesPerttu Ahola2011-11-29
|
* Create framework for getting rid of global definitions of ↵Perttu Ahola2011-11-29
| | | | node/tool/item/whatever types
* Scripting WIPPerttu Ahola2011-11-29
|
* Improve Connection with threading and some kind of congestion controlPerttu Ahola2011-10-20
|
* Add /clearobjectsPerttu Ahola2011-10-18
|
* When granting or revoking privileges, notify the target player tooPerttu Ahola2011-10-16
|
* Handle death and respawn betterPerttu Ahola2011-10-15
|
* Header file tweaking; mainly for speedPerttu Ahola2011-10-12
|
* Fixed/extended/modified ban stuff to be good for inclusionPerttu Ahola2011-08-12
|
* added ipban supportConstantin Wenger2011-08-12
| | | | | commands: /#ipban <nick> /#ipunban <ip>
* Notify other players of wielded item changeGiuseppe Bilotta2011-08-11
|
* fix to the formerPerttu Ahola2011-07-30
|
* Server configuration is now written when "/#setting whatever = whatever" is ↵Perttu Ahola2011-07-30
| | | | issued.
* map unloading is now a whole lot betterPerttu Ahola2011-06-27
|
* moved map generator to separate source filesPerttu Ahola2011-06-25
|
* Reduced server CPU usage on NodeMetadata step()s. Also furnace now cooks ↵Perttu Ahola2011-05-31
| | | | while no players are near it.
* Reduced the CPU usage of the sent block selector algorithmPerttu Ahola2011-05-31
|
* hopefully fixed the privilege problemsPerttu Ahola2011-05-29
| | | | | --HG-- extra : rebase_source : 9826d20176134a53ff232816a10407465d8c0f50
* player passwords and privileges in world/auth.txtPerttu Ahola2011-05-29
| | | | | --HG-- extra : rebase_source : 7260636295d9068fbeeddf4143c89f2b8a91446c
* Preliminary "active block" stuff + set up test code to grow grass.Perttu Ahola2011-05-22
|
* Passwords - password entry at main menu, stored and checked by serverCiaran Gultnieks2011-05-20
|
* Improved server commands and added player permissions.Ciaran Gultnieks2011-05-16
| | | | | --HG-- extra : rebase_source : 178fe08f10b7de3ebaba088bd24faad795114216
* random comment updatesPerttu Ahola2011-04-30
|
* Optimized map saving and sending (server-side)Perttu Ahola2011-04-26
|
* Some work-in-progress in hp and mobs and a frightening amount of random fixes.Perttu Ahola2011-04-21
|
* Some progress on transitioning from MapBlockObject to ActiveObject.Perttu Ahola2011-04-08
|
* Server: Only send node removal/addition to client if client's player is near ↵Perttu Ahola2011-04-06
| | | | it. Otherwise set the modified blocks unsent.
* Chests work now!Perttu Ahola2011-04-04
|
* mainly work on object scripting apiPerttu Ahola2011-02-23
|
* Temporary commit; lots of test code and stuffPerttu Ahola2011-02-21
|
* Ctrl+C handling on POSIX, some commands for server and other tweakingPerttu Ahola2011-02-15
|
* mapgen stuffPerttu Ahola2011-02-05
|
* Now texture handling is fast. Also now players are saved on disk.Perttu Ahola2011-01-28
|
* OMG! Main Menu!Perttu Ahola2011-01-23
|
* fixed erroneus handling of many players with no peer existing at same timePerttu Ahola2011-01-18
|
* minecraft-style water done (but no texture animation or sound)Perttu Ahola2011-01-17
|
* old water removed, some fixes here and therePerttu Ahola2011-01-17
|
* fine-tuning of map generator and server and stuff.Perttu Ahola2011-01-17
|
* Players are left on server while server is running. No passwords yet.Perttu Ahola2011-01-15
|
* Added a more flexible path system (and fixed some minor stuff)Perttu Ahola2011-01-07
|
* disconnect method to connection to be used instead of just timing outPerttu Ahola2010-12-24
|
* changes to handing of digging (non backwards-compatible i guess)Perttu Ahola2010-12-23
|
* some work-in-progressPerttu Ahola2010-12-22
|
* organizing stuff.Perttu Ahola2010-12-21
|
* working time-of-day sending from server to clientPerttu Ahola2010-12-20
|
* day/night working client sidePerttu Ahola2010-12-19
|
* before adding day/night lightingPerttu Ahola2010-12-18
| | | | | --HG-- rename : data/light.png => data/cloud.png
* working nicelyPerttu Ahola2010-12-13
|
an> MutexedQueue<MeshUpdateResult> m_queue_out; IGameDef *m_gamedef; }; enum ClientEventType { CE_NONE, CE_PLAYER_DAMAGE, CE_PLAYER_FORCE_MOVE, CE_DEATHSCREEN, CE_SHOW_FORMSPEC, CE_SPAWN_PARTICLE, CE_ADD_PARTICLESPAWNER, CE_DELETE_PARTICLESPAWNER, CE_HUDADD, CE_HUDRM, CE_HUDCHANGE }; struct ClientEvent { ClientEventType type; union{ struct{ } none; struct{ u8 amount; } player_damage; struct{ f32 pitch; f32 yaw; } player_force_move; struct{ bool set_camera_point_target; f32 camera_point_target_x; f32 camera_point_target_y; f32 camera_point_target_z; } deathscreen; struct{ std::string *formspec; std::string *formname; } show_formspec; struct{ } textures_updated; struct{ v3f *pos; v3f *vel; v3f *acc; f32 expirationtime; f32 size; bool collisiondetection; std::string *texture; } spawn_particle; struct{ u16 amount; f32 spawntime; v3f *minpos; v3f *maxpos; v3f *minvel; v3f *maxvel; v3f *minacc; v3f *maxacc; f32 minexptime; f32 maxexptime; f32 minsize; f32 maxsize; bool collisiondetection; std::string *texture; u32 id; } add_particlespawner; struct{ u32 id; } delete_particlespawner; struct{ u32 id; u8 type; v2f *pos; std::string *name; v2f *scale; std::string *text; u32 number; u32 item; u32 dir; v2f *align; v2f *offset; } hudadd; struct{ u32 id; } hudrm; struct{ u32 id; HudElementStat stat; v2f *v2fdata; std::string *sdata; u32 data; } hudchange; }; }; /* Packet counter */ class PacketCounter { public: PacketCounter() { } void add(u16 command) { std::map<u16, u16>::iterator n = m_packets.find(command); if(n == m_packets.end()) { m_packets[command] = 1; } else { n->second++; } } void clear() { for(std::map<u16, u16>::iterator i = m_packets.begin(); i != m_packets.end(); ++i) { i->second = 0; } } void print(std::ostream &o) { for(std::map<u16, u16>::iterator i = m_packets.begin(); i != m_packets.end(); ++i) { o<<"cmd "<<i->first <<" count "<<i->second <<std::endl; } } private: // command, count std::map<u16, u16> m_packets; }; class Client : public con::PeerHandler, public InventoryManager, public IGameDef { public: /* NOTE: Nothing is thread-safe here. */ Client( IrrlichtDevice *device, const char *playername, std::string password, MapDrawControl &control, IWritableTextureSource *tsrc, IWritableShaderSource *shsrc, IWritableItemDefManager *itemdef, IWritableNodeDefManager *nodedef, ISoundManager *sound, MtEventManager *event, bool ipv6 ); ~Client(); /* request all threads managed by client to be stopped */ void Stop(); bool isShutdown(); /* The name of the local player should already be set when calling this, as it is sent in the initialization. */ void connect(Address address); /* returns true when m_con.Connected() == true AND m_server_ser_ver != SER_FMT_VER_INVALID throws con::PeerNotFoundException if connection has been deleted, eg. timed out. */ bool connectedAndInitialized(); /* Stuff that references the environment is valid only as long as this is not called. (eg. Players) If this throws a PeerNotFoundException, the connection has timed out. */ void step(float dtime); void ProcessData(u8 *data, u32 datasize, u16 sender_peer_id); // Returns true if something was received bool AsyncProcessPacket(); bool AsyncProcessData(); void Send(u16 channelnum, SharedBuffer<u8> data, bool reliable); void interact(u8 action, const PointedThing& pointed); void sendNodemetaFields(v3s16 p, const std::string &formname, const std::map<std::string, std::string> &fields); void sendInventoryFields(const std::string &formname, const std::map<std::string, std::string> &fields); void sendInventoryAction(InventoryAction *a); void sendChatMessage(const std::wstring &message); void sendChangePassword(const std::wstring oldpassword, const std::wstring newpassword); void sendDamage(u8 damage); void sendBreath(u16 breath); void sendRespawn(); ClientEnvironment& getEnv() { return m_env; } // Causes urgent mesh updates (unlike Map::add/removeNodeWithEvent) void removeNode(v3s16 p); void addNode(v3s16 p, MapNode n, bool remove_metadata = true); void setPlayerControl(PlayerControl &control); void selectPlayerItem(u16 item); u16 getPlayerItem() const { return m_playeritem; } // Returns true if the inventory of the local player has been // updated from the server. If it is true, it is set to false. bool getLocalInventoryUpdated(); // Copies the inventory of the local player to parameter void getLocalInventory(Inventory &dst); /* InventoryManager interface */ Inventory* getInventory(const InventoryLocation &loc); void inventoryAction(InventoryAction *a); // Gets closest object pointed by the shootline // Returns NULL if not found ClientActiveObject * getSelectedActiveObject( f32 max_d, v3f from_pos_f_on_map, core::line3d<f32> shootline_on_map ); // Prints a line or two of info void printDebugInfo(std::ostream &os); std::list<std::string> getConnectedPlayerNames(); float getAnimationTime(); int getCrackLevel(); void setCrack(int level, v3s16 pos); u16 getHP(); u16 getBreath(); bool checkPrivilege(const std::string &priv) { return (m_privileges.count(priv) != 0); } bool getChatMessage(std::wstring &message); void typeChatMessage(const std::wstring& message); u64 getMapSeed(){ return m_map_seed; } void addUpdateMeshTask(v3s16 blockpos, bool ack_to_server=false, bool urgent=false); // Including blocks at appropriate edges void addUpdateMeshTaskWithEdge(v3s16 blockpos, bool ack_to_server=false, bool urgent=false); void addUpdateMeshTaskForNode(v3s16 nodepos, bool ack_to_server=false, bool urgent=false); // Get event from queue. CE_NONE is returned if queue is empty. ClientEvent getClientEvent(); bool accessDenied() { return m_access_denied; } std::wstring accessDeniedReason() { return m_access_denied_reason; } bool itemdefReceived() { return m_itemdef_received; } bool nodedefReceived() { return m_nodedef_received; } bool mediaReceived() { return m_media_downloader == NULL; } float mediaReceiveProgress(); void afterContentReceived(IrrlichtDevice *device, gui::IGUIFont* font); float getRTT(void); // IGameDef interface virtual IItemDefManager* getItemDefManager(); virtual INodeDefManager* getNodeDefManager(); virtual ICraftDefManager* getCraftDefManager(); virtual ITextureSource* getTextureSource(); virtual IShaderSource* getShaderSource(); virtual u16 allocateUnknownNodeId(const std::string &name); virtual ISoundManager* getSoundManager(); virtual MtEventManager* getEventManager(); virtual bool checkLocalPrivilege(const std::string &priv) { return checkPrivilege(priv); } virtual scene::IAnimatedMesh* getMesh(const std::string &filename); // The following set of functions is used by ClientMediaDownloader // Insert a media file appropriately into the appropriate manager bool loadMedia(const std::string &data, const std::string &filename); // Send a request for conventional media transfer void request_media(const std::list<std::string> &file_requests); // Send a notification that no conventional media transfer is needed void received_media(); private: // Virtual methods from con::PeerHandler void peerAdded(con::Peer *peer); void deletingPeer(con::Peer *peer, bool timeout); void ReceiveAll(); void Receive(); void sendPlayerPos(); // Send the item number 'item' as player item to the server void sendPlayerItem(u16 item); float m_packetcounter_timer; float m_connection_reinit_timer; float m_avg_rtt_timer; float m_playerpos_send_timer; float m_ignore_damage_timer; // Used after server moves player IntervalLimiter m_map_timer_and_unload_interval; IWritableTextureSource *m_tsrc; IWritableShaderSource *m_shsrc; IWritableItemDefManager *m_itemdef; IWritableNodeDefManager *m_nodedef; ISoundManager *m_sound; MtEventManager *m_event; MeshUpdateThread m_mesh_update_thread; ClientEnvironment m_env; con::Connection m_con; IrrlichtDevice *m_device; // Server serialization version u8 m_server_ser_ver; u16 m_playeritem; bool m_inventory_updated; Inventory *m_inventory_from_server; float m_inventory_from_server_age; std::set<v3s16> m_active_blocks; PacketCounter m_packetcounter; // Block mesh animation parameters float m_animation_time; int m_crack_level; v3s16 m_crack_pos; // 0 <= m_daynight_i < DAYNIGHT_CACHE_COUNT //s32 m_daynight_i; //u32 m_daynight_ratio; Queue<std::wstring> m_chat_queue; // The seed returned by the server in TOCLIENT_INIT is stored here u64 m_map_seed; std::string m_password; bool m_access_denied; std::wstring m_access_denied_reason; Queue<ClientEvent> m_client_event_queue; bool m_itemdef_received; bool m_nodedef_received; ClientMediaDownloader *m_media_downloader; // time_of_day speed approximation for old protocol bool m_time_of_day_set; float m_last_time_of_day_f; float m_time_of_day_update_timer; // An interval for generally sending object positions and stuff float m_recommended_send_interval; // Sounds float m_removed_sounds_check_timer; // Mapping from server sound ids to our sound ids std::map<s32, int> m_sounds_server_to_client; // And the other way! std::map<int, s32> m_sounds_client_to_server; // And relations to objects std::map<int, u16> m_sounds_to_objects; // Privileges std::set<std::string> m_privileges; // Detached inventories // key = name std::map<std::string, Inventory*> m_detached_inventories; // Storage for mesh data for creating multiple instances of the same mesh std::map<std::string, std::string> m_mesh_data; }; #endif // !CLIENT_HEADER