From 33c334801e514e1f975b8afc2c6791804e09eda7 Mon Sep 17 00:00:00 2001 From: TienTN Date: Sun, 4 Sep 2016 12:33:34 +0700 Subject: [PATCH] Fix the map moving bug which will cause map hanging. Please read for detail README in the #6 entry. --- README | 6 + Templates/Map/mapview.tpl | 1 + unx.js | 368 +++++++++++++++++++++++++++++++------- 3 files changed, 308 insertions(+), 67 deletions(-) diff --git a/README b/README index d67e5a40..1f2f6d08 100644 --- a/README +++ b/README @@ -14,6 +14,12 @@ My changes notes: VM5051:1 Uncaught SyntaxError: Unexpected token ) jd.onreadystatechange @ unx.js?0ac36:170 This error arises when moving to the border of the map. +6. Fix the map loop moving bug: + Symptom: For map not set to size 400x400, on the map page, + when moving on and on in one direction, cross the map border(loop) two times, + the moving function will be crashed(freeze, you can't move any more). + I found out that unx.js handle a static map size(400x400). + So I fixed this with a m_c.world_max variable from mapview.tpl and changed the unx.js accordingly. Note for the original code: The last commit 4372c40 from Shadowss/TravianZ is on Jul 6 2016, with note: diff --git a/Templates/Map/mapview.tpl b/Templates/Map/mapview.tpl index 88480ea5..09e2c8fe 100644 --- a/Templates/Map/mapview.tpl +++ b/Templates/Map/mapview.tpl @@ -256,6 +256,7 @@ if (isset($neutralarray[0])) { m_c.ad = []; m_c.z = {"x":,"y":}; m_c.size = 7; + m_c.world_max = ; var mdim = {"x":7,"y":7,"rad":3} var mmode = 0; function init_local(){map_init();} diff --git a/unx.js b/unx.js index 80879ea8..f6fa7496 100644 --- a/unx.js +++ b/unx.js @@ -193,16 +193,60 @@ else {url+='&'+param;} } document.location.href=url;} -var rd={'index':0,'dir':0,'size':null,'fields':[],'cindex':0,'usealternate':false} -;var m_c=rd;var sd;var td;var ud;var vd;var wd;var xd;var yd;var zd;var $d;var _d=false;var ae;var be;var ce;var de=[];de[38]=1;de[39]=2;de[40]=3;de[37]=4;var ee={} -;var fe;var ge;function map_init(){sd=false;td=false;ud=false;vd=false;xd=0;wd=0;fe=he('karte2');ie(['i','a','t']);if(null==m_c.az){throw'm_c.az muss seitenspezifisch initialisiert werden.';} -for(var p in m_c.az){document.getElementById('ma_'+p).onclick=je;} -var ke=['mcx','mcy','x','y','map_infobox'];for(var i=0;i400){$f-=801;} -if($f<-400){$f+=801;} -return $f;} -function _f($f){if($f>400){$f=400;} -if($f<-400){$f=-400;} -return $f;} -function ag(qf,rf){var z={} -;z.x=m_c.z.x*1;z.y=m_c.z.y*1;switch(qf){case 1:z.y+=rf;break;case 2:z.x+=rf;break;case 3:z.y-=rf;break;case 4:z.x-=rf;break;} -m_c.z.x=zf(z.x);m_c.z.y=zf(z.y);} +function vf(qf,rf,wf){ + if(wf==null){wf=0;} + if(m_c.size==null){ + throw'Globale Variable m_c.size muss auf den Wert von $travian[map_prefetch_rows]) gesetzt werden.'; + } + var xf,yf; + if(null===rf||1===rf){ + yf=m_c.size-1; + } + else if(mdim.x==rf){ + xf=mdim.x;yf=-(mdim.x-1); + } + else{ + throw'Parameter steps muss 1 oder Breite der Karte in Feldern sein.'; + } + var x,y,tf,uf,z;var z=m_c.z; + switch(qf){ + case 1: + x=z.x+mdim.rad;y=z.y+mdim.rad+wf; + tf=z.x-mdim.rad;uf=y+yf; + break; + case 2: + x=z.x+mdim.rad+wf;y=z.y-mdim.rad; + tf=x+yf;uf=z.y+mdim.rad; + break; + case 3: + x=z.x+mdim.rad;y=z.y-mdim.rad-wf; + tf=z.x-mdim.rad; + uf=y-yf; + break; + case 4: + x=z.x-mdim.rad-wf; + y=z.y-mdim.rad; + tf=x-yf; + uf=z.y+mdim.rad; + break; + } + return{'x':x,'y':y,'xx':tf,'yy':uf}; +} + +function zf($f){ + var world_max = m_c.world_max; + var world_max_double = (world_max * 2) + 1; + if($f>world_max){ + $f-=world_max_double; + } + if($f<-world_max){ + $f+=world_max_double; + } + return $f; +} + +function _f($f){ + if($f>m_c.world_max){ + $f=m_c.world_max; + } + if($f<-m_c.world_max){ + $f=-m_c.world_max; + } + return $f; +} + +//tientn: m_c is the object hold all global variables +function ag(qf,rf){ + var z={}; + z.x=m_c.z.x*1; + z.y=m_c.z.y*1; + switch(qf){ + case 1: + z.y+=rf; + break; + case 2: + z.x+=rf; + break; + case 3: + z.y-=rf; + break; + case 4: + z.x-=rf; + break; + } + m_c.z.x=zf(z.x); + m_c.z.y=zf(z.y); +} function bg(cg){return'ajax.php?f=k7&x='+cg.x+'&y='+cg.y+'&xx='+cg.xx+'&yy='+cg.yy;} -function map_scroll(qf,rf,dg){var cg,eg;if(sd){return false;} -if(fg()){if(td){return false;} -sd=true;gg();m_c.usealternate=false;m_c.cindex=0;if(dg!==undefined){m_c.z.x=_f(dg.x);m_c.z.y=_f(dg.y);cg=sf(m_c.z);} -else{ag(qf,rf);cg=vf(qf,rf);} -hg=bg(cg);fd(hg,ig);} -else{if(jg()){if(td){return false;} -td=true;ag(qf,rf);cg=vf(qf,rf,2);hg=bg(cg);fd(hg,ig);} -else if(kg()){ag(qf,rf);lg();gg();} -else{ag(qf,rf);} -mg(qf,rf);} -function ig(ng){var og;if(jg()){og=pg(m_c.cindex);m_c.usealternate=false;td=false;} -else{og=m_c.cindex;} -m_c.fields[og]=ng;if(fg()){if(dg!==undefined){mg(0,0,m_c.z);qg('x');qg('y');} -else{mg(qf,rf);qg(qf);} -sd=false;} -} -function jg(){return m_c.usealternate;} -function fg(){return(qf!=m_c.dir||rf==mdim.x||(rf==1&&rf!=m_c.steps)||dg!==undefined);} -function kg(){return(m_c.index==m_c.size);} -} + +function map_scroll(qf,rf,dg) { + var cg,eg; + if(sd){ + return false; + } + if(fg()){ + if(td){ + return false; + } + sd=true; + gg(); + m_c.usealternate=false; + m_c.cindex=0; + if(dg!==undefined){ + m_c.z.x=_f(dg.x); + m_c.z.y=_f(dg.y); + cg=sf(m_c.z); + } + else{ + ag(qf,rf); + cg=vf(qf,rf); + } + hg=bg(cg); + fd(hg,ig); + } + else{ + if(jg()){ + if(td){ + return false; + } + td=true; + ag(qf,rf); + cg=vf(qf,rf,2); + hg=bg(cg); + fd(hg,ig); + } + else if(kg()){ + ag(qf,rf); + lg(); + gg(); + } + else{ + ag(qf,rf); + } + mg(qf,rf); + } + function ig(ng){ + var og; + if(jg()){ + og=pg(m_c.cindex); + m_c.usealternate=false; + td=false; + } + else{ + og=m_c.cindex; + } + m_c.fields[og]=ng; + if(fg()){ + if(dg!==undefined){ + mg(0,0,m_c.z); + qg('x'); + qg('y'); + } + else{ + mg(qf,rf); + qg(qf); + } + sd=false; + } + } + function jg(){ + return m_c.usealternate; + } + function fg(){ + return(qf!=m_c.dir||rf==mdim.x||(rf==1&&rf!=m_c.steps)||dg!==undefined); + } + function kg(){ + return(m_c.index==m_c.size); + } +} //end of map_scroll + function rg(qf,rf){m_c.dir=qf;m_c.steps=rf;} -function gg(){m_c.index=0;} +function gg(){ + m_c.index=0; +} function sg(){m_c.index++;if(m_c.index==m_c.size-2){m_c.usealternate=true;} } function lg(){m_c.cindex=pg(m_c.cindex);} @@ -323,11 +512,25 @@ area.details.normal_field=area.details.name===undefined&&area.details.typ==0;are ;area.details.classic_oasis=area.details.querystring==='';} function df(dh){switch(dh){case 1:return[3,3,3,9];case 2:return[3,4,5,6];case 3:return[4,4,4,6];case 4:return[4,5,3,6];case 5:return[5,3,4,6];case 6:return[1,1,1,15];case 7:return[4,4,3,7];case 8:return[3,4,4,7];case 9:return[4,3,4,7];case 10:return[3,5,4,6];case 11:return[4,3,5,6];case 12:return[5,4,3,6];default:return false;} } -function oe(){var x=parseInt(this.xp.value);var y=parseInt(this.yp.value);if(!isNaN(x)&&!isNaN(y)){map_scroll(0,0,{'x':x,'y':y} -);} -return false;} -function ne(e){if(vd){return true;} -var qd=(window.event)?event.keyCode:e.keyCode;var qf=eh(qd);if(qf!=0){return false;} +//document.map_coords.onsubmit=oe; +function oe(){ + var x=parseInt(this.xp.value); + var y=parseInt(this.yp.value); + if(!isNaN(x)&&!isNaN(y)){ + map_scroll(0,0,{'x':x,'y':y}); + } + return false; +} +//document.onkeypress=ne; +function ne(e){ + if(vd){ + return true; + } + var qd=(window.event)?event.keyCode:e.keyCode; + var qf=eh(qd); + if(qf!=0){ + return false; + } } function qe(){_d=true;hf(this.details);$e(this.details);fh(this);ge=this;} function fh(area){if(!area.details.fresh.href){if(area.details.classic_oasis){area.removeAttribute('href');area.style.cursor='default';} @@ -361,14 +564,31 @@ function vg(qf){for(var i=0;i