X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FObjects%2FWeapons.cpp;h=42ee250786c0356cf0a2d8c11bdaf75343d41163;hb=8b6e8f3ad7390309795eb35c0959264cb7924402;hp=d762ddcfa0ad17f973171459a46b0dc7c667853f;hpb=a3775aa01cd00672b37785365675f6842b9db2dc;p=lugaru.git diff --git a/Source/Objects/Weapons.cpp b/Source/Objects/Weapons.cpp index d762ddc..42ee250 100644 --- a/Source/Objects/Weapons.cpp +++ b/Source/Objects/Weapons.cpp @@ -23,10 +23,11 @@ along with Lugaru. If not, see . #include "Objects/Weapons.hpp" #include "Animation/Animation.hpp" -#include "Audio/openal_wrapper.hpp" #include "Audio/Sounds.hpp" +#include "Audio/openal_wrapper.hpp" #include "Game.hpp" #include "Level/Awards.hpp" +#include "Tutorial.hpp" extern float multiplier; extern Terrain terrain; @@ -48,7 +49,6 @@ extern float woozy; extern float viewdistance; extern float blackout; extern bool freeze; -extern int tutoriallevel; extern int numthrowkill; Model Weapon::throwingknifemodel; @@ -64,7 +64,8 @@ Texture Weapon::bloodswordtextureptr; Model Weapon::staffmodel; Texture Weapon::stafftextureptr; -Weapon::Weapon(int t, int o) : owner(o) +Weapon::Weapon(int t, int o) + : owner(o) { setType(t); bloody = 0; @@ -97,7 +98,44 @@ void Weapon::setType(int t) } } -void Weapon::DoStuff(int i) +/* Load weapons models and textures */ +void Weapon::Load() +{ + LOG("Loading weapon data..."); + + knifetextureptr.load("Textures/Knife.png", 0); + bloodknifetextureptr.load("Textures/BloodKnife.png", 0); + lightbloodknifetextureptr.load("Textures/BloodKnifeLight.png", 0); + swordtextureptr.load("Textures/Sword.jpg", 1); + bloodswordtextureptr.load("Textures/SwordBlood.jpg", 1); + lightbloodswordtextureptr.load("Textures/SwordBloodLight.jpg", 1); + stafftextureptr.load("Textures/Staff.jpg", 1); + + throwingknifemodel.load("Models/ThrowingKnife.solid"); + throwingknifemodel.Scale(.001, .001, .001); + throwingknifemodel.Rotate(90, 0, 0); + throwingknifemodel.Rotate(0, 90, 0); + throwingknifemodel.flat = 0; + throwingknifemodel.CalculateNormals(1); + + swordmodel.load("Models/Sword.solid"); + swordmodel.Scale(.001, .001, .001); + swordmodel.Rotate(90, 0, 0); + swordmodel.Rotate(0, 90, 0); + swordmodel.Rotate(0, 0, 90); + swordmodel.flat = 1; + swordmodel.CalculateNormals(1); + + staffmodel.load("Models/Staff.solid"); + staffmodel.Scale(.005, .005, .005); + staffmodel.Rotate(90, 0, 0); + staffmodel.Rotate(0, 90, 0); + staffmodel.Rotate(0, 0, 90); + staffmodel.flat = 1; + staffmodel.CalculateNormals(1); +} + +void Weapon::doStuff(int i) { static int whichpatchx, whichpatchz, whichhit; static XYZ start, end, colpoint, normalrot, footvel, footpoint; @@ -157,57 +195,55 @@ void Weapon::DoStuff(int i) whichpatchx = position.x / (terrain.size / subdivision * terrain.scale); whichpatchz = position.z / (terrain.size / subdivision * terrain.scale); if (whichpatchx > 0 && whichpatchz > 0 && whichpatchx < subdivision && whichpatchz < subdivision) { - if (terrain.patchobjectnum[whichpatchx][whichpatchz]) { // if there are Object::objects where the weapon is - for (int j = 0; j < terrain.patchobjectnum[whichpatchx][whichpatchz]; j++) { // check for collision - int k = terrain.patchobjects[whichpatchx][whichpatchz][j]; - start = oldtippoint; - end = tippoint; - whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); - if (whichhit != -1) { - if (Object::objects[k]->type == treetrunktype) { - Object::objects[k]->model.MakeDecal(breakdecal, DoRotation(colpoint - Object::objects[k]->position, 0, -Object::objects[k]->yaw, 0), .1, 1, Random() % 360); - normalrot = DoRotation(Object::objects[k]->model.facenormals[whichhit], 0, Object::objects[k]->yaw, 0); - velocity = 0; - if (type == knife) - position = colpoint - normalrot * .1; - else if (type == sword) - position = colpoint - normalrot * .2; - else if (type == staff) - position = colpoint - normalrot * .2; - XYZ temppoint1, temppoint2; - float distance; - - temppoint1 = 0; - temppoint2 = normalrot; - distance = findDistance(&temppoint1, &temppoint2); - rotation2 = asin((temppoint1.y - temppoint2.y) / distance); - rotation2 *= 360 / 6.28; - temppoint1.y = 0; - temppoint2.y = 0; - rotation1 = acos((temppoint1.z - temppoint2.z) / findDistance(&temppoint1, &temppoint2)); - rotation1 *= 360 / 6.28; - if (temppoint1.x > temppoint2.x) - rotation1 = 360 - rotation1; - - rotation3 = 0; - smallrotation = 90; - smallrotation2 = 0; - bigtilt = 0; - bigtilt2 = 0; - bigrotation = 0; - - emit_sound_at(knifesheathesound, position, 128.); - - bloody = 0; - - Sprite::MakeSprite(cloudimpactsprite, position, velocity, 1, 1, 1, .8, .3); - } else { - physics = 1; - firstfree = 1; - position -= velocity * multiplier; - tippoint -= velocity * multiplier; - tipvelocity = velocity; - } + for (unsigned int j = 0; j < terrain.patchobjects[whichpatchx][whichpatchz].size(); j++) { // check for collision + unsigned int k = terrain.patchobjects[whichpatchx][whichpatchz][j]; + start = oldtippoint; + end = tippoint; + whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); + if (whichhit != -1) { + if (Object::objects[k]->type == treetrunktype) { + Object::objects[k]->model.MakeDecal(breakdecal, DoRotation(colpoint - Object::objects[k]->position, 0, -Object::objects[k]->yaw, 0), .1, 1, Random() % 360); + normalrot = DoRotation(Object::objects[k]->model.Triangles[whichhit].facenormal, 0, Object::objects[k]->yaw, 0); + velocity = 0; + if (type == knife) + position = colpoint - normalrot * .1; + else if (type == sword) + position = colpoint - normalrot * .2; + else if (type == staff) + position = colpoint - normalrot * .2; + XYZ temppoint1, temppoint2; + float distance; + + temppoint1 = 0; + temppoint2 = normalrot; + distance = findDistance(&temppoint1, &temppoint2); + rotation2 = asin((temppoint1.y - temppoint2.y) / distance); + rotation2 *= 360 / 6.28; + temppoint1.y = 0; + temppoint2.y = 0; + rotation1 = acos((temppoint1.z - temppoint2.z) / findDistance(&temppoint1, &temppoint2)); + rotation1 *= 360 / 6.28; + if (temppoint1.x > temppoint2.x) + rotation1 = 360 - rotation1; + + rotation3 = 0; + smallrotation = 90; + smallrotation2 = 0; + bigtilt = 0; + bigtilt2 = 0; + bigrotation = 0; + + emit_sound_at(knifesheathesound, position, 128.); + + bloody = 0; + + Sprite::MakeSprite(cloudimpactsprite, position, velocity, 1, 1, 1, .8, .3); + } else { + physics = 1; + firstfree = 1; + position -= velocity * multiplier; + tippoint -= velocity * multiplier; + tipvelocity = velocity; } } } @@ -218,11 +254,11 @@ void Weapon::DoStuff(int i) footvel = 0; footpoint = DoRotation((Person::players[j]->jointPos(abdomen) + Person::players[j]->jointPos(neck)) / 2, 0, Person::players[j]->yaw, 0) * Person::players[j]->scale + Person::players[j]->coords; if (owner == -1 && distsqflat(&position, &Person::players[j]->coords) < 1.5 && - distsq(&position, &Person::players[j]->coords) < 4 && Person::players[j]->weaponstuck == -1 && - !Person::players[j]->skeleton.free && (int(j) != oldowner)) { + distsq(&position, &Person::players[j]->coords) < 4 && Person::players[j]->weaponstuck == -1 && + !Person::players[j]->skeleton.free && (int(j) != oldowner)) { if ((Person::players[j]->aitype != attacktypecutoff || abs(Random() % 6) == 0 || (Person::players[j]->animTarget != backhandspringanim && Person::players[j]->animTarget != rollanim && Person::players[j]->animTarget != flipanim && Random() % 2 == 0)) && !missed) { - if ( (Person::players[j]->creature == wolftype && Random() % 3 != 0 && Person::players[j]->weaponactive == -1 && (Person::players[j]->isIdle() || Person::players[j]->isRun() || Person::players[j]->animTarget == walkanim)) || - (Person::players[j]->creature == rabbittype && Random() % 2 == 0 && Person::players[j]->aitype == attacktypecutoff && Person::players[j]->weaponactive == -1)) { + if ((Person::players[j]->creature == wolftype && Random() % 3 != 0 && Person::players[j]->weaponactive == -1 && (Person::players[j]->isIdle() || Person::players[j]->isRun() || Person::players[j]->animTarget == walkanim)) || + (Person::players[j]->creature == rabbittype && Random() % 2 == 0 && Person::players[j]->aitype == attacktypecutoff && Person::players[j]->weaponactive == -1)) { emit_sound_at(knifedrawsound, Person::players[j]->coords, 128.); Person::players[j]->animTarget = removeknifeanim; @@ -248,16 +284,16 @@ void Weapon::DoStuff(int i) Person::players[j]->jointVel(neck) += velocity * 2; Person::players[j]->jointVel(rightshoulder) += velocity * 2; Person::players[j]->jointVel(leftshoulder) += velocity * 2; - if (bloodtoggle && tutoriallevel != 1) + if (bloodtoggle && !Tutorial::active) Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 0, 0, .8, .3); - if (tutoriallevel == 1) + if (Tutorial::active) Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 1, 1, .8, .3); footvel = tippoint - position; Normalise(&footvel); - if (bloodtoggle && tutoriallevel != 1) + if (bloodtoggle && !Tutorial::active) Sprite::MakeSprite(bloodflamesprite, footpoint, footvel * -1, 1, 0, 0, .6, 1); - if (tutoriallevel != 1) { + if (!Tutorial::active) { if (Person::players[j]->weaponstuckwhere == 0) Person::players[j]->DoBloodBig(2, 205); if (Person::players[j]->weaponstuckwhere == 1) @@ -371,7 +407,6 @@ void Weapon::DoStuff(int i) if (temppoint1.x > temppoint2.x) rotation1 = 360 - rotation1; } - } //Sword physics @@ -402,224 +437,222 @@ void Weapon::DoStuff(int i) position = newpoint1; tippoint = newpoint2; - //Object collisions whichpatchx = (position.x) / (terrain.size / subdivision * terrain.scale); whichpatchz = (position.z) / (terrain.size / subdivision * terrain.scale); - if (whichpatchx > 0 && whichpatchz > 0 && whichpatchx < subdivision && whichpatchz < subdivision) - if (terrain.patchobjectnum[whichpatchx][whichpatchz]) { - for (int j = 0; j < terrain.patchobjectnum[whichpatchx][whichpatchz]; j++) { - int k = terrain.patchobjects[whichpatchx][whichpatchz][j]; - - if (firstfree) { - if (type == staff) { - start = tippoint - (position - tippoint) / 5; - end = position + (position - tippoint) / 30; - whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); - if (whichhit != -1) { - XYZ diff; - diff = (colpoint - position); - Normalise(&diff); - hitsomething = 1; - - tippoint += (colpoint - position) + diff * .05; - position = colpoint + diff * .05; - oldtippoint = tippoint; - oldposition = tippoint; - } - } else { - start = position - (tippoint - position) / 5; - end = tippoint + (tippoint - position) / 30; - whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); - if (whichhit != -1) { - XYZ diff; - diff = (colpoint - tippoint); - Normalise(&diff); - hitsomething = 1; - - position += (colpoint - tippoint) + diff * .05; - tippoint = colpoint + diff * .05; - oldposition = position; - oldtippoint = tippoint; - } - } - } + if (whichpatchx > 0 && whichpatchz > 0 && whichpatchx < subdivision && whichpatchz < subdivision) { + for (unsigned int j = 0; j < terrain.patchobjects[whichpatchx][whichpatchz].size(); j++) { + unsigned int k = terrain.patchobjects[whichpatchx][whichpatchz][j]; + + if (firstfree) { + if (type == staff) { + start = tippoint - (position - tippoint) / 5; + end = position + (position - tippoint) / 30; + whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); + if (whichhit != -1) { + XYZ diff; + diff = (colpoint - position); + Normalise(&diff); + hitsomething = 1; - start = oldposition; - end = position; - whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); - if (whichhit != -1) { - hitsomething = 1; - position = colpoint; - terrainnormal = DoRotation(Object::objects[k]->model.facenormals[whichhit], 0, Object::objects[k]->yaw, 0) * -1; - ReflectVector(&velocity, &terrainnormal); - position += terrainnormal * .002; - - bounceness = terrainnormal * findLength(&velocity) * (abs(normaldotproduct(velocity, terrainnormal))); - if (findLengthfast(&velocity) < findLengthfast(&bounceness)) - bounceness = 0; - frictionness = abs(normaldotproduct(velocity, terrainnormal)); - velocity -= bounceness; - if (1 - friction * frictionness > 0) - velocity *= 1 - friction * frictionness; - else - velocity = 0; - velocity += bounceness * elasticity; + tippoint += (colpoint - position) + diff * .05; + position = colpoint + diff * .05; + oldtippoint = tippoint; + oldposition = tippoint; + } + } else { + start = position - (tippoint - position) / 5; + end = tippoint + (tippoint - position) / 30; + whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); + if (whichhit != -1) { + XYZ diff; + diff = (colpoint - tippoint); + Normalise(&diff); + hitsomething = 1; - if (findLengthfast(&bounceness) > 1) { - int whichsound; - if (type == staff) - whichsound = footstepsound3 + abs(Random() % 2); - else - whichsound = clank1sound + abs(Random() % 4); - emit_sound_at(whichsound, position, 128 * findLengthfast(&bounceness)); + position += (colpoint - tippoint) + diff * .05; + tippoint = colpoint + diff * .05; + oldposition = position; + oldtippoint = tippoint; } } - start = oldtippoint; - end = tippoint; - whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); - if (whichhit != -1) { - hitsomething = 1; - tippoint = colpoint; - terrainnormal = DoRotation(Object::objects[k]->model.facenormals[whichhit], 0, Object::objects[k]->yaw, 0) * -1; - ReflectVector(&tipvelocity, &terrainnormal); - tippoint += terrainnormal * .002; - - bounceness = terrainnormal * findLength(&tipvelocity) * (abs(normaldotproduct(tipvelocity, terrainnormal))); - if (findLengthfast(&tipvelocity) < findLengthfast(&bounceness)) - bounceness = 0; - frictionness = abs(normaldotproduct(tipvelocity, terrainnormal)); - tipvelocity -= bounceness; - if (1 - friction * frictionness > 0) - tipvelocity *= 1 - friction * frictionness; + } + + start = oldposition; + end = position; + whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); + if (whichhit != -1) { + hitsomething = 1; + position = colpoint; + terrainnormal = DoRotation(Object::objects[k]->model.Triangles[whichhit].facenormal, 0, Object::objects[k]->yaw, 0) * -1; + ReflectVector(&velocity, &terrainnormal); + position += terrainnormal * .002; + + bounceness = terrainnormal * findLength(&velocity) * (abs(normaldotproduct(velocity, terrainnormal))); + if (findLengthfast(&velocity) < findLengthfast(&bounceness)) + bounceness = 0; + frictionness = abs(normaldotproduct(velocity, terrainnormal)); + velocity -= bounceness; + if (1 - friction * frictionness > 0) + velocity *= 1 - friction * frictionness; + else + velocity = 0; + velocity += bounceness * elasticity; + + if (findLengthfast(&bounceness) > 1) { + int whichsound; + if (type == staff) + whichsound = footstepsound3 + abs(Random() % 2); else - tipvelocity = 0; - tipvelocity += bounceness * elasticity; + whichsound = clank1sound + abs(Random() % 4); + emit_sound_at(whichsound, position, 128 * findLengthfast(&bounceness)); + } + } + start = oldtippoint; + end = tippoint; + whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); + if (whichhit != -1) { + hitsomething = 1; + tippoint = colpoint; + terrainnormal = DoRotation(Object::objects[k]->model.Triangles[whichhit].facenormal, 0, Object::objects[k]->yaw, 0) * -1; + ReflectVector(&tipvelocity, &terrainnormal); + tippoint += terrainnormal * .002; + + bounceness = terrainnormal * findLength(&tipvelocity) * (abs(normaldotproduct(tipvelocity, terrainnormal))); + if (findLengthfast(&tipvelocity) < findLengthfast(&bounceness)) + bounceness = 0; + frictionness = abs(normaldotproduct(tipvelocity, terrainnormal)); + tipvelocity -= bounceness; + if (1 - friction * frictionness > 0) + tipvelocity *= 1 - friction * frictionness; + else + tipvelocity = 0; + tipvelocity += bounceness * elasticity; - if (findLengthfast(&bounceness) > 1) { - int whichsound; - if (type == staff) - whichsound = footstepsound3 + abs(Random() % 2); - else - whichsound = clank1sound + abs(Random() % 4); - emit_sound_at(whichsound, position, 128 * findLengthfast(&bounceness)); - } + if (findLengthfast(&bounceness) > 1) { + int whichsound; + if (type == staff) + whichsound = footstepsound3 + abs(Random() % 2); + else + whichsound = clank1sound + abs(Random() % 4); + emit_sound_at(whichsound, position, 128 * findLengthfast(&bounceness)); } + } - if ((Object::objects[k]->type != boxtype && Object::objects[k]->type != platformtype && Object::objects[k]->type != walltype && Object::objects[k]->type != weirdtype) || Object::objects[k]->pitch != 0) - for (int m = 0; m < 2; m++) { - mid = (position * (21 + (float)m * 10) + tippoint * (19 - (float)m * 10)) / 40; - oldmid2 = mid; - oldmid = (oldposition * (21 + (float)m * 10) + oldtippoint * (19 - (float)m * 10)) / 40; - - start = oldmid; - end = mid; - whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); - if (whichhit != -1) { - hitsomething = 1; - mid = colpoint; - terrainnormal = DoRotation(Object::objects[k]->model.facenormals[whichhit], 0, Object::objects[k]->yaw, 0) * -1; - ReflectVector(&velocity, &terrainnormal); - - bounceness = terrainnormal * findLength(&velocity) * (abs(normaldotproduct(velocity, terrainnormal))); - if (findLengthfast(&velocity) < findLengthfast(&bounceness)) - bounceness = 0; - frictionness = abs(normaldotproduct(velocity, terrainnormal)); - velocity -= bounceness; - if (1 - friction * frictionness > 0) - velocity *= 1 - friction * frictionness; - else - velocity = 0; - velocity += bounceness * elasticity; - - if (findLengthfast(&bounceness) > 1) { - int whichsound; - if (type == staff) - whichsound = footstepsound3 + abs(Random() % 2); - else - whichsound = clank1sound + abs(Random() % 4); - emit_sound_at(whichsound, mid, 128 * findLengthfast(&bounceness)); - } - position += (mid - oldmid2) * (20 / (1 + (float)m * 10)); - } + if ((Object::objects[k]->type != boxtype && Object::objects[k]->type != platformtype && Object::objects[k]->type != walltype && Object::objects[k]->type != weirdtype) || Object::objects[k]->pitch != 0) + for (int m = 0; m < 2; m++) { + mid = (position * (21 + (float)m * 10) + tippoint * (19 - (float)m * 10)) / 40; + oldmid2 = mid; + oldmid = (oldposition * (21 + (float)m * 10) + oldtippoint * (19 - (float)m * 10)) / 40; + + start = oldmid; + end = mid; + whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); + if (whichhit != -1) { + hitsomething = 1; + mid = colpoint; + terrainnormal = DoRotation(Object::objects[k]->model.Triangles[whichhit].facenormal, 0, Object::objects[k]->yaw, 0) * -1; + ReflectVector(&velocity, &terrainnormal); + + bounceness = terrainnormal * findLength(&velocity) * (abs(normaldotproduct(velocity, terrainnormal))); + if (findLengthfast(&velocity) < findLengthfast(&bounceness)) + bounceness = 0; + frictionness = abs(normaldotproduct(velocity, terrainnormal)); + velocity -= bounceness; + if (1 - friction * frictionness > 0) + velocity *= 1 - friction * frictionness; + else + velocity = 0; + velocity += bounceness * elasticity; - mid = (position * (19 - (float)m * 10) + tippoint * (21 + (float)m * 10)) / 40; - oldmid2 = mid; - oldmid = (oldposition * (19 - (float)m * 10) + oldtippoint * (21 + (float)m * 10)) / 40; - - start = oldmid; - end = mid; - whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); - if (whichhit != -1) { - hitsomething = 1; - mid = colpoint; - terrainnormal = DoRotation(Object::objects[k]->model.facenormals[whichhit], 0, Object::objects[k]->yaw, 0) * -1; - ReflectVector(&tipvelocity, &terrainnormal); - - bounceness = terrainnormal * findLength(&tipvelocity) * (abs(normaldotproduct(tipvelocity, terrainnormal))); - if (findLengthfast(&tipvelocity) < findLengthfast(&bounceness)) - bounceness = 0; - frictionness = abs(normaldotproduct(tipvelocity, terrainnormal)); - tipvelocity -= bounceness; - if (1 - friction * frictionness > 0) - tipvelocity *= 1 - friction * frictionness; + if (findLengthfast(&bounceness) > 1) { + int whichsound; + if (type == staff) + whichsound = footstepsound3 + abs(Random() % 2); else - tipvelocity = 0; - tipvelocity += bounceness * elasticity; - - if (findLengthfast(&bounceness) > 1) { - int whichsound; - if (type == staff) - whichsound = footstepsound3 + abs(Random() % 2); - else - whichsound = clank1sound + abs(Random() % 4); - emit_sound_at(whichsound, mid, 128 * findLengthfast(&bounceness)); - } - tippoint += (mid - oldmid2) * (20 / (1 + (float)m * 10)); + whichsound = clank1sound + abs(Random() % 4); + emit_sound_at(whichsound, mid, 128 * findLengthfast(&bounceness)); } + position += (mid - oldmid2) * (20 / (1 + (float)m * 10)); } - else { - start = position; - end = tippoint; + + mid = (position * (19 - (float)m * 10) + tippoint * (21 + (float)m * 10)) / 40; + oldmid2 = mid; + oldmid = (oldposition * (19 - (float)m * 10) + oldtippoint * (21 + (float)m * 10)) / 40; + + start = oldmid; + end = mid; whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); if (whichhit != -1) { hitsomething = 1; - closestdistance = -1; - closestswordpoint = colpoint; //(position+tippoint)/2; - point[0] = DoRotation(Object::objects[k]->model.vertex[Object::objects[k]->model.Triangles[whichhit].vertex[0]], 0, Object::objects[k]->yaw, 0) + Object::objects[k]->position; - point[1] = DoRotation(Object::objects[k]->model.vertex[Object::objects[k]->model.Triangles[whichhit].vertex[1]], 0, Object::objects[k]->yaw, 0) + Object::objects[k]->position; - point[2] = DoRotation(Object::objects[k]->model.vertex[Object::objects[k]->model.Triangles[whichhit].vertex[2]], 0, Object::objects[k]->yaw, 0) + Object::objects[k]->position; - if (DistancePointLine(&closestswordpoint, &point[0], &point[1], &distance, &colpoint )) { - if (distance < closestdistance || closestdistance == -1) { - closestpoint = colpoint; - closestdistance = distance; - } + mid = colpoint; + terrainnormal = DoRotation(Object::objects[k]->model.Triangles[whichhit].facenormal, 0, Object::objects[k]->yaw, 0) * -1; + ReflectVector(&tipvelocity, &terrainnormal); + + bounceness = terrainnormal * findLength(&tipvelocity) * (abs(normaldotproduct(tipvelocity, terrainnormal))); + if (findLengthfast(&tipvelocity) < findLengthfast(&bounceness)) + bounceness = 0; + frictionness = abs(normaldotproduct(tipvelocity, terrainnormal)); + tipvelocity -= bounceness; + if (1 - friction * frictionness > 0) + tipvelocity *= 1 - friction * frictionness; + else + tipvelocity = 0; + tipvelocity += bounceness * elasticity; + + if (findLengthfast(&bounceness) > 1) { + int whichsound; + if (type == staff) + whichsound = footstepsound3 + abs(Random() % 2); + else + whichsound = clank1sound + abs(Random() % 4); + emit_sound_at(whichsound, mid, 128 * findLengthfast(&bounceness)); + } + tippoint += (mid - oldmid2) * (20 / (1 + (float)m * 10)); + } + } + else { + start = position; + end = tippoint; + whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); + if (whichhit != -1) { + hitsomething = 1; + closestdistance = -1; + closestswordpoint = colpoint; + point[0] = DoRotation(Object::objects[k]->model.getTriangleVertex(whichhit, 0), 0, Object::objects[k]->yaw, 0) + Object::objects[k]->position; + point[1] = DoRotation(Object::objects[k]->model.getTriangleVertex(whichhit, 1), 0, Object::objects[k]->yaw, 0) + Object::objects[k]->position; + point[2] = DoRotation(Object::objects[k]->model.getTriangleVertex(whichhit, 2), 0, Object::objects[k]->yaw, 0) + Object::objects[k]->position; + if (DistancePointLine(&closestswordpoint, &point[0], &point[1], &distance, &colpoint)) { + if (distance < closestdistance || closestdistance == -1) { + closestpoint = colpoint; + closestdistance = distance; } - if (DistancePointLine(&closestswordpoint, &point[1], &point[2], &distance, &colpoint )) { - if (distance < closestdistance || closestdistance == -1) { - closestpoint = colpoint; - closestdistance = distance; - } + } + if (DistancePointLine(&closestswordpoint, &point[1], &point[2], &distance, &colpoint)) { + if (distance < closestdistance || closestdistance == -1) { + closestpoint = colpoint; + closestdistance = distance; } - if (DistancePointLine(&closestswordpoint, &point[2], &point[0], &distance, &colpoint )) { - if (distance < closestdistance || closestdistance == -1) { - closestpoint = colpoint; - closestdistance = distance; - } + } + if (DistancePointLine(&closestswordpoint, &point[2], &point[0], &distance, &colpoint)) { + if (distance < closestdistance || closestdistance == -1) { + closestpoint = colpoint; + closestdistance = distance; } - if (closestdistance != -1 && isnormal(closestdistance)) { - if (DistancePointLine(&closestpoint, &position, &tippoint, &distance, &colpoint )) { - closestswordpoint = colpoint; - velocity += (closestpoint - closestswordpoint); - tipvelocity += (closestpoint - closestswordpoint); - position += (closestpoint - closestswordpoint); - tippoint += (closestpoint - closestswordpoint); - } + } + if (closestdistance != -1 && isnormal(closestdistance)) { + if (DistancePointLine(&closestpoint, &position, &tippoint, &distance, &colpoint)) { + closestswordpoint = colpoint; + velocity += (closestpoint - closestswordpoint); + tipvelocity += (closestpoint - closestswordpoint); + position += (closestpoint - closestswordpoint); + tippoint += (closestpoint - closestswordpoint); } } } } } + } //Terrain collisions whichhit = terrain.lineTerrain(oldposition, position, &colpoint); if (whichhit != -1 || position.y < terrain.getHeight(position.x, position.z)) { @@ -657,8 +690,7 @@ void Weapon::DoStuff(int i) whichsound = footstepsound + abs(Random() % 2); } emit_sound_at(whichsound, position, - findLengthfast(&bounceness) - * (terrain.getOpacity(position.x, position.z) > .2 ? 128. : 32.)); + findLengthfast(&bounceness) * (terrain.getOpacity(position.x, position.z) > .2 ? 128. : 32.)); if (terrain.getOpacity(position.x, position.z) < .2) { XYZ terrainlight; @@ -711,8 +743,7 @@ void Weapon::DoStuff(int i) whichsound = footstepsound + abs(Random() % 2); } emit_sound_at(whichsound, tippoint, - findLengthfast(&bounceness) - * (terrain.getOpacity(tippoint.x, tippoint.z) > .2 ? 128. : 32.)); + findLengthfast(&bounceness) * (terrain.getOpacity(tippoint.x, tippoint.z) > .2 ? 128. : 32.)); if (terrain.getOpacity(tippoint.x, tippoint.z) < .2) { XYZ terrainlight; @@ -768,10 +799,9 @@ void Weapon::DoStuff(int i) whichsound = footstepsound + abs(Random() % 2); } emit_sound_at(whichsound, mid, - findLengthfast(&bounceness) - * (terrain.getOpacity(position.x, position.z) > .2 - ? 128. - : 32.)); + findLengthfast(&bounceness) * (terrain.getOpacity(position.x, position.z) > .2 + ? 128. + : 32.)); } position += (mid - oldmid) * 20; } @@ -812,10 +842,9 @@ void Weapon::DoStuff(int i) whichsound = footstepsound + abs(Random() % 2); } emit_sound_at(whichsound, mid, - findLengthfast(&bounceness) - * (terrain.getOpacity(position.x, position.z) > .2 - ? 128. - : 32.)); + findLengthfast(&bounceness) * (terrain.getOpacity(position.x, position.z) > .2 + ? 128. + : 32.)); } tippoint += (mid - oldmid) * 20; } @@ -920,17 +949,17 @@ void Weapons::DoStuff() //Move int i = 0; for (std::vector::iterator weapon = begin(); weapon != end(); ++weapon) { - weapon->DoStuff(i++); + weapon->doStuff(i++); } } -void Weapon::Draw() +void Weapon::draw() { static XYZ terrainlight; static GLfloat M[16]; if ((frustum.SphereInFrustum(position.x, position.y, position.z, 1) && - distsq(&viewer, &position) < viewdistance * viewdistance)) { + distsq(&viewer, &position) < viewdistance * viewdistance)) { bool draw = false; if (owner == -1) { draw = true; @@ -958,8 +987,7 @@ void Weapon::Draw() Person::players[owner]->animTarget == swordgroundstabanim || Person::players[owner]->animTarget == knifethrowanim) && Person::players[owner]->animTarget == lastdrawnanim && - !Person::players[owner]->skeleton.free - ) { + !Person::players[owner]->skeleton.free) { drawhowmany = 10; } else { drawhowmany = 1; @@ -1008,29 +1036,29 @@ void Weapon::Draw() glEnable(GL_LIGHTING); switch (type) { - case knife: - if (!bloody || !bloodtoggle) - throwingknifemodel.drawdifftex(knifetextureptr); - if (bloodtoggle) { - if (bloody == 1) - throwingknifemodel.drawdifftex(lightbloodknifetextureptr); - if (bloody == 2) - throwingknifemodel.drawdifftex(bloodknifetextureptr); - } - break; - case sword: - if (!bloody || !bloodtoggle) - swordmodel.drawdifftex(swordtextureptr); - if (bloodtoggle) { - if (bloody == 1) - swordmodel.drawdifftex(lightbloodswordtextureptr); - if (bloody == 2) - swordmodel.drawdifftex(bloodswordtextureptr); - } - break; - case staff: - staffmodel.drawdifftex(stafftextureptr); - break; + case knife: + if (!bloody || !bloodtoggle) + throwingknifemodel.drawdifftex(knifetextureptr); + if (bloodtoggle) { + if (bloody == 1) + throwingknifemodel.drawdifftex(lightbloodknifetextureptr); + if (bloody == 2) + throwingknifemodel.drawdifftex(bloodknifetextureptr); + } + break; + case sword: + if (!bloody || !bloodtoggle) + swordmodel.drawdifftex(swordtextureptr); + if (bloodtoggle) { + if (bloody == 1) + swordmodel.drawdifftex(lightbloodswordtextureptr); + if (bloody == 2) + swordmodel.drawdifftex(bloodswordtextureptr); + } + break; + case staff: + staffmodel.drawdifftex(stafftextureptr); + break; } glPopMatrix(); @@ -1103,7 +1131,7 @@ int Weapons::Draw() glDepthMask(1); for (std::vector::iterator weapon = begin(); weapon != end(); ++weapon) { - weapon->Draw(); + weapon->draw(); } return 0; }