diff --git a/lua.c b/lua.c index f2dfed0..a8368a5 100644 --- a/lua.c +++ b/lua.c @@ -545,11 +545,12 @@ int icelua_fn_client_camera_point(lua_State *L) dx = lua_tonumber(L, 1); dy = lua_tonumber(L, 2); dz = lua_tonumber(L, 3); - if(top <= 4) + if(top >= 4) zoom = lua_tonumber(L, 4); - if(top <= 5) + if(top >= 5) roll = lua_tonumber(L, 5); + //printf("%f\n", zoom); cam_point_dir(&tcam, dx, dy, dz, zoom, roll); return 0; diff --git a/pkg/base/gfx/crosshair.xcf b/pkg/base/gfx/crosshair.xcf new file mode 100644 index 0000000..76c467e Binary files /dev/null and b/pkg/base/gfx/crosshair.xcf differ diff --git a/pkg/base/lib_vector.lua b/pkg/base/lib_vector.lua index 745a97e..03bdb88 100644 --- a/pkg/base/lib_vector.lua +++ b/pkg/base/lib_vector.lua @@ -296,3 +296,8 @@ function trace_map_box(x1,y1,z1, x2,y2,z2, bx1,by1,bz1, bx2,by2,bz2, canwrap) return rx or x2, ry or y2, rz or z2 end + +function isect_line_sphere(x1,y1,z1,fx,fy,fz,x2,y2,z2) + +end + diff --git a/pkg/base/main_client.lua b/pkg/base/main_client.lua index 7cce4ed..972cb43 100644 --- a/pkg/base/main_client.lua +++ b/pkg/base/main_client.lua @@ -33,6 +33,7 @@ BTSK_RIGHT = SDLK_d BTSK_JUMP = SDLK_SPACE BTSK_CROUCH = SDLK_LCTRL BTSK_SNEAK = SDLK_v +BTSK_RELOAD = SDLK_r BTSK_TOOL1 = SDLK_1 BTSK_TOOL2 = SDLK_2 @@ -59,18 +60,22 @@ MODE_SOFTCROUCH = true MODE_TILT_SLOWDOWN = false -- TODO! MODE_TILT_DOWN_NOCLIMB = false -- TODO! +MODE_DELAY_SPADE_DIG = 1.0 +MODE_DELAY_SPADE_HIT = 0.25 +MODE_DELAY_BLOCK_BUILD = 0.5 +MODE_DELAY_TOOL_CHANGE = 0.4 + -- tools TOOL_SPADE = 0 TOOL_BLOCK = 1 TOOL_GUN = 2 +TOOL_NADE = 3 -- weapons WPN_RIFLE = 0 WPN_NOOB = 1 WPN_SHOTTY = 2 -math.random() - weapons = { [WPN_RIFLE] = { -- version: 0.60 with spread removed completely @@ -179,6 +184,7 @@ function new_player(settings) this.weapon = settings.weapon or WPN_RIFLE this.alive = false this.spawned = false + this.zooming = false function this.input_reset() this.ev_forward = false @@ -211,7 +217,6 @@ function new_player(settings) this.grounded = false this.crouching = false - this.scoped = false this.vx, this.vy, this.vz = 0, 0, 0 this.angy, this.angx = math.pi/2.0, 0.0 @@ -227,6 +232,7 @@ function new_player(settings) this.jerkoffs = 0.0 this.zoom = 1.0 + this.zooming = false this.health = 100 this.blocks = 25 @@ -246,6 +252,16 @@ function new_player(settings) this.angx = -math.pi*0.499 end + if this.tool ~= TOOL_GUN then + this.zooming = false + end + + if this.zooming then + this.zoom = 3.0 + else + this.zoom = 1.0 + end + -- set camera direction local sya = math.sin(this.angy) local cya = math.cos(this.angy) @@ -253,7 +269,6 @@ function new_player(settings) local cxa = math.cos(this.angx) local fwx,fwy,fwz fwx,fwy,fwz = sya*cxa, sxa, cya*cxa - client.camera_point(fwx, fwy, fwz, zoom, 0.0) -- move along local mvx = 0.0 @@ -290,7 +305,7 @@ function new_player(settings) mvz = mvz / mvd -- apply base slowdown - local mvspd = 8.0/this.zoom + local mvspd = 8.0 local mvchange = 10.0 mvx = mvx * mvspd mvz = mvz * mvspd @@ -309,12 +324,11 @@ function new_player(settings) mvx = mvx * 0.5 mvz = mvz * 0.5 end - if this.scoped or this.ev_sneak then + if this.zooming or this.ev_sneak then mvx = mvx * 0.5 mvz = mvz * 0.5 end - -- apply rotation mvx, mvz = mvx*cya+mvz*sya, mvz*cya-mvx*sya @@ -406,10 +420,35 @@ function new_player(settings) end function this.camera_firstperson() + -- set camera position client.camera_move_to(this.x, this.y + this.jerkoffs, this.z) + + -- set camera direction + local sya = math.sin(this.angy) + local cya = math.cos(this.angy) + local sxa = math.sin(this.angx) + local cxa = math.cos(this.angx) + local fwx,fwy,fwz + fwx,fwy,fwz = sya*cxa, sxa, cya*cxa + client.camera_point(fwx, fwy, fwz, this.zoom, 0.0) end function this.show_hud() + local w, h + w, h = client.screen_get_dims() + + -- TODO: palettise this more nicely + local i + for i=1,#mdl_block_data do + mdl_block_data[i].r, + mdl_block_data[i].g, + mdl_block_data[i].b = + this.blk_color[1], + this.blk_color[2], + this.blk_color[3] + end + client.model_bone_set(mdl_block, mdl_block_bone, "block", mdl_block_data) + local ays,ayc ays = math.sin(this.angy) ayc = math.cos(this.angy) @@ -430,22 +469,25 @@ function new_player(settings) (this.crouching and mdl_bbox_bone2) or mdl_bbox_bone1, this.x, this.y, this.z, 0, 0, 0.0, 1) + -- TODO: not have this on all the time + client.model_render_bone_local(mdl_spade, mdl_spade_bone, + 1-0.15, -h/w+0.25, 1.0, + rotpos*0.01, 0.0, 0.0, 0.2*((this.tool == TOOL_SPADE and 1.5) or 1.0)) + client.model_render_bone_local(mdl_block, mdl_block_bone, + 1-0.30, -h/w+0.2, 1.0, + rotpos*0.01, 0.0, 0.0, 0.1*((this.tool == TOOL_BLOCK and 2.0) or 1.0)) + client.model_render_bone_local(mdl_rifle, mdl_rifle_bone, + 1-0.45, -h/w+0.2, 1.0, + rotpos*0.01, 0.0, 0.0, 0.2*((this.tool == TOOL_GUN and 2.0) or 1.0)) + client.model_render_bone_local(mdl_nade, mdl_nade_bone, + 1-0.60, -h/w+0.2, 1.0, + rotpos*0.01, 0.0, 0.0, 0.1*((this.tool == TOOL_NADE and 2.0) or 1.0)) + if this.tool == TOOL_SPADE then client.model_render_bone_global(mdl_spade, mdl_spade_bone, this.x-ayc*0.2, this.y+this.jerkoffs+0.2, this.z+ays*0.2, 0.0, -this.angx-math.pi/2*0.90, this.angy, 1) elseif this.tool == TOOL_BLOCK then - -- TODO: palettise this more nicely - local i - for i=1,#mdl_block_data do - mdl_block_data[i].r, - mdl_block_data[i].g, - mdl_block_data[i].b = - this.blk_color[1], - this.blk_color[2], - this.blk_color[3] - end - client.model_bone_set(mdl_block, mdl_block_bone, "block", mdl_block_data) client.model_render_bone_global(mdl_block, mdl_block_bone, this.x-ayc*0.1+ays*0.1, this.y+this.jerkoffs+0.1, this.z+ays*0.1+ayc*0.1, 0.0, -this.angx, this.angy, 0.2) @@ -453,11 +495,12 @@ function new_player(settings) client.model_render_bone_global(mdl_rifle, mdl_rifle_bone, this.x-ayc*0.1+ays*0.1, this.y+this.jerkoffs+0.1, this.z+ays*0.1+ayc*0.1, math.pi/2, -this.angx, this.angy, 1) + elseif this.tool == TOOL_NADE then + client.model_render_bone_global(mdl_nade, mdl_nade_bone, + this.x-ayc*0.1+ays*0.1, this.y+this.jerkoffs+0.1, this.z+ays*0.1+ayc*0.1, + 0.0, -this.angx, this.angy, 0.14) end - local w, h - w, h = client.screen_get_dims() - local color = 0xFFA1FFA1 local hstr = ""..this.health local astr = ""..this.ammo_clip.."-"..this.ammo_reserve @@ -505,6 +548,7 @@ mdl_spade, mdl_spade_bone = client.model_load_pmf("pkg/base/pmf/spade.pmf"), 0 mdl_block, mdl_block_bone = client.model_load_pmf("pkg/base/pmf/block.pmf"), 0 -- TODO: load all weapons mdl_rifle, mdl_rifle_bone = client.model_load_pmf("pkg/base/pmf/rifle.pmf"), 0 +mdl_nade, mdl_nade_bone = client.model_load_pmf("pkg/base/pmf/nade.pmf"), 0 local _ _, mdl_block_data = client.model_bone_get(mdl_block, mdl_block_bone) @@ -595,7 +639,7 @@ function client.hook_key(key, state) elseif key == BTSK_TOOL3 then players[1].tool = TOOL_GUN elseif key == BTSK_TOOL4 then - -- TODO + players[1].tool = TOOL_NADE elseif key == BTSK_TOOL5 then -- TODO elseif state then @@ -658,6 +702,8 @@ function client.hook_mouse_button(button, state) players[1].blk_color = {cr,cg,cb} elseif players[1].tool == TOOL_SPADE and players[1].blx3 then -- TODO: 1x3 break + elseif players[1].tool == TOOL_GUN then + players[1].zooming = not players[1].zooming end elseif button == 2 then -- middleclick @@ -673,8 +719,8 @@ function client.hook_mouse_motion(x, y, dx, dy) return end - players[1].angy = players[1].angy - dx*math.pi*sensitivity - players[1].angx = players[1].angx + dy*math.pi*sensitivity + players[1].angy = players[1].angy - dx*math.pi*sensitivity/players[1].zoom + players[1].angx = players[1].angx + dy*math.pi*sensitivity/players[1].zoom end function client.hook_render() diff --git a/pkg/base/pmf/nade.pmf b/pkg/base/pmf/nade.pmf new file mode 100644 index 0000000..461e223 Binary files /dev/null and b/pkg/base/pmf/nade.pmf differ diff --git a/render.c b/render.c index 4b51e6a..265951f 100644 --- a/render.c +++ b/render.c @@ -889,6 +889,11 @@ void render_pmf_bone(uint32_t *pixels, int width, int height, int pitch, camera_ rtmp_pitch = pitch; rtmp_camera = cam_base; + // get zoom factor + float bzoom = (cam_base->mzx*cam_base->mzx + + cam_base->mzy*cam_base->mzy + + cam_base->mzz*cam_base->mzz); + float unzoom = 1.0f/bzoom; scale /= 256.0f; int i; for(i = 0; i < bone->ptlen; i++) @@ -952,7 +957,7 @@ void render_pmf_bone(uint32_t *pixels, int width, int height, int pitch, camera_ { float nx = x*cam_base->mxx+y*cam_base->mxy+z*cam_base->mxz; float ny = x*cam_base->myx+y*cam_base->myy+z*cam_base->myz; - float nz = x*cam_base->mzx+y*cam_base->mzy+z*cam_base->mzz; + float nz = x*cam_base->mzx*unzoom+y*cam_base->mzy*unzoom+z*cam_base->mzz*unzoom; x = nx; y = ny;