forked from sent/waves
681 lines
38 KiB
HTML
681 lines
38 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<title>Quake III Arena</title>
|
|
<style>
|
|
html,body{height:100%;padding:0;margin:0;background:#000;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;user-select:none;touch-action:none}
|
|
#viewport-frame{position:absolute;top:0;left:0;bottom:0;right:0;overflow:hidden}
|
|
.loading_splash_container{position:fixed;width:64px;height:64px;left:0;right:0;top:0;bottom:0;margin:auto auto;border:0}
|
|
.lds-spinner{color:white;display:inline-block;position:relative;width:64px;height:64px}
|
|
.lds-spinner div{transform-origin:32px 32px;animation:lds-spinner 1.2s linear infinite}
|
|
.lds-spinner div:after{content:" ";display:block;position:absolute;top:3px;left:29px;width:5px;height:14px;border-radius:20%;background:white}
|
|
.lds-spinner div:nth-child(1){transform:rotate(0deg);animation-delay:-1.1s}
|
|
.lds-spinner div:nth-child(2){transform:rotate(30deg);animation-delay:-1s}
|
|
.lds-spinner div:nth-child(3){transform:rotate(60deg);animation-delay:-0.9s}
|
|
.lds-spinner div:nth-child(4){transform:rotate(90deg);animation-delay:-0.8s}
|
|
.lds-spinner div:nth-child(5){transform:rotate(120deg);animation-delay:-0.7s}
|
|
.lds-spinner div:nth-child(6){transform:rotate(150deg);animation-delay:-0.6s}
|
|
.lds-spinner div:nth-child(7){transform:rotate(180deg);animation-delay:-0.5s}
|
|
.lds-spinner div:nth-child(8){transform:rotate(210deg);animation-delay:-0.4s}
|
|
.lds-spinner div:nth-child(9){transform:rotate(240deg);animation-delay:-0.3s}
|
|
.lds-spinner div:nth-child(10){transform:rotate(270deg);animation-delay:-0.2s}
|
|
.lds-spinner div:nth-child(11){transform:rotate(300deg);animation-delay:-0.1s}
|
|
.lds-spinner div:nth-child(12){transform:rotate(330deg);animation-delay:0s}
|
|
.gui_download{position:fixed;right:10px;top:10px;z-index:999;width:64px;height:64px;cursor:pointer;display:none;background-repeat:no-repeat;background-image:url("data:image/png;base64,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")}
|
|
.gui_download:hover{filter:brightness(110%)}
|
|
@keyframes lds-spinner{0%{opacity:1}100%{opacity:0}}
|
|
|
|
.gui_mobile_patch{display:none;position:fixed;left:0;right:0;top:0;bottom:0;z-index:70}
|
|
.gui_mobile_look{display:none;position:fixed;left:290px;right:0;top:0;bottom:115px;z-index:75}
|
|
.gui_keyesc{display:none;position:fixed;left:5px;top:5px;width:86px;height:86px;background-color:rgba(0,0,0,0.25);border:1px solid rgba(255,255,255,0.2);font-family:Arial;font-size:35px;line-height:2.5;color:rgba(255,255,255,0.3);text-align:center;border-radius:50px;cursor:default;z-index:98}
|
|
.gui_keytab{display:none;position:fixed;left:100px;top:5px;width:86px;height:86px;background-color:rgba(0,0,0,0.25);border:1px solid rgba(255,255,255,0.2);font-family:Arial;font-size:35px;line-height:2.5;color:rgba(255,255,255,0.3);text-align:center;border-radius:50px;cursor:default;z-index:98}
|
|
.gui_keyok{display:none;position:fixed;left:195px;top:5px;width:86px;height:86px;background-color:rgba(0,0,0,0.25);border:1px solid rgba(255,255,255,0.2);font-family:Arial;font-size:35px;line-height:2.5;color:rgba(255,255,255,0.3);text-align:center;border-radius:50px;cursor:default;z-index:98}
|
|
.gui_download_mobile{display:none;position:fixed;right:5px;top:5px;width:86px;height:86px;background-color:rgba(0,0,0,0.25);border:1px solid rgba(255,255,255,0.2);font-family:Arial;font-size:35px;line-height:2.5;color:rgba(255,255,255,0.3);text-align:center;border-radius:50px;cursor:default;z-index:98}
|
|
.gui_download_mobile_icon{width:86px;height:86px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5AEBFCMNH+q9kQAAAhRJREFUaN7tmLtrFUEUh3/n3usjEWMkiAk2aWwsooh/gSms/RNsI2gngmBhFWy0koBWNiL4wsoUNoGEQBQbJQi+Gh/EByJRCSb5bLZYl13vTO7suhvnlDtnz/l98z5jCmzATknHJY1IsnSTpE+S7pnZZ9XRgCHgJX+3D8BoXQHO42ZToXK2AjMcdPQ7VFeAtqNfp64AlVsEiAARIAJEgAgQASLA/wzgdSsETNJRSWOStuW47HcMNQyczfn+S9JzSQ/MbLWMguUy1djNsqbQrKS1CmbGQpll4wlgvcTev1BF7XuqJPGXqizgzwUWfy3ZJCp9hZgMJP4G0AolaggY9vC/0qP4+0DHQ9veosYWMAWsJYHvAv0uZwNwfYPiHwLbHXK0gaupzeMO0Jd1OpmT4KJjz7SB257i54AdjvFP5/w/mXWaz3sG9JhKW4FpR/FPgEGP2I9yYrzPOi0VJOvzSNQPzHQRvwjs8VyXX7pqA74WOA16Jhso6DGA18C+DWwsy0Xagt9GzeybpGOSnmWa3kkaN7O3Ze3pQUYgFW8EeJHE+Agc6EHbcldtoQGSmKPAU+Bwj51bCNBRiWZmb4AxM1tvbEVWpvhYE0eACOD2KnELWP3HOgtvrJY+ByTtatgA7N5Ua2ClgfpX0gAzDRO/YGY/0wBnJL1qiPglSRN/LOJkIW+RdETSQLatRvZd0mMz+6HNYL8BlNIZuqFPU3wAAAAASUVORK5CYII=");background-repeat:no-repeat;background-position:center center;opacity:0.3}
|
|
.gui_keyfire{display:none;position:fixed;right:90px;bottom:55px;width:86px;height:86px;background-color:rgba(0,0,0,0.25);border:1px solid rgba(255,255,255,0.2);font-family:Arial;font-size:50px;line-height:1.8;color:rgba(255,255,255,0.3);text-align:center;border-radius:50px;cursor:default;z-index:98}
|
|
.gui_keyfire_icon{width:86px;height:86px;background:url("data:image/png;base64,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");background-repeat:no-repeat;background-position:center center;opacity:0.3}
|
|
.gui_keyjump{display:none;position:fixed;right:5px;bottom:100px;width:86px;height:86px;background-color:rgba(0,0,0,0.25);border:1px solid rgba(255,255,255,0.2);font-family:Arial;font-size:50px;line-height:1.8;color:rgba(255,255,255,0.3);text-align:center;border-radius:50px;cursor:default;z-index:98}
|
|
.gui_keyjump_icon{width:86px;height:86px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5AEDDAMbxoYWIQAAAJ1JREFUaN7tmEEOwCAIwMSX+3N22tG4CSrE9gVtphBXCvRR1aaqLbP8S8ssnyuiI58jYiAfO+KjfMyIn/KxIiblY0QY5c9GOMmfiXCW3xuxSH5PxGL5tRGb5NdEbJb3jTgk7xNxWN4WEUR+GCHGL6Qex1REpj1q9mcrAQTcHgBg3SEsMqYQAQQAsMiM/w1EpF57iZlCwBRiCjGFIDUPyI1TOIQJgrIAAAAASUVORK5CYII=");background-repeat:no-repeat;background-position:center center;opacity:0.3}
|
|
.gui_keycrouch{display:none;position:fixed;right:5px;bottom:5px;width:86px;height:86px;background-color:rgba(0,0,0,0.25);border:1px solid rgba(255,255,255,0.2);font-family:Arial;font-size:50px;line-height:1.8;color:rgba(255,255,255,0.3);text-align:center;border-radius:50px;cursor:default;z-index:98}
|
|
.gui_keycrouch_icon{width:86px;height:86px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5AEDDigDoB6ncAAAAKxJREFUaN7tlUEOxCAMAwkv98+995UqdiEkpNh3qhlKnNaU3NjKYZJ0YKCZ9dnDvfof6HqEilpILaQWUpTLW6iZmV07xBKQgBaZomiRqYUkIIE3CpAEB/GC4DiY/TCYH6zeDsrCJ0vAdViCJbBl4oMksLW2NksgpHs3SSB0gThLIGULOkkgdZUvSuTCL0qcAT8pcRb8nxJnwv8ocTb8QKIG/INELfgviZrwUfkAS8cLgkATPOoAAAAASUVORK5CYII=");background-repeat:no-repeat;background-position:center center;opacity:0.3}
|
|
.gui_nextweapon{display:none;position:fixed;right:175px;bottom:5px;width:86px;height:86px;background-color:rgba(0,0,0,0.25);border:1px solid rgba(255,255,255,0.2);font-family:Arial;font-size:35px;line-height:2.5;color:rgba(255,255,255,0.3);text-align:center;border-radius:50px;cursor:default;z-index:98}
|
|
.gui_nextweapon_icon{width:86px;height:86px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5AEDDgMz8LdqtQAAAgJJREFUaN7VmLFKHFEUhv+zSEDd1lgo+BS6jZUvILukyMK24lPYBBJfJIUQiPoOWglCfIis69QS2CKfzdkwbnbVmbnOzPnhFlPM8H937rn33F9qQMAAyIAJMFQ0ufG8vgAWCWCRfgBrkQEAboHtyAAAY6AXGQDgDzCKDDDTaSuLm2K6ALqpDfQXbIXvqV/AziIvVhJgIuljzT8ukzQws6sUADS0+qaSPpvZeVQASXows83ZQ0fx9GzyogFMJR2nAMiaWDqSDiRdpgA48g/WpTtJe5KuU22jSdfxK7qQNJL0+M+0WZga+CZpsMx8lZO46nhLMzecfy9KL/Qb2G2t+VcAboCtVpt/AeAMWK3VeNmZAu5zxv8CJ7XO+rLiLPD+obfjY+BTk+aHbiQDBil2sbrMm2c5eU2qANS53tc8w/lP7107Kcxve3ZDFYA6t7v86HnREQJgzvzIj3dCAMwV62mB9KBSj1RGKy+0yl1J3yUdtrld7Swxv+OXh6LmKTkmkvplAGwBwL6kn5I2mkwbygL0JZ1J+tDEcrAStxVrQeJWCaBT4a7aviL2zGUaFsDMLj17eWjAS5biD8jMrj2Duas5tDpKfRqvA+dFQvw2NnMGfA0LkAMZhmrmlkDsemYTE8Ahtjy7iQngEKue4cQEyIGceKYz0320U1ye6Yw9Wmnk3vAEU3Fz+bSHDDEAAAAASUVORK5CYII=");background-repeat:no-repeat;background-position:center center;opacity:0.3}
|
|
.gui_joystick{display:none;position:fixed;left:0;bottom:0;width:205px;height:203px;z-index:98}
|
|
|
|
</style>
|
|
</head>
|
|
<body>
|
|
|
|
<div class="gui_mobile_patch" oncontextmenu="return false;"></div>
|
|
<div class="gui_mobile_look" oncontextmenu="return false;"></div>
|
|
<div class="gui_keyesc" oncontextmenu="return false;">ESC</div>
|
|
<div class="gui_keytab" oncontextmenu="return false;">TAB</div>
|
|
<div class="gui_keyok" oncontextmenu="return false;">OK</div>
|
|
<div class="gui_download_mobile" onclick="downloadProfileData()" oncontextmenu="return false;"><div class="gui_download_mobile_icon"></div></div>
|
|
<div class="gui_nextweapon" oncontextmenu="return false;"><div class="gui_nextweapon_icon"></div></div>
|
|
<div class="gui_keyfire" oncontextmenu="return false;"><div class="gui_keyfire_icon"></div></div>
|
|
<div class="gui_keyjump" oncontextmenu="return false;"><div class="gui_keyjump_icon"></div></div>
|
|
<div class="gui_keycrouch" oncontextmenu="return false;"><div class="gui_keycrouch_icon"></div></div>
|
|
<div class="gui_joystick" id="joyDiv"></div>
|
|
|
|
<div class="loading_splash_container" id="loading">
|
|
<div class="lds-spinner"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div>
|
|
</div>
|
|
<div class="gui_download" onclick="downloadProfileData()"></div>
|
|
<div id="viewport-frame"></div>
|
|
<script src="Quake3Game.js"></script>
|
|
<script>
|
|
|
|
// --------------------------------------------------------------------------------------------------------
|
|
// DESKTOP FUNCTIONS
|
|
// --------------------------------------------------------------------------------------------------------
|
|
|
|
var CTRLS_IDLE = 0;
|
|
|
|
function mouseChecker()
|
|
{
|
|
if(document.pointerLockElement==null)
|
|
{
|
|
goBackButtonResetIncrement();
|
|
}
|
|
else
|
|
{
|
|
goBackButtonTimerIncrement();
|
|
}
|
|
}
|
|
|
|
function goBackButtonResetIncrement()
|
|
{
|
|
try
|
|
{
|
|
CTRLS_IDLE = 0;
|
|
|
|
if (isMobileDevice()==false)
|
|
{
|
|
// SHOWS THE DOWNLOAD BUTTON
|
|
document.getElementsByClassName("gui_download")[0].style.display = "block";
|
|
}
|
|
}
|
|
catch(err)
|
|
{
|
|
}
|
|
}
|
|
|
|
function goBackButtonTimerIncrement()
|
|
{
|
|
try
|
|
{
|
|
CTRLS_IDLE = CTRLS_IDLE + 1;
|
|
if (CTRLS_IDLE >= 3)
|
|
{
|
|
// HIDES THE DOWNLOAD BUTTON
|
|
document.getElementsByClassName("gui_download")[0].style.display = "none";
|
|
}
|
|
}
|
|
catch(err)
|
|
{
|
|
}
|
|
}
|
|
|
|
// --------------------------------------------------------------------------------------------------------
|
|
// PROFILE MANAGMENT FUNCTIONS
|
|
// --------------------------------------------------------------------------------------------------------
|
|
|
|
function getProfileData()
|
|
{
|
|
var myTempProfile = parent.profileData;
|
|
return myTempProfile;
|
|
}
|
|
|
|
function clearProfileData()
|
|
{
|
|
parent.profileData = null;
|
|
}
|
|
|
|
function downloadProfileData()
|
|
{
|
|
try
|
|
{
|
|
var rawReading = FS.readFile("/base/baseq3/q3config.cfg");
|
|
var fileAsArray = new Uint8Array(rawReading);
|
|
download_Blob(fileAsArray, "q3config.cfg", "application/octet-stream");
|
|
}
|
|
catch(err)
|
|
{
|
|
}
|
|
}
|
|
|
|
function download_Blob(data, fileName, mimeType)
|
|
{
|
|
var blob, url;
|
|
blob = new Blob([data], {type: mimeType});
|
|
url = window.URL.createObjectURL(blob);
|
|
download_URL(url, fileName);
|
|
setTimeout(function()
|
|
{
|
|
return window.URL.revokeObjectURL(url);
|
|
}, 1000);
|
|
}
|
|
|
|
function download_URL(data, fileName)
|
|
{
|
|
var a;
|
|
a = document.createElement("a");
|
|
a.href = data;
|
|
a.download = fileName;
|
|
document.body.appendChild(a);
|
|
a.style = "display: none";
|
|
a.click();
|
|
a.remove();
|
|
}
|
|
|
|
// --------------------------------------------------------------------------------------------------------
|
|
// MOBILE CHECKER FUNCTION
|
|
// --------------------------------------------------------------------------------------------------------
|
|
|
|
function isMobileDevice()
|
|
{
|
|
if(navigator.userAgent.match(/Android/i) ||
|
|
navigator.userAgent.match(/webOS/i) ||
|
|
navigator.userAgent.match(/iPhone/i) ||
|
|
navigator.userAgent.match(/iPad/i) ||
|
|
navigator.userAgent.match(/iPod/i) ||
|
|
navigator.userAgent.match(/BlackBerry/i) ||
|
|
navigator.userAgent.match(/Windows Phone/i))
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// --------------------------------------------------------------------------------------------------------
|
|
// DEFINING KEY STATUS FOR MOBILE DEVICES
|
|
// --------------------------------------------------------------------------------------------------------
|
|
|
|
var keyUpActive = false;
|
|
var keyDownActive = false;
|
|
var keyLeftActive = false;
|
|
var keyRightActive = false;
|
|
|
|
var keyEscActive = false;
|
|
var keyTabActive = false;
|
|
var keyOkActive = false;
|
|
var keyNextWeaponActive = false;
|
|
var keyFireActive = false;
|
|
var keyJumpActive = false;
|
|
var keyCrouchActive = false;
|
|
|
|
var lookLeftActive = false;
|
|
var lookRightActive = false;
|
|
|
|
var joystickActive = false;
|
|
|
|
// --------------------------------------------------------------------------------------------------------
|
|
// VIRTUAL JOYSTICK FOR MOBILE DEVICES
|
|
// --------------------------------------------------------------------------------------------------------
|
|
|
|
var JoyStick=function(t,e){var i=void 0===(e=e||{}).title?"joystick":e.title,n=void 0===e.width?0:e.width,o=void 0===e.height?0:e.height,h=void 0===e.internalFillColor?"rgba(0,0,0,0.25)":e.internalFillColor,r=void 0===e.internalLineWidth?2:e.internalLineWidth,d=(void 0===e.internalStrokeColor||e.internalStrokeColor,void 0===e.externalLineWidth?2:e.externalLineWidth),a=void 0===e.externalStrokeColor?"rgba(0,0,0,0)":e.externalStrokeColor,c=document.getElementById(t),l=document.createElement("canvas");l.id=i,0==n&&(n=c.clientWidth),0==o&&(o=c.clientHeight),l.width=n,l.height=o,c.appendChild(l);var u=l.getContext("2d"),g=0,s=2*Math.PI,f=(l.width-110)/2,v=f+5,w=f+30,p=l.width/2,C=l.height/2,L=l.width/10,W=-1*L,k=l.height/10,E=-1*k,m=p,S=C;function x(){u.beginPath(),u.arc(p,C,w,0,s,!1),u.lineWidth=d,u.strokeStyle=a,u.stroke()}function y(){u.beginPath(),m<f&&(m=v),m+f>l.width&&(m=l.width-v),S<f&&(S=v),S+f>l.height&&(S=l.height-v),u.arc(m,S,f,0,s,!1),u.fillStyle=h,u.fill(),u.lineWidth=r,u.strokeStyle="rgba(255,255,255,0.175)",u.stroke()}l.addEventListener("touchstart",function(t){g=1},!1),l.addEventListener("touchmove",function(t){if(t.preventDefault(),1==g)try{for(var e=l.getBoundingClientRect(),i=e.left+l.offsetWidth,n=e.top,o=-1,h=0;h<t.touches.length;h++)t.touches[h].pageX<=i&&t.touches[h].pageY>=n&&(o=h);o>-1&&(m=t.touches[o].pageX,S=l.height-(window.innerHeight-t.touches[o].pageY),m-=l.offsetLeft,u.clearRect(0,0,l.width,l.height),x(),y())}catch(t){}},!1),l.addEventListener("touchend",function(t){g=0,m=p,S=C,u.clearRect(0,0,l.width,l.height),x(),y()},!1),l.addEventListener("mousedown",function(t){g=1},!1),l.addEventListener("mousemove",function(t){1==g&&(m=t.pageX,S=l.height-(window.innerHeight-t.pageY),m-=l.offsetLeft,S-=l.offsetTop,u.clearRect(0,0,l.width,l.height),x(),y())},!1),l.addEventListener("mouseup",function(t){g=0,m=p,S=C,u.clearRect(0,0,l.width,l.height),x(),y()},!1),x(),y(),this.GetWidth=function(){return l.width},this.GetHeight=function(){return l.height},this.GetPosX=function(){return m},this.GetPosY=function(){return S},this.GetX=function(){return((m-p)/v*100).toFixed()},this.GetY=function(){return((S-C)/v*100*-1).toFixed()},this.GetDir=function(){var t="",e=m-p,i=S-C;return i>=E&&i<=k&&(t="C"),i<E&&(t="N"),i>k&&(t="S"),e<W&&("C"==t?t="W":t+="W"),e>L&&("C"==t?t="E":t+="E"),t}};
|
|
|
|
var joystick = null;
|
|
|
|
function joystickSetActive(a)
|
|
{
|
|
joystickActive = a;
|
|
}
|
|
|
|
function showVirtualJoystick()
|
|
{
|
|
joystick = new JoyStick("joyDiv");
|
|
setInterval(function()
|
|
{
|
|
var joystickDirection = joystick.GetDir();
|
|
switch(joystickDirection)
|
|
{
|
|
case "N":
|
|
try{keyUp(true);keyDown(false);keyLeft(false);keyRight(false)}catch(err){}
|
|
break;
|
|
|
|
case "S":
|
|
try{keyUp(false);keyDown(true);keyLeft(false);keyRight(false)}catch(err){}
|
|
break;
|
|
|
|
case "W":
|
|
try{keyUp(false);keyDown(false);keyLeft(true);keyRight(false)}catch(err){}
|
|
break;
|
|
|
|
case "E":
|
|
try{keyUp(false);keyDown(false);keyLeft(false);keyRight(true)}catch(err){}
|
|
break;
|
|
|
|
case "NW":
|
|
try{keyUp(true);keyDown(false);keyLeft(true);keyRight(false)}catch(err){}
|
|
break;
|
|
|
|
case "NE":
|
|
try{keyUp(true);keyDown(false);keyLeft(false);keyRight(true)}catch(err){}
|
|
break;
|
|
|
|
case "SE":
|
|
try{keyUp(false);keyDown(true);keyLeft(false);keyRight(true)}catch(err){}
|
|
break;
|
|
|
|
case "SW":
|
|
try{keyUp(false);keyDown(true);keyLeft(true);keyRight(false)}catch(err){}
|
|
break;
|
|
|
|
default:
|
|
try{keyUp(false);keyDown(false);keyLeft(false);keyRight(false)}catch(err){}
|
|
break;
|
|
}
|
|
}, 25);
|
|
}
|
|
|
|
// --------------------------------------------------------------------------------------------------------
|
|
// VIRTUAL KEYS FUNCTIONS FOR MOBILE DEVICES
|
|
// --------------------------------------------------------------------------------------------------------
|
|
|
|
function sendEvent(eventType, eventCode)
|
|
{
|
|
try
|
|
{
|
|
var oEvent = document.createEvent("KeyboardEvent");
|
|
|
|
Object.defineProperty(oEvent,"keyCode",{get:function(){return this.keyCodeVal}}); // CHROMIUM HACK
|
|
Object.defineProperty(oEvent,"which",{get:function(){return this.keyCodeVal}}); // CHROMIUM HACK
|
|
|
|
if (oEvent.initKeyboardEvent)
|
|
{
|
|
oEvent.initKeyboardEvent(eventType, true, true, document.defaultView, false, false, false, false, eventCode, eventCode);
|
|
}
|
|
else
|
|
{
|
|
oEvent.initKeyEvent(eventType, true, true, document.defaultView, false, false, false, false, eventCode, eventCode);
|
|
}
|
|
|
|
oEvent.keyCodeVal = eventCode;
|
|
|
|
Module["canvas"].dispatchEvent(oEvent);
|
|
}
|
|
catch(err)
|
|
{
|
|
}
|
|
}
|
|
|
|
function keyUp(active)
|
|
{
|
|
if (active==true && keyUpActive==false)
|
|
{
|
|
sendEvent("keydown",87);
|
|
sendEvent("keydown",38);
|
|
keyUpActive = true;
|
|
}
|
|
else if (active==false && keyUpActive==true)
|
|
{
|
|
sendEvent("keyup",87);
|
|
sendEvent("keyup",38);
|
|
keyUpActive = false;
|
|
}
|
|
}
|
|
|
|
function keyDown(active)
|
|
{
|
|
if (active==true && keyDownActive==false)
|
|
{
|
|
sendEvent("keydown",83);
|
|
sendEvent("keydown",40);
|
|
keyDownActive = true;
|
|
}
|
|
else if (active==false && keyDownActive==true)
|
|
{
|
|
sendEvent("keyup",83);
|
|
sendEvent("keyup",40);
|
|
keyDownActive = false;
|
|
}
|
|
}
|
|
|
|
function keyLeft(active)
|
|
{
|
|
if (active==true && keyLeftActive==false)
|
|
{
|
|
sendEvent("keydown",65);
|
|
keyLeftActive = true;
|
|
}
|
|
else if (active==false && keyLeftActive==true)
|
|
{
|
|
sendEvent("keyup",65);
|
|
keyLeftActive = false;
|
|
}
|
|
}
|
|
|
|
function keyRight(active)
|
|
{
|
|
if (active==true && keyRightActive==false)
|
|
{
|
|
sendEvent("keydown",68);
|
|
keyRightActive = true;
|
|
}
|
|
else if (active==false && keyRightActive==true)
|
|
{
|
|
sendEvent("keyup",68);
|
|
keyRightActive = false;
|
|
}
|
|
}
|
|
|
|
function keyEsc(active)
|
|
{
|
|
if (active==true && keyEscActive==false)
|
|
{
|
|
sendEvent("keydown",27);
|
|
keyEscActive = true;
|
|
}
|
|
else if (active==false && keyEscActive==true)
|
|
{
|
|
sendEvent("keyup",27);
|
|
keyEscActive = false;
|
|
}
|
|
}
|
|
|
|
function keyTab(active)
|
|
{
|
|
if (active==true && keyTabActive==false)
|
|
{
|
|
sendEvent("keydown",9);
|
|
keyTabActive = true;
|
|
}
|
|
else if (active==false && keyTabActive==true)
|
|
{
|
|
sendEvent("keyup",9);
|
|
keyTabActive = false;
|
|
}
|
|
}
|
|
|
|
function keyOk(active)
|
|
{
|
|
if (active==true && keyOkActive==false)
|
|
{
|
|
sendEvent("keydown",13);
|
|
keyOkActive = true;
|
|
}
|
|
else if (active==false && keyOkActive==true)
|
|
{
|
|
sendEvent("keyup",13);
|
|
keyOkActive = false;
|
|
}
|
|
}
|
|
|
|
function keyNextWeapon(active)
|
|
{
|
|
if (active==true && keyNextWeaponActive==false)
|
|
{
|
|
sendEvent("keydown",191);
|
|
keyNextWeaponActive = true;
|
|
}
|
|
else if (active==false && keyNextWeaponActive==true)
|
|
{
|
|
sendEvent("keyup",191);
|
|
keyNextWeaponActive = false;
|
|
}
|
|
}
|
|
|
|
function keyFire(active)
|
|
{
|
|
if (active==true && keyFireActive==false)
|
|
{
|
|
sendEvent("keydown",17);
|
|
keyFireActive = true;
|
|
}
|
|
else if (active==false && keyFireActive==true)
|
|
{
|
|
sendEvent("keyup",17);
|
|
keyFireActive = false;
|
|
}
|
|
}
|
|
|
|
function keyJump(active)
|
|
{
|
|
if (active==true && keyJumpActive==false)
|
|
{
|
|
sendEvent("keydown",32);
|
|
keyJumpActive = true;
|
|
}
|
|
else if (active==false && keyJumpActive==true)
|
|
{
|
|
sendEvent("keyup",32);
|
|
keyJumpActive = false;
|
|
}
|
|
}
|
|
|
|
function keyCrouch(active)
|
|
{
|
|
if (active==true && keyCrouchActive==false)
|
|
{
|
|
sendEvent("keydown",67);
|
|
keyCrouchActive = true;
|
|
}
|
|
else if (active==false && keyCrouchActive==true)
|
|
{
|
|
sendEvent("keyup",67);
|
|
keyCrouchActive = false;
|
|
}
|
|
}
|
|
|
|
function lookLeft(active)
|
|
{
|
|
if (active==true && lookLeftActive==false)
|
|
{
|
|
sendEvent("keydown",37);
|
|
lookLeftActive = true;
|
|
}
|
|
else if (active==false && lookLeftActive==true)
|
|
{
|
|
sendEvent("keyup",37);
|
|
lookLeftActive = false;
|
|
}
|
|
}
|
|
|
|
function lookRight(active)
|
|
{
|
|
if (active==true && lookRightActive==false)
|
|
{
|
|
sendEvent("keydown",39);
|
|
lookRightActive = true;
|
|
}
|
|
else if (active==false && lookRightActive==true)
|
|
{
|
|
sendEvent("keyup",39);
|
|
lookRightActive = false;
|
|
}
|
|
}
|
|
|
|
// --------------------------------------------------------------------------------------------------------
|
|
// LOOKING FUNCTIONS FOR MOBILE DEVICES
|
|
// --------------------------------------------------------------------------------------------------------
|
|
|
|
var xDown = 0;
|
|
var yDown = 0;
|
|
|
|
var currentFingerLook = -1;
|
|
|
|
document.getElementsByClassName("gui_mobile_look")[0].addEventListener("touchstart", function(event)
|
|
{
|
|
var tempObject1 = document.getElementsByClassName("gui_mobile_look")[0].getBoundingClientRect();
|
|
var tempObject1_Left = tempObject1.left;
|
|
var tempObject1_Top = tempObject1.top + document.getElementsByClassName("gui_mobile_look")[0].offsetHeight;
|
|
|
|
for (var i=0; i < event.touches.length; i++)
|
|
{
|
|
// TEMP OBJECT 1 VALIDATION
|
|
if (event.touches[i].pageX>=tempObject1_Left && event.touches[i].pageY<=tempObject1_Top)
|
|
{
|
|
currentFingerLook = i;
|
|
}
|
|
}
|
|
|
|
if (currentFingerLook>-1)
|
|
{
|
|
var firstTouch = event.touches[currentFingerLook];
|
|
xDown = firstTouch.clientX;
|
|
yDown = firstTouch.clientY;
|
|
}
|
|
});
|
|
|
|
document.getElementsByClassName("gui_mobile_look")[0].addEventListener("touchmove", function(event)
|
|
{
|
|
if (!xDown || !yDown)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var tempObject1 = document.getElementsByClassName("gui_mobile_look")[0].getBoundingClientRect();
|
|
var tempObject1_Left = tempObject1.left;
|
|
var tempObject1_Top = tempObject1.top + document.getElementsByClassName("gui_mobile_look")[0].offsetHeight;
|
|
|
|
for (var i=0; i < event.touches.length; i++)
|
|
{
|
|
// TEMP OBJECT 1 VALIDATION
|
|
if (event.touches[i].pageX>=tempObject1_Left && event.touches[i].pageY<=tempObject1_Top)
|
|
{
|
|
currentFingerLook = i;
|
|
}
|
|
}
|
|
|
|
if (currentFingerLook>-1)
|
|
{
|
|
var xUp = event.touches[currentFingerLook].clientX;
|
|
var yUp = event.touches[currentFingerLook].clientY;
|
|
var xDiff = xDown - xUp;
|
|
var yDiff = yDown - yUp;
|
|
|
|
var eventCatched = false;
|
|
|
|
if (Math.abs(xDiff)>Math.abs(yDiff))
|
|
{
|
|
if (xDiff > 30)
|
|
{
|
|
lookLeft(true);
|
|
lookRight(false);
|
|
xDown = xUp;
|
|
yDown = yUp;
|
|
eventCatched = true;
|
|
}
|
|
else if (xDiff < -30)
|
|
{
|
|
lookLeft(false);
|
|
lookRight(true);
|
|
xDown = xUp;
|
|
yDown = yUp;
|
|
eventCatched = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (yDiff > 25)
|
|
{
|
|
// LOOK UP
|
|
}
|
|
else if (yDiff < -25)
|
|
{
|
|
// LOOK DOWN
|
|
}
|
|
}
|
|
|
|
if (eventCatched = false)
|
|
{
|
|
lookLeft(false);
|
|
lookRight(false);
|
|
}
|
|
}
|
|
});
|
|
|
|
document.getElementsByClassName("gui_mobile_look")[0].addEventListener("touchend", function(event)
|
|
{
|
|
lookLeft(false);
|
|
lookRight(false);
|
|
xDown = null;
|
|
yDown = null;
|
|
currentFingerLook = -1;
|
|
});
|
|
|
|
// --------------------------------------------------------------------------------------------------------
|
|
// WINDOW ONLOAD AND ONRESIZE FUNCTIONS
|
|
// --------------------------------------------------------------------------------------------------------
|
|
|
|
window.addEventListener("load", function()
|
|
{
|
|
document.getElementById("loading").style.display = "none";
|
|
|
|
if (isMobileDevice()==true)
|
|
{
|
|
document.getElementsByClassName("gui_mobile_patch")[0].style.display = "block";
|
|
document.getElementsByClassName("gui_mobile_look")[0].style.display = "block";
|
|
document.getElementsByClassName("gui_keyesc")[0].style.display = "block";
|
|
document.getElementsByClassName("gui_keyesc")[0].addEventListener("touchstart",function(event){keyEsc(true)});
|
|
document.getElementsByClassName("gui_keyesc")[0].addEventListener("touchend",function(event){keyEsc(false)});
|
|
document.getElementsByClassName("gui_keytab")[0].style.display = "block";
|
|
document.getElementsByClassName("gui_keytab")[0].addEventListener("touchstart",function(event){keyTab(true)});
|
|
document.getElementsByClassName("gui_keytab")[0].addEventListener("touchend",function(event){keyTab(false)});
|
|
document.getElementsByClassName("gui_keyok")[0].style.display = "block";
|
|
document.getElementsByClassName("gui_keyok")[0].addEventListener("touchstart",function(event){keyOk(true)});
|
|
document.getElementsByClassName("gui_keyok")[0].addEventListener("touchend",function(event){keyOk(false)});
|
|
document.getElementsByClassName("gui_keyfire")[0].style.display = "block";
|
|
document.getElementsByClassName("gui_keyfire")[0].addEventListener("touchstart",function(event){keyFire(true)});
|
|
document.getElementsByClassName("gui_keyfire")[0].addEventListener("touchend",function(event){keyFire(false)});
|
|
document.getElementsByClassName("gui_keyjump")[0].style.display = "block";
|
|
document.getElementsByClassName("gui_keyjump")[0].addEventListener("touchstart",function(event){keyJump(true)});
|
|
document.getElementsByClassName("gui_keyjump")[0].addEventListener("touchend",function(event){keyJump(false)});
|
|
document.getElementsByClassName("gui_keycrouch")[0].style.display = "block";
|
|
document.getElementsByClassName("gui_keycrouch")[0].addEventListener("touchstart",function(event){keyCrouch(true)});
|
|
document.getElementsByClassName("gui_keycrouch")[0].addEventListener("touchend",function(event){keyCrouch(false)});
|
|
document.getElementsByClassName("gui_download_mobile")[0].style.display = "block";
|
|
document.getElementsByClassName("gui_nextweapon")[0].style.display = "block";
|
|
document.getElementsByClassName("gui_nextweapon")[0].addEventListener("touchstart",function(event){keyNextWeapon(true)});
|
|
document.getElementsByClassName("gui_nextweapon")[0].addEventListener("touchend",function(event){keyNextWeapon(false)});
|
|
document.getElementsByClassName("gui_joystick")[0].style.display = "block";
|
|
document.getElementsByClassName("gui_joystick")[0].addEventListener("touchstart",function(event){joystickSetActive(true)});
|
|
document.getElementsByClassName("gui_joystick")[0].addEventListener("touchend",function(event){joystickSetActive(false)});
|
|
document.getElementsByClassName("gui_download")[0].style.display = "none";
|
|
showVirtualJoystick();
|
|
}
|
|
|
|
setInterval(goBackButtonTimerIncrement, 1000);
|
|
document.addEventListener("click", mouseChecker, false);
|
|
document.addEventListener("dblclick", mouseChecker, false);
|
|
document.addEventListener("mousemove", mouseChecker, false);
|
|
document.addEventListener("pointerlockchange", mouseChecker, false);
|
|
document.addEventListener("mozpointerlockchange", mouseChecker, false);
|
|
document.addEventListener("webkitpointerlockchange", mouseChecker, false);
|
|
|
|
ioq3.viewport = document.getElementById("viewport-frame");
|
|
ioq3.elementPointerLock = true;
|
|
ioq3.exitHandler = function (err)
|
|
{
|
|
if (err!=null)
|
|
{
|
|
alert(err);
|
|
}
|
|
parent.unloadContainer();
|
|
}
|
|
|
|
var args = ["+set","cl_yawspeed","240"]; // FOR A FASTER 'MOUSE LOOK' IN MOBILE DEVICES
|
|
ioq3.callMain(args);
|
|
});
|
|
|
|
window.addEventListener("resize", function()
|
|
{
|
|
try
|
|
{
|
|
if (!ioq3.canvas){return}
|
|
if ((document["webkitFullScreenElement"] || document["webkitFullscreenElement"] || document["mozFullScreenElement"] || document["mozFullscreenElement"] || document["fullScreenElement"] || document["fullscreenElement"])){return}
|
|
ioq3.setCanvasSize(ioq3.viewport.offsetWidth, ioq3.viewport.offsetHeight);
|
|
}
|
|
catch(err)
|
|
{
|
|
}
|
|
});
|
|
</script>
|
|
</body>
|
|
</html> |