ADDED VERSIONING, models should no longer be visible through walls

This commit is contained in:
Ben Russell (300178622) 2012-12-19 21:53:34 +13:00
parent ba39a7ef70
commit 4671de094f
14 changed files with 265 additions and 155 deletions

View File

@ -9,6 +9,17 @@ And the rest in alphabetical order:
BR: BR:
Player name list Player name list
Team switching
"Are you sure?" on quit
Improved key binding system
Ericson2314:
Rearranged the build tree
Added an SSE-optimised matrix-vector multiply
rakiru:
Scroll wheel to switch tools
Lent his VPS to host an Iceball server
topo: topo:
FPS counter FPS counter

View File

@ -145,8 +145,7 @@ F5 = release mouse cursor
F1 = show some debug information F1 = show some debug information
TAB = show names / scores TAB = show names / scores
, = switch teams
[ TODO: add , for teamswitch ]
Note that there is no weapon select key. This isn't Ace of Jagex. Note that there is no weapon select key. This isn't Ace of Jagex.
@ -156,8 +155,6 @@ For each tool, here is what each mouse button does:
3: Gun: L = shoot, R = zoom 3: Gun: L = shoot, R = zoom
4: Grenade: L press = pull the pin, L release = throw 4: Grenade: L press = pull the pin, L release = throw
[ TODO: These will eventually be valid! ]
A few notes: A few notes:
- If you left-click-dig with the spade, you can get blocks back which you can - If you left-click-dig with the spade, you can get blocks back which you can
build stuff with later. build stuff with later.

View File

@ -1,23 +1,32 @@
0.1.0.0 - Released YYYY-MM-DD. 0.1.0/0.0 - Released YYYY-MM-DD.
- Initial release. - Initial release.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Version scheme: Version scheme:
w.x.y.za Engine: w.x.ya
Engine (git): w.x.ya-z
Game: w.x.ya/p.qb-r
w.x = major base engine version. Note, 0.10 is > 0.9. w.x = major base engine version. Note, 0.10 is > 0.9.
y = minor base engine version, for quick fixes. y = minor base engine version, for bugfixes and whatnot. optional.
z = major game version. a = subminor base engine version, for last-minute fixes. optional.
a = minor game version (a lowercase letter), for quick fixes. z = git version. optional, must be 0 for releases and >=1 for nonreleases!
p.qb-r = same as above but for game code (p is equivalent to w.x).
p.q is mandatory; b is optional.
These start at 0.0.
Note, if you increase one of these, you reset those after it to zero Note, if you increase one of these, you reset those after it to zero
(or blank for "a"). (or blank for "a"/"b").
"a" should never go past the letter z. "a"/"b" should never go past the letter z.
But if it does, you might as well just bump "z" up a digit, But if it does, you might as well just bump "y"/"q" up a digit,
and reset "a" to blank. and reset "a"/"b" to blank.
Ultimately: Ultimately:
- servers should always have the latest w.x.y.za version, and - servers must always have the latest w.x.ya release version of the engine
- clients and servers alike must always have the latest w.x version. - clients must always have the latest w.x release version
- clients ideally should have the latest w.x.ya release version
- servers ideally should have the latest w.x.ya/p.qb version of the game component
- clients do not need the game component at all

View File

@ -26,11 +26,13 @@ lua base library stuff:
error @ error @
print @ print @
loadstring @ loadstring @
loadfile @ (TODO: filter the path) loadfile @
dofile @ (TODO: filter the path) dofile @
_G @ _G @
nothing else yet nothing else yet
(TODO: work out what we want to keep,
as there's stuff being used that isn't listed here!)
check http://www.lua.org/manual/5.1/ for more info on these check http://www.lua.org/manual/5.1/ for more info on these
@ -53,6 +55,13 @@ common.base_dir @
writing to this string will *not* change the base dir, writing to this string will *not* change the base dir,
so *don't write to it* or else you'll just screw up your own code! so *don't write to it* or else you'll just screw up your own code!
common.version = {cmp={w,x,y,a,z},num,str="w.x.ya-z"} @
current engine version
cmp is for the individual version components
num is a comparable number (bit count for each: 5,5,7,5,10)
str is the version as a string
client/server.hook_tick = fn(sec_curtime, sec_delta)->sec_wait @ client/server.hook_tick = fn(sec_curtime, sec_delta)->sec_wait @
sets a hook called every "tick" sets a hook called every "tick"
returns a number telling it how long it wants to wait for returns a number telling it how long it wants to wait for

View File

@ -15,6 +15,15 @@
along with Iceball. If not, see <http://www.gnu.org/licenses/>. along with Iceball. If not, see <http://www.gnu.org/licenses/>.
*/ */
#define VERSION_W 0
#define VERSION_X 0
#define VERSION_Y 0
#define VERSION_A 0
#define VERSION_Z 1
// Remember to bump "Z" basically every time you change the engine!
// Z can only be 0 for official releases!
#define MODEL_BONE_MAX 256 #define MODEL_BONE_MAX 256
#define MODEL_POINT_MAX 4096 #define MODEL_POINT_MAX 4096
#define PACKET_LEN_MAX 1280 #define PACKET_LEN_MAX 1280

View File

@ -53,8 +53,10 @@ while true do
end end
end]] end]]
--map_fname = "*MAP" map_fname = "*MAP"
map_fname = "pkg/MAP" -- hackish workaround so iceballfornoobs-004 still works if not common.version then
map_fname = "pkg/MAP" -- hackish workaround so iceballfornoobs-004 still works
end
if not map_fname then if not map_fname then
error("server should have sent map name by now") error("server should have sent map name by now")

View File

@ -17,6 +17,8 @@
print("base dir:",common.base_dir) print("base dir:",common.base_dir)
dofile("pkg/base/version.lua")
-- base dir stuff -- base dir stuff
DIR_PKG_ROOT = DIR_PKG_ROOT or "pkg/base" DIR_PKG_ROOT = DIR_PKG_ROOT or "pkg/base"
DIR_PKG_LIB = DIR_PKG_LIB or DIR_PKG_ROOT DIR_PKG_LIB = DIR_PKG_LIB or DIR_PKG_ROOT
@ -371,127 +373,6 @@ players = {max = 32, current = 1}
intent = {} intent = {}
nades = {head = 1, tail = 0} nades = {head = 1, tail = 0}
function string.split(s, sep, plain)
local start = 1
local done = false
local function pass(i, j, ...)
if i then
local seg = s:sub(start, i - 1)
start = j + 1
return seg, ...
else
done = true
return s:sub(start)
end
end
local result = {}
while not done do
if sep == '' then done = true result[#result+1]=s end
result[#result+1]=pass(s:find(sep, start, plain))
end
return result
end
-- trim the character 'sep' from the left hand side of the string
function string.triml(s, sep)
sep = string.byte(sep)
if s == '' then return s end
local pos = 1
while string.byte(s,pos)==sep and #s<=pos do pos = pos + 1 end
return string.sub(s, pos+1)
end
-- trim the character 'sep' from the right hand side of the string
function string.trimr(s, sep)
sep = string.byte(sep)
if s == '' then return s end
local pos = #s
while string.byte(s, pos)==sep and pos>=1 do pos = pos - 1 end
return string.sub(s, 1, pos)
end
-- trim the character 'sep' from both sides of the string
function string.trim(s, sep)
return string.triml(string.trimr(s, sep), sep)
end
function parse_commandline_options(options)
local user_toggles = {} -- toggle options (key is name, value is position)
local user_settings = {} -- key-value pairs
local loose = {} -- loose strings, filenames, etc.
for k, v in pairs(options) do
local setting_pair = string.split(v, "=")
local first = string.byte(v,1)
if first==string.byte('-') then -- we are toggling an option or setting a value
if #setting_pair == 2 then -- we are setting a key to a value
user_settings[string.triml(setting_pair[1], '-')]=setting_pair[2]
print(string.triml(setting_pair[1], '-'),"trimmed")
else
user_toggles[string.triml(v, '-')]=k
end
else -- add to the loose values
loose[#loose+1] = v
end
end
return loose, user_toggles, user_settings
end
--[[Create an alarm object. When run, counts down to the specified value
based on the time delta passed in.
time: The time limit of the alarm. Ignored with values less than 1.
progress: the progress towards the time limit.
active: Whether alarm is running or not.
on_frame: Callback run every frame, passed in the dT of that frame.
on_trigger: Callback run when alarm reaches its limit, passed in the dT of that frame.
loop: Whether the alarm will continue after the first run.
preserve_accumulator: Whether looping transfers overflow dT from the previous run
]]
function alarm(options)
this = {}
this.time = options.time or 1
this.progress = options.progress or 0
this.active = options.active or true
this.loop = options.loop or false
this.preserve_accumulator = options.preserve_accumulator or true
this.on_frame = options.on_frame or nil
this.on_trigger = options.on_trigger or nil
function this.tick(dT)
if this.active then
this.progress = this.progress + dT
if this.on_frame ~= nil then this.on_frame(dT) end
while this.progress >= this.time and this.active do
if this.on_trigger ~= nil then this.on_trigger(dT) end
if this.loop and this.time > 0 then
if this.preserve_accumulator then
this.progress = this.progress - this.time
else
this.progress = 0
end
else
this.active = false
end
end
end
end
function this.restart()
this.progress = 0
this.active = true
end
function this.time_remaining()
return this.time - this.progress
end
return this
end
function sort_players() function sort_players()
players_sorted = {} players_sorted = {}
for k,v in ipairs(players) do for k,v in ipairs(players) do

View File

@ -114,3 +114,58 @@ function parse_commandline_options(options)
end end
return loose, user_toggles, user_settings return loose, user_toggles, user_settings
end end
--[[Create an alarm object. When run, counts down to the specified value
based on the time delta passed in.
time: The time limit of the alarm. Ignored with values less than 1.
progress: the progress towards the time limit.
active: Whether alarm is running or not.
on_frame: Callback run every frame, passed in the dT of that frame.
on_trigger: Callback run when alarm reaches its limit, passed in the dT of that frame.
loop: Whether the alarm will continue after the first run.
preserve_accumulator: Whether looping transfers overflow dT from the previous run
]]
function alarm(options)
this = {}
this.time = options.time or 1
this.progress = options.progress or 0
this.active = options.active or true
this.loop = options.loop or false
this.preserve_accumulator = options.preserve_accumulator or true
this.on_frame = options.on_frame or nil
this.on_trigger = options.on_trigger or nil
function this.tick(dT)
if this.active then
this.progress = this.progress + dT
if this.on_frame ~= nil then this.on_frame(dT) end
while this.progress >= this.time and this.active do
if this.on_trigger ~= nil then this.on_trigger(dT) end
if this.loop and this.time > 0 then
if this.preserve_accumulator then
this.progress = this.progress - this.time
else
this.progress = 0
end
else
this.active = false
end
end
end
end
function this.restart()
this.progress = 0
this.active = true
end
function this.time_remaining()
return this.time - this.progress
end
return this
end

View File

@ -17,6 +17,53 @@
print("pkg/base/main_client.lua starting") print("pkg/base/main_client.lua starting")
dofile("pkg/base/version.lua")
vernotes = ""
local cver = common.version
if cver == nil then
cver = {
cmp={0,0,0,0,-1004},
num=-1,
str="iceballfornoobs-004 (or pre-0.0-1 git)",
}
vernotes = [[
This is one of a multitude of old versions,
most likely iceballfornoobs-004.
CLIENT ISSUES (all pre-0.0-1):
- PMF models have the wrong Z value when close to the screen edges,
and can be seen through walls
CLIENT ISSUES (iceballfornoobs-004 and some later builds):
- Client does pathname security checks for non-clsave files
We will inform you once we have a newer noob build.
If you're using a git build, please upgrade!
]]
elseif cver.num == VERSION_ENGINE.num then
vernotes = [[
This is the expected version.
]]
elseif cver.num > VERSION_ENGINE.num and cver.cmp[5] == 0 then
vernotes = [[
This is a newer version than this mod expects.
Please tell the server owner to upgrade.
]]
elseif cver.num > VERSION_ENGINE.num then
vernotes = [[
This is a newer version than this mod expects.
]]
else
vernotes = [[
This is an older version than this mod expects.
You should have 0.0.0-1.
]]
end
-- please excuse this hack. -- please excuse this hack.
a1,a2,a3,a4,a5,a6,a7,a8,a9,a10 = ... a1,a2,a3,a4,a5,a6,a7,a8,a9,a10 = ...
@ -74,6 +121,12 @@ do
font_mini.print(2, 2+(i-koffs)*8, 0xFFFFFFFF, "LOAD: "..fnlist[i]) font_mini.print(2, 2+(i-koffs)*8, 0xFFFFFFFF, "LOAD: "..fnlist[i])
end end
font_mini.print(2, sh-10, 0xFFFFFFFF, loadstr) font_mini.print(2, sh-10, 0xFFFFFFFF, loadstr)
font_mini.print(2, 2+(12)*8, 0xFFFFFFFF, "Version: "..cver.str)
local l = string.split(vernotes,"\n")
for i=1,#l do
font_mini.print(2, 2+(i+14)*8, 0xFFFFFFFF, l[i])
end
end end
function client.hook_tick(sec_current, sec_delta) function client.hook_tick(sec_current, sec_delta)

View File

@ -18,6 +18,12 @@
print("pkg/base/main_server.lua starting") print("pkg/base/main_server.lua starting")
print(...) print(...)
if common.version == nil then
error("You must have at least version 0.0-1 to run this server!"
.." iceballfornoobs-004 is FAR TOO OLD!"
.." If you are using an old git version, PLEASE UPDATE!")
end
dofile("pkg/base/common.lua") dofile("pkg/base/common.lua")
client_list = {fdlist={}} client_list = {fdlist={}}
@ -72,9 +78,9 @@ end
function server.hook_file(sockfd, ftype, fname) function server.hook_file(sockfd, ftype, fname)
print("hook_file:", sockfd, ftype, fname) print("hook_file:", sockfd, ftype, fname)
--if (ftype == "icemap" or ftype == "map") and fname == "*MAP" then if (ftype == "icemap" or ftype == "map") and (fname == "pkg/MAP" or fname == "*MAP") then
if (ftype == "icemap" or ftype == "map") and fname == "pkg/MAP" then -- pkg/MAP is a hackish workaround so iceballfornoobs-004 still works
-- hackish workaround so iceballfornoobs-004 still works -- once -004 support is dropped, please remove that approach!
return map_loaded return map_loaded
end end

27
pkg/base/version.lua Normal file
View File

@ -0,0 +1,27 @@
--[[
This file is part of Ice Lua Components.
Ice Lua Components is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Ice Lua Components is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with Ice Lua Components. If not, see <http://www.gnu.org/licenses/>.
]]
VERSION_ENGINE = {
cmp={0,0,0,0,1},
num=1,
str="0.0-1",
}
VERSION_MOD = {
cmp={0,0,0,1},
str="0.0-1"
}

View File

@ -228,6 +228,45 @@ int icelua_initfetch(void)
return 0; return 0;
} }
void icelua_pushversion(lua_State *L, const char *tabname)
{
char vbuf[32];
snprintf(vbuf, 31, "%i.%i", VERSION_W, VERSION_X);
if(VERSION_Y != 0)
snprintf(vbuf+strlen(vbuf), 31-strlen(vbuf), ".%i", VERSION_Y);
if(VERSION_A != 0)
snprintf(vbuf+strlen(vbuf), 31-strlen(vbuf), "%c", VERSION_A+96);
if(VERSION_Z != 0)
snprintf(vbuf+strlen(vbuf), 31-strlen(vbuf), "-%i", VERSION_Z);
lua_getglobal(L, tabname);
lua_newtable(L);
lua_pushstring(L, vbuf);
lua_setfield(L, -2, "str");
lua_pushinteger(L,
(((((((VERSION_W<<5) + VERSION_X
)<<7) + VERSION_Y
)<<5) + VERSION_A
)<<10) + VERSION_Z);
lua_setfield(L, -2, "num");
lua_newtable(L);
lua_pushinteger(L, 1); lua_pushinteger(L, VERSION_W); lua_settable(L, -3);
lua_pushinteger(L, 2); lua_pushinteger(L, VERSION_X); lua_settable(L, -3);
lua_pushinteger(L, 3); lua_pushinteger(L, VERSION_Y); lua_settable(L, -3);
lua_pushinteger(L, 4); lua_pushinteger(L, VERSION_A); lua_settable(L, -3);
lua_pushinteger(L, 5); lua_pushinteger(L, VERSION_Z); lua_settable(L, -3);
lua_setfield(L, -2, "cmp");
lua_setfield(L, -2, "version");
lua_pop(L, 1);
}
int icelua_init(void) int icelua_init(void)
{ {
int i, argct; int i, argct;
@ -273,7 +312,7 @@ int icelua_init(void)
icelua_loadbasefuncs(lstate_client); icelua_loadbasefuncs(lstate_client);
icelua_loadbasefuncs(lstate_server); icelua_loadbasefuncs(lstate_server);
// shove some pathnames in // shove some pathnames / versions in
if(lstate_server != NULL) if(lstate_server != NULL)
{ {
lua_getglobal(lstate_server, "common"); lua_getglobal(lstate_server, "common");
@ -284,7 +323,17 @@ int icelua_init(void)
lua_pushstring(lstate_server, mod_basedir+4); lua_pushstring(lstate_server, mod_basedir+4);
lua_setfield(lstate_server, -2, "base_dir"); lua_setfield(lstate_server, -2, "base_dir");
lua_pop(lstate_server, 1); lua_pop(lstate_server, 1);
icelua_pushversion(lstate_server, "common");
icelua_pushversion(lstate_server, "server");
} }
if(lstate_client != NULL)
{
icelua_pushversion(lstate_client, "common");
icelua_pushversion(lstate_client, "client");
}
/* /*
NOTE: NOTE:
to call stuff, use lua_pcall. to call stuff, use lua_pcall.

View File

@ -1505,13 +1505,15 @@ void render_pmf_bone(uint32_t *pixels, int width, int height, int pitch, camera_
} }
// get correct centre depth // get correct centre depth
float max_axis = fabsf(x); float m = fabsf(x);
if(max_axis < fabsf(y)) if(m < fabsf(y))
max_axis = fabsf(y); m = fabsf(y);
if(max_axis < fabsf(z)) if(m < fabsf(z))
max_axis = fabsf(z); m = fabsf(z);
float dlen = sqrtf(x*x+y*y+z*z); //float dlen2 = x*x + y*y + z*z;
float depth = max_axis/dlen; //float dlen = sqrtf(dlen2);
//float depth = sqrtf(2*m*m - dlen2);
float depth = m;
// cameranananinate // cameranananinate
if(!islocal) if(!islocal)
@ -1524,7 +1526,7 @@ void render_pmf_bone(uint32_t *pixels, int width, int height, int pitch, camera_
y = ny; y = ny;
z = nz; z = nz;
} }
depth *= z*rezoom; //depth *= z*rezoom;
// plotinate // plotinate
render_pmf_box(-x, y, z, depth, pt->radius*scale, color); render_pmf_box(-x, y, z, depth, pt->radius*scale, color);

View File

@ -37,12 +37,12 @@ vec4f_t mtx_apply_vec(matrix_t *mtx, vec4f_t *vec)
vec4f_t ret = {.m = {}}; //c99 + vector extensions, hopefully it optimizes vec4f_t ret = {.m = {}}; //c99 + vector extensions, hopefully it optimizes
vec4f_t accum; vec4f_t accum;
const mask[4] = {0x00,0x55,0xAA,0xFF}; const int mask[4] = {0x00,0x55,0xAA,0xFF};
for(i = 0; i < 4; i++) for(i = 0; i < 4; i++)
{ {
accum.m = vec->m; accum.m = vec->m;
__builtin_ia32_shufps(accum.m, accum.m, mask[i]); _mm_shuffle_ps(accum.m, accum.m, mask[i]);
accum.m *= mtx->c[i].m; accum.m *= mtx->c[i].m;
ret.m += accum.m; ret.m += accum.m;
} }