[Aportes indexados] SOLUCION AL BUG DE CLONES

Estado
Cerrado para nuevas respuestas.

Khalem

Mica
Colaborador
Ex-Staff
Bueno, cito acá un posts que hiso el Sr. Maraxus en el foro de desarrollo de AoAlkon, es apra solucionar los bugs de todas las versiones de que cuando un pj salía quedaba un clon.

Maraxus en el smf del SourceForge dijo:
A partir de los clones vistos en la 0.12.0 el staff de programación lleva casi dos semanas revisando el código completo del servidor, y encontramos un bug que merece ser mencionado, pues es anterior a la 0.12.0 y es posible que muchos de ustedes lo tengan en sus propios servidores.

El error es tan viejo como los 10 segundos para salir en el AO y es causa de dupicación de PJs (clones), items y corrupción de charfiles entre muchos otros factores.

En la función NextOpenUser, se verifica que el index no tenga un socket válido asociado, pero no se verifica si el char sigue adentro esperando los 10 segundos para salir (situación que se da cuando, por ejemplo, cerramos el cliente con la cruz o Alt-F4). Si entonces otro usuario se conecta, y ese es el primer slot libre, y aún no han pasado los 10 secs, se produce el error (sí, es un caso que requiere muchas condiciones, pero creanme, se puede dar).

La solución es cambiar el código de dicha función por:

[vb]<div class="vb" id="{CB}" style="font-family: monospace;"><ol><li style="" class="li1"><span style="color: #b1b100;">Function</span> NextOpenUser<span style="color: #e1e1e1;">(</span><span style="color: #e1e1e1;">)</span> <span style="color: #b1b100;">As</span> <span style="color: #b1b100;">Integer</span></li><li style="" class="li2">&nbsp; &nbsp; <span style="color: #b1b100;">Dim</span> LoopC <span style="color: #b1b100;">As</span> <span style="color: #b1b100;">Long</span></li><li style="" class="li1">&nbsp; &nbsp; </li><li style="" class="li2">&nbsp; &nbsp; <span style="color: #b1b100;">For</span> LoopC = <span style="color: #f1f1f1;">1</span> <span style="color: #b1b100;">To</span> MaxUsers + <span style="color: #f1f1f1;">1</span></li><li style="" class="li1">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">If</span> LoopC > MaxUsers <span style="color: #b1b100;">Then</span> <span style="color: #b1b100;">Exit</span> <span style="color: #b1b100;">For</span></li><li style="" class="li2">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">If</span> <span style="color: #e1e1e1;">(</span>UserList<span style="color: #e1e1e1;">(</span>LoopC<span style="color: #e1e1e1;">)</span>.<span style="color: #f0f0f1;">ConnID</span> = <span style="color: #f1f1f1;">-1</span> <span style="color: #b1b100;">And</span> UserList<span style="color: #e1e1e1;">(</span>LoopC<span style="color: #e1e1e1;">)</span>.<span style="color: #f0f0f1;">flags</span>.<span style="color: #f0f0f1;">UserLogged</span> = <span style="color: #b1b100;">False</span><span style="color: #e1e1e1;">)</span> <span style="color: #b1b100;">Then</span> <span style="color: #b1b100;">Exit</span> <span style="color: #b1b100;">For</span></li><li style="" class="li1">&nbsp; &nbsp; <span style="color: #b1b100;">Next</span> LoopC</li><li style="" class="li2">&nbsp; &nbsp; </li><li style="" class="li1">&nbsp; &nbsp; NextOpenUser = LoopC</li><li style="" class="li2"><span style="color: #b1b100;">End</span> <span style="color: #b1b100;">Function</span></li><li style="" class="li1">&nbsp;</li></ol></div>[/vb]

Espero sea de utilidad.

Más info: Link

Suerte
 
Estado
Cerrado para nuevas respuestas.
Arriba