@@ -78,81 +78,16 @@ public void run() {
7878 synchronized (core .getActiveConnectionsMap ()) {
7979 for (Client c : core .getActiveConnectionsMap ().values ()) {
8080 if (c .getParent () != null ) {
81- if ((System .currentTimeMillis () - c .getSession ().getLastReadTime ()) > 300000 ) {
81+ if ((System .currentTimeMillis () - c .getSession ().getLastReadTime ()) > 300000 && c . getSession (). getAttribute ( "disconnectTask" ) == null ) {
8282 disconnect (c .getSession ());
8383 }
8484 }
8585 }
8686 }
8787 }
8888
89- public void disconnect (IoSession session ) {
90- Client client = core .getClient ((Integer ) session .getAttribute ("connectionId" ));
91-
92- if (client == null )
93- return ;
94-
95- if (client .getParent () == null )
96- return ;
97-
98- CreatureObject object = (CreatureObject ) client .getParent ();
99- object .setInviteCounter (0 );
100- object .setInviteSenderId (0 );
101- object .setInviteSenderName ("" );
102- object .setClient (null );
103- PlayerObject ghost = (PlayerObject ) object .getSlottedObject ("ghost" );
104-
105- if (object .getGroupId () != 0 )
106- core .groupService .handleGroupDisband (object );
107-
108- Point3D objectPos = object .getWorldPosition ();
109-
110- List <AbstractCollidable > collidables = core .simulationService .getCollidables (object .getPlanet (), objectPos .x , objectPos .z , 512 );
111-
112- for (AbstractCollidable collidable : collidables ) {
113- collidables .remove (object );
114- }
115-
116-
117- if (ghost != null ) {
118- String objectShortName = object .getCustomName ();
119-
120- if (object .getCustomName ().contains (" " )) {
121- String [] splitName = object .getCustomName ().toLowerCase ().split (" " );
122- objectShortName = splitName [0 ];
123- }
124-
125- core .chatService .playerStatusChange (objectShortName , (byte ) 0 );
126- }
127-
128- session .suspendWrite ();
129-
130- boolean remove = core .simulationService .remove (object , object .getPosition ().x , object .getPosition ().z );
131- if (remove )
132- System .out .println ("Successful quadtree remove" );
133-
134- //if(object.getContainer() == null) {
135- HashSet <Client > oldObservers = new HashSet <Client >(object .getObservers ());
136- for (Iterator <Client > it = oldObservers .iterator (); it .hasNext ();) {
137- Client observerClient = it .next ();
138- if (observerClient .getParent () != null && !(observerClient .getSession () == session )) {
139- observerClient .getParent ().makeUnaware (object );
140- }
141- }
142- //} else {
143- // object.getContainer().remove(object);
144- //}
145-
146-
147- object .createTransaction (core .getCreatureODB ().getEnvironment ());
148- core .getCreatureODB ().put (object , Long .class , CreatureObject .class , object .getTransaction ());
149- object .getTransaction ().commitSync ();
150- core .objectService .destroyObject (object );
151-
152- core .getActiveConnectionsMap ().remove ((Integer ) session .getAttribute ("connectionId" ));
153- }
15489
155- }, 15 , 15 , TimeUnit .MINUTES );
90+ }, 10 , 10 , TimeUnit .MINUTES );
15691
15792 }
15893
@@ -169,7 +104,7 @@ public void handlePacket(IoSession session, IoBuffer data) throws Exception {
169104 data .position (0 );
170105 clientIdMsg .deserialize (data );
171106
172- Client client = core .getClient (( Integer ) session . getAttribute ( "connectionId" ) );
107+ Client client = core .getClient (session );
173108 if (client == null ) {
174109 System .out .println ("NULL Client" );
175110 return ;
@@ -239,6 +174,80 @@ public void handlePacket(IoSession session, IoBuffer data) throws Exception {
239174
240175
241176 }
177+
178+ public void disconnect (IoSession session ) {
179+ Client client = core .getClient (session );
180+
181+ if (client == null )
182+ return ;
183+
184+ if (client .getParent () == null )
185+ return ;
186+
187+ CreatureObject object = (CreatureObject ) client .getParent ();
188+ object .setInviteCounter (0 );
189+ object .setInviteSenderId (0 );
190+ object .setInviteSenderName ("" );
191+ object .setClient (null );
192+ PlayerObject ghost = (PlayerObject ) object .getSlottedObject ("ghost" );
193+
194+ if (ghost == null )
195+ return ;
196+
197+ if (object .getGroupId () != 0 )
198+ core .groupService .handleGroupDisband (object );
199+
200+ Point3D objectPos = object .getWorldPosition ();
201+
202+ List <AbstractCollidable > collidables = core .simulationService .getCollidables (object .getPlanet (), objectPos .x , objectPos .z , 512 );
203+
204+ for (AbstractCollidable collidable : collidables ) {
205+ collidables .remove (object );
206+ }
207+
208+
209+ if (ghost != null ) {
210+ String objectShortName = object .getCustomName ();
211+
212+ if (object .getCustomName ().contains (" " )) {
213+ String [] splitName = object .getCustomName ().toLowerCase ().split (" " );
214+ objectShortName = splitName [0 ];
215+ }
216+
217+ core .chatService .playerStatusChange (objectShortName , (byte ) 0 );
218+ }
219+
220+ session .suspendWrite ();
221+
222+ long parentId = object .getParentId ();
223+
224+ if (object .getContainer () == null ) {
225+ boolean remove = core .simulationService .remove (object , object .getPosition ().x , object .getPosition ().z );
226+ if (remove )
227+ System .out .println ("Successful quadtree remove" );
228+ } else {
229+ object .getContainer ()._remove (object );
230+ object .setParentId (parentId );
231+ }
232+
233+
234+ HashSet <Client > oldObservers = new HashSet <Client >(object .getObservers ());
235+ for (Iterator <Client > it = oldObservers .iterator (); it .hasNext ();) {
236+ Client observerClient = it .next ();
237+ if (observerClient .getParent () != null && !(observerClient .getSession () == session )) {
238+ observerClient .getParent ().makeUnaware (object );
239+ }
240+ }
241+ ghost .toggleFlag (PlayerFlags .LD );
242+
243+ object .setAttachment ("disconnectTask" , null );
244+ object .createTransaction (core .getCreatureODB ().getEnvironment ());
245+ core .getCreatureODB ().put (object , Long .class , CreatureObject .class , object .getTransaction ());
246+ object .getTransaction ().commitSync ();
247+ core .objectService .destroyObject (object );
248+
249+ }
250+
242251
243252 @ Override
244253 public void shutdown () {
0 commit comments