]> git.jsancho.org Git - lugaru.git/blobdiff - Source/Objects/Weapons.cpp
Applied clang-format on all files
[lugaru.git] / Source / Objects / Weapons.cpp
index 5ef40e6ff08e47d17a8963419f2eed0e32c659f9..42ee250786c0356cf0a2d8c11bdaf75343d41163 100644 (file)
@@ -23,8 +23,8 @@ along with Lugaru.  If not, see <http://www.gnu.org/licenses/>.
 #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"
@@ -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.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;
-                        }
+            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;
@@ -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.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;
+                                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.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;
+                    }
+
+                    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.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;
-
-                                    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.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;
+                                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<Weapon>::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<Weapon>::iterator weapon = begin(); weapon != end(); ++weapon) {
-        weapon->Draw();
+        weapon->draw();
     }
     return 0;
 }